将 TI 链接器命令文件与 Clang 结合使用
Using TI Linker Command File with Clang
当使用 TI (Texas Instrument) 编译器时,我可以通过简单的 ADC12IFG = 50;
使用 C++ 设置嵌入式微控制器的内存位置。 Clang 将此代码标记为错误:indirection requires pointer operand ('int' invalid)
。因此,当我深入研究它时,TI 有一个头文件 msp430f5335.h,其中包含以下几行:
#define SFR_16BIT(address) extern volatile unsigned int address
SFR_16BIT(ADC12IFG); /* ADC12+ Interrupt Flag */
然后是一个链接器命令文件,msp430f5335.cmd,其中包含以下行:
ADC12IFG = 0x070A;
因此看起来链接器命令文件指定了 address
。那么有没有可能让clang分析工具识别链接器命令文件而不导致误报呢?
Clang 旨在与 GCC 兼容。
TI的头文件(msp430-gcc-support-files
)使用以下机制定义内存映射寄存器变量:
#define sfrw_(x,x_) extern volatile unsigned int x asm(#x_)
#define sfrw(x,x_) sfrw_(x,x_)
#define ADC12IFG_ 0x070A /* ADC12+ Interrupt Flag */
sfrw(ADC12IFG, ADC12IFG_);
(这不需要链接器命令文件。)
当使用 TI (Texas Instrument) 编译器时,我可以通过简单的 ADC12IFG = 50;
使用 C++ 设置嵌入式微控制器的内存位置。 Clang 将此代码标记为错误:indirection requires pointer operand ('int' invalid)
。因此,当我深入研究它时,TI 有一个头文件 msp430f5335.h,其中包含以下几行:
#define SFR_16BIT(address) extern volatile unsigned int address
SFR_16BIT(ADC12IFG); /* ADC12+ Interrupt Flag */
然后是一个链接器命令文件,msp430f5335.cmd,其中包含以下行:
ADC12IFG = 0x070A;
因此看起来链接器命令文件指定了 address
。那么有没有可能让clang分析工具识别链接器命令文件而不导致误报呢?
Clang 旨在与 GCC 兼容。
TI的头文件(msp430-gcc-support-files
)使用以下机制定义内存映射寄存器变量:
#define sfrw_(x,x_) extern volatile unsigned int x asm(#x_)
#define sfrw(x,x_) sfrw_(x,x_)
#define ADC12IFG_ 0x070A /* ADC12+ Interrupt Flag */
sfrw(ADC12IFG, ADC12IFG_);
(这不需要链接器命令文件。)