在某些情况下,写入某些特殊功能寄存器需要使用 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