您好!
我想我在 MSP TI 编译器 v18.12.8.LTS 的代码生成中发现了一个错误。
我对端口引脚使用了一个 C++语言库、对端口使用一个 C++语言库来访问硬件寄存器。
在这种特殊情况下、I2C 总线的 SCL 和 SDA 引脚。
scl_.selectIoFunction();
sda_.selectIoFunction();
这两行将 IO 编程为正常 IO、 清除 PnSEL 寄存器中的一个位。
编译器生成以下代码:
124 void clrPortFunktion (uint16_t selectedpins){HWREG16 (baseAddress_+ OFS_PASEL)&&~selectedpins;}
017eb2:MOVA 0x0004 (R12)、R14
017eb6:MOVA @R14、R13
017eb8:MOV.W #0x000a、R15
017ebc:ADD.W 0x0004 (R13)、R15
017ec0:MOV.W R15、0x0000 (SP)
017ec4:MOV.W 0x0004 (R14)、R13
017ec8:Inv.W R13
017eca:MOVA 0x0000 (SP)、R15
017ece:and.W R13、0x0000 (R15)
124 void clrPortFunktion (uint16_t selectedpins){HWREG16 (baseAddress_+ OFS_PASEL)&&~selectedpins;}
017ef0:MOVA 0x0008 (R12)、R15
017ef4:MOVA @R15、R14
017ef6:MOV.W #0x000A、R10
017efa:ADD.W 0x0004 (R14)、R10
017efe:BIC.W 0x0004 (R15)、0x0000 (R10)
奇怪的是、编译器为这两条 C++行生成完全不同的代码、它们是相似的。
这两个都是同一个 clase 的实例。
并且为第一行生成的代码无法正常工作。 请参阅两条红线、编译器将计算出的地址与16位存储在堆栈上
然后将其重新加载到具有20位的寄存器中、这会导致随机行为、并对堆栈上的旧值进行描述。
我在编译器的勘误表中找不到这方面的解释。 这是已知问题吗?
如何避免?
感谢你的帮助