您好!
我正在为定制版本的 MSP430F149芯片开发程序、并面临以下问题:
有映射到0x104、0x106地址的外设器件(读取 FIFO)。 GCC 仅编译对其的首次访问、并优化所有其他访问。
我接下来尝试了:
[版本_0]
func.h:
uint8_t read_fifo (uint16_t * d_l、uint16_t * d_h);
func.c:
extern volatile uint16_t RFIFO_L; extern volatile uint16_t RFIFO_H; uint8_t read_fifo (uint16_t * d_l、uint16_t * d_h){ *d_l = RFIFO_L; *d_h = RFIFO_H; 返回0; }
main.c:
#include "func.h" int main (){ //停止看门狗 WDTCTL = WDTPW + WDTHOLD; uint16_t d[2]; while (1){ read_fifo (d、d + 1); if (d[0]= some 值0 && d[1]= anote_value0){ //进行一些处理 } 否则、如果(d[0]= some 值1 && d[1]= anote_value1){ //另一个处理处理 } }
/some/path/ti/msp430-gcc/include/msp430f149_symbols.ld:
//添加了两行
提供(RFIFO_L = 0x0104);
提供(RFIFO_H = 0x0106);
结果:只有 FIFO 的首次读取访问、它返回的值为预期值零、但没有任何其他访问(我希望它在关闭电源之前将读取 FIFO)。
[版本_1 ]
从 func.c 中删除 extern volatile 声明并将两行添加到/some/path/ti/msp430-gcc/include/msp430f149.h:
SFR_w (RFIFO_L); SFR_w (RFIFO_H);
结果:相同
[版本_2 ]
将/some/path/ti/msp430-gcc/include/msp430f149.ld 中的 SFR 条目长度修改为0x110地址:
SFR :origin = 0x0000、length = 0x0110
结果:相同
[版本_3]
恢复 MSP430F149_symbols.ld、MSP430F149.ld 和 MSP430F149.h、在 func.c 中添加了定义而不是 extern volatile:
#define RFIFO_L (*(volatile uint16_t *)(0x0104) )#define RFIFO_H (*(volatile uint16_t *)(0x0106))
结果:相同
我犯了什么错误、以及如何告知 MSPGCC 未优化对这些易失性变量的访问?
编译命令:
/some/path/ti/msp430-gcc/bin/msp430-elf-gcc -i/some/path/ti/msp430-gcc/include -mmcu=MSP430F149 -Wall -O0 -msmall -flto -fwrapv -mTina-printf -I./-L/some/path/ti/msp430-gwl/include -hex、-cc、test.map、-gc-sections、-mce-fice-gc、-gc、-gwl=m.c、-gwl.c、-g.c、-gwl.c、-g.c、-gwl.c、-g.c、-gv.
GCC 版本输出:
GCC 版本9.2.0 (Mitto Systems Limited - MSP430-gcc 9.2.0.50)
配置为:./../gcc/configure --target=MSP430-elf --enable-languages=c、c++--disable-NLS --enable-initfini-array --build=x86_64-PC-Linux-0.50 --host=x86_64-PC-Linux-GNU --enable-target-optspace --enable-newlib-nanime-icht-mctran-gichtsystems=msp4c.2-msp4c-限制格式化的 msp430-msp4c.2
Thread 模型:单个