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.

[参考译文] MSP430F6726:生成的代码出现 MSP 问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1009353/msp430f6726-msp-issue-with-generated-code

器件型号:MSP430F6726

您好!

我想我在 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位的寄存器中、这会导致随机行为、并对堆栈上的旧值进行描述。

我在编译器的勘误表中找不到这方面的解释。 这是已知问题吗?

如何避免?

感谢你的帮助

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

    您好,

    您能否尝试使用最新的编译器版本、看看您是否仍然遇到此问题?

    此致、

    现金 Hao

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

    您好!

    我 尝试过 v21.6.0.LTS 编译器、代码稍有不同、但错误相同。

    void clrPortFunktion (uint16_t selectedpins){HWREG16 (baseAddress_+ OFS_PASEL)&&~selectedpins;}
    018976:0C3E 0004 MOVA 0x0004 (R12)、R14
    01897a:0E0D MOVA @R14、R13
    01897c:403F 000A MOV.W #0x000A、R15
    018980:5D1F 0004 ADD.W 0x0004 (R13)、R15
    018984:4F81 0000 MOV.W R15、0x0000 (SP)
    018988:013F 0000 MOVA 0x0000 (SP)、R15
    01898c:CE9F 0004 0000 BIC.W 0x0004 (R14)、0x0000 (R15)

    我发挥了一些作用、找到了一个解决方案:

    baseAddress_是 uint16_t、因为这些地址的声明如下:

    在头文件中#define __MSP430_BASEADDRESS_PORTA_R__ 0x0200。

    如果我将 baseAddress_更改为 uint8_t*,则生成的代码会有点复杂,但正确。

    感谢你的帮助