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/TMS320F28035:在 ACC 和 P 寄存器上运行时将它们用作16位而不是32位

Guru**** 2535750 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/602126/ccs-tms320f28035-operation-on-acc-and-p-registers-used-them-as-16-bits-instead-of-32-bits

器件型号:TMS320F28035

工具/软件:Code Composer Studio

您好!

我在这部分代码中遇到问题:

静态空 sec_SetTmpErrorVariable (SEC_checkErrorType_e 错误、
       sec_tmpErrors_s * tmpErrorVar、uint16_t checkIndex、
       bool 自动重置错误)

   uint32_t mask;

   //重置错误的计算掩码
   MASK = 1UL <<((uint32_t)校验索引);
   MASK =~MASK;

mask 是 uint32_t 我尝试将每个元素强制转换为 uint32_t、但结果始终相同。

我希望线掩码=~mask 会更改所有位、但它只会更改16个低位。 我无法理解为什么。

这是错误代码:

  92       mask = 1UL <<((uint32_t)校验索引);
3f5aed:  0201       MOVB        ACC、#1
3f5aee:  563B       LSLL        ACC、T
3f5aef:  FF55       非         ACC
3f5af0:  FF5A       MOVL        P、ACC

当我处于调试模式时、ACC 和 P 寄存器都正常(0xFFFFFFFE)、但 MASK 不是(0x0000FFFE)。 在表达式窗口中、掩码地址是寄存器 PL。 为什么?

我使用编译器 v6.4.4。 我使用最新版本17.3.0执行此操作、结果是相同的。 使用 O2优化级别。

我在没有优化的情况下执行它、它运行良好。 那么,如何进行 O2优化级别呢?

提前感谢。

Helene

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

    Helene、

    您能否附加一个小型可重现测试项目来证明此问题? 我尝试将这些行添加到现有项目的主要功能中、但无法重现问题。 屏蔽也不在寄存器 PL 中。 我怀疑代码和构建选项的特定组合会引发此问题、因此、让测试用例生成该问题会非常有帮助。