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