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.

[参考译文] CCS/TMS320F28377S:编译器权变措施建议

Guru**** 2456500 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/727740/ccs-tms320f28377s-advice-for-compiler-workaround

器件型号:TMS320F28377S

工具/软件:Code Composer Studio

我遇到了编译器优化问题:

  MEM                =  (SBLOCK_t *)((memblocks->memoryAddress + memblocks->size);  
  MEM->memoryAddress = 10;

问题在于内存地址(UINT32_T)未分配。  当它为 uint16_t 时、工作正常。

几个小时后拆卸后、我认为我发现了问题:

编译器正在重新排列这行代码。 问题在于,在分配内存之前,mem->memoryAddress 未知。

那么、如何防止这种情况发生呢? 那么、如何在继续之前强制编译器分配内存。

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我 可以添加 NOP 来防止优化、这确实很好。 只有这样才能解决问题:

    给我带来问题的代码行:

    41    mem->memoryAddress = 10;

    088b31: D008    MOVB     XAR0、#0x8

    088b32: 020A    MOVB     ACC、#10

    088b33: 1E94    MOVL     *+XAR4[AR0]、ACC

    088b34: 7700    NOP      

    执行此代码的结果:

    MEM->memoryAddress unsigned long 0x00000000 (十六进制) 0x0000D4E7@数据

    XAR4寄存器0x0000D4DF 寄存器 XAR4

    XAR0寄存器0x00000008寄存器 XAR0   

    ACC 寄存器0x0000000A 寄存器 ACC

    可以有人帮助我执行以下指令吗: MOVL     *+XAR4[AR0]、ACC

    我假设它是*(XAR4 + OR0)=(uint32_t) ACC =>*(0xD4DF + 0x08)= 0x10 =>*(0xD4E7)= 0x10

    当断点位于 nop 位置时、只有内存位置0xD4E7的结果为0? 那么、怎么了?

    为了便于比较、此工作正常:

    //更改了形式 uint32_t uint16_t

     41       mem->memoryAddress = 10;
    088b15:  56BF0AFC   MOVB        *+ XAR4[7]、#0x0a、UNC
    088b17:  7700       NOP        

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    MOVL 指令(以及任何一次性访问32位存储器的其他指令)假定地址是偶数的、而不是像0xD4E7这样的奇数地址。 因此、编译器会将所有32位宽的存储器对象与偶数地址对齐。

    当您编写一个表达式时,如...

    MEM =(SBLOCK_t *)((memblocks->memoryAddress + memblocks->size); 

    (笑声) 您有责任确保符合对齐要求。  我怀疑这项任务并非如此。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    乔治

    感谢您的回答。  为什么我没有获得 非法地址/指令异常?

    谢谢、

    EV

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我很确定 CPU 不支持这样一个异常。  如果您想进一步了解、我建议您在 C2000器件论坛中开始新的主题。 或者、如果您愿意、我可以将此主题移至该论坛。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不、唯一让我感到惊讶的是、我可以使用正确的汇编器指令、以便结果与预期的不同。 TI 认为这是完全可以的。 这无法在 C 级进行调试。 如果没有你们的帮助、我就不会解决这个问题。