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.

[参考译文] MSP430FR5969:GCC 和32位特殊功能寄存器

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1071384/msp430fr5969-gcc-and-32-bit-special-function-registers

部件号:MSP430FR5969

在某些情况下,写入某些特殊功能寄存器需要使用 Mova 指令。 例如,DMA 地址会进行注册。 我在看一个简单示例生成的代码,它看起来很糟糕:

  DMA0SA = &ADC12MEM0;
    443e:       8c 00 60 08     mova    #2144,  r12     ;0x00860
    4442:       00 18 4d 4c     movx.a  r12,    r13     ;
    4446:       0c 4c           mov     r12,    r12     ;
    4448:       0f 18 4d 11     rpt #16 { rrax.a        r13             ;
    444c:       82 4c 12 05     mov     r12,    &0x0512 ;
    4450:       82 4d 14 05     mov     r13,    &0x0514 ;

这是用"-mlar"编译的,但这一点没有什么不同。 两者都对 ADC12MEM0 (0x860)地址进行类似的密接,以使其在两个寄存器中成为两个16位值。 正确的值在第一个指令后的 R12中,一个简单的模量将完成作业。 (此操作只需要一个指令:"movx.a #0x860,&0x512"。)

用两个16位字写地址是错误的。 正如用户指南明确指出的那样,“阅读或书写第19-16位需要使用扩展指令。 使用字指令写入 DMaxSA 时,将清除位19-16。” 测试证实,将非零字写入0x514会导致其为零。 0x512未更改。

我使用含“-O2”的9.2版 GCC 进行编译。 我尝试升级到最新版本,但失败了。 它类似于7z 归档文件,但显示为空:

Scanning the drive for archives:
1 file, 41050906 bytes (40 MiB)

Listing archive: msp430-gcc-full-linux-x64-installer-9.3.1.2.7z

--
Path = msp430-gcc-full-linux-x64-installer-9.3.1.2.7z
Type = 7z
Physical Size = 41050906
Headers Size = 266
Method = LZMA2:48m LZMA:20 BCJ2
Solid = -
Blocks = 1

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
------------------- ----- ------------ ------------  ------------------------
                                     0            0  0 files

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

    你好,大卫

    我在 GCC 编译器环境方面没有太多经验。

    我可以看到"-O2"优化更多(O2)已设置。 我想知道如果我们将优化级别设置为0“无(O0):禁用优化”,是否会发生同样的问题

     

    谢谢!

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

    这一点无关紧要,因为头文件(iomacros.h)将 SFR_l 定义为无符号整数。 对于 C 编译器,无符号整数为32位。

    因此它将20位指针提升为32位整数(缓慢),然后将其存储为任何其他32位整数。 使用两个16位存储。

    我猜这不是一个大问题,因为它只会在写入 DMA 地址寄存器时导致错误,并且地址位于 FRAM 的上部。 否则,它只是效率极低的代码。