This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我将编译以下行:
volatile uint32 *gpioDataReg;
。
。
。
gpioDataReg =(易失性 uint32 *)&GpioDataReg +(104/32)*GPY_DATA_OFFSET;
在上面的 gpioDataReg 指针应该为0x7F18、但看起来"plus"没有完成、我得到值0x7F00 ( GpioDataReg 的地址)。
为了解决这个问题、我将上述内容拆分为两行:
gpioDataReg =(易失性 uint32 *)&GpioDataRegs;
gpioDataReg +=(104/32)*GPY_DATA_OFFSET;
现在它起作用了。
我在这里错过了什么?
您好吗——您能告诉我们您使用22.6 C2000编译器构建代码时使用了哪些选项吗? 此外、如果您可以按照本文中的说明进行操作: 如何提交编译器测试用例 以提交可重现的测试用例、这将使我们更容易查看正在发生的情况。
谢谢!
e2e.ti.com/.../Compiler_5F00_Options.txt
e2e.ti.com/.../A2D.pp.txte2e.ti.com/.../assembly_5F00_image.jpg.txt
第22241行。
编译器版本:22.6.0 LTS
jpg 显示加载图像后它在内存中的外观。
嗯、当我编译预处理的测试文件进行汇编时、我看到以下情况:
;--------------------------------------------------------------
;22241 | gpioDataReg =(易失性 uint32 *)&GpioDataRegs +(104/32)*(0x8/2);
;--------------------------------------------------------------
MOVL XAR4、#||GpioDataRegs|+24;[CPU_ARAU]|22241|
您能否使用-s 进行编译并查看您是否看到此"+24"?
此外、当我反汇编目标文件时、我会看到:
00000022 $C$L10:
00000022 1e00 MOVL @0x0、ACC
00000023 8f00 MOVL XAR4、#0x000018
00000024 0018
尽管由于文件未链接、GpioDataRegs 的地址还没有值、但它明确地将24 (十六进制18)添加到其值0。
我在您的编译器标志中没有看到优化级别。 您是否正在进行优化编译?
我还看到了在链接器和加载映像之后的存储器中看到的+24 (或+0x18)、这是我在 jpg 文件中发送给您的内容(没有添加+24)。
由于 GpioDataReg 地址没有+0x18、图像运行。
链接器会已更新该地址以包含24。 为什么您认为地址不正确? 在哪里可以看到 GpioDataRegs 的基址?
GpioDataRegs 是 TI 文件 F2837xD_GlobalVariablesDefs.c 中定义的 TI GPIO 寄存器、其地址为0x7F00。
当我用+=拆分行时、我得到正确的结果0x7F18。
由于预处理测试用例中的代码生成似乎没有问题、因此链接器在计算直接地址时可能会出错。 我需要用于链接此项目的其余文件。 这是 CCS/SDK 项目吗? 或者、您能否提供剩余的目标文件(我不需要源文件)来链接它?
另一种考虑...的可能性 链接器发出正确的指令编码。 之后、其他一些东西会导致指令中的操作码更改为错误的值。 这不常见、但我已经看到它发生了。 要对此进行研究、请手动反汇编由链接器创建的最终链接.out 文件。 使用类似于...的命令
dis2000 final_executable_file.out > disassembly.txt
检查反汇编.txt。 您在问题地址0x009d78看到了什么? 这是你所期望的吗?
谢谢、此致、
乔治
不是我所期待的
不会像我之前发送的 jpg 中那样添加0x18。