针对TI MSP430的嵌入式C进行单元测试。单元测试在使用GCC编译的Linux主机上运行。该项目相当大,主要是遗留代码。
存在对诸如PCIN_L,PCOUT_L和PCDIR_L等寄存器的读写操作,这些寄存器在编译时将产生错误,表示它们未被声明。这是真的,因为在主机上运行时不存在这样的寄存器。
之前我学会了拦截对不可用的函数(符号)的调用,并将调用重定向到伪函数,只返回预定义的值。我使用链接器选项-Wl --wrap,someSymbol
。
Makefile:
LDFLAGS=-Wl --wrap,AbsentFunction
SOURCES=WrappedFunctions.c
WrappedFunctions.c:
int __wrap_AbsentFunction(int val_a)
{
return val_a;
}
这会将对AbsentFunction
的任何调用重定向到__wrap_AbsentFunction
。不过,我确实在寄存器上尝试了这一点,祝你好运。
Makefile:
LDFLAGS=-Wl --wrap,PCDIR_L
SOURCES=WrappedSymbols.c
WrappedSymbols.c:
char __wrap_PCDIR_L;
是否有可能像我对函数那样对寄存器进行类似的操作?我不想在项目代码中引入更改。
您可以通过创建包含声明的“伪”处理器头来简单地将内存映射处理器外设寄存器声明为易失性数据:
extern volatile uint16_t PCDIR_L ;
它们当然不会像外设寄存器那样,但它可以构建代码。
更好的方法是构建硬件抽象层,以便外围访问通过功能API而不是直接访问硬件,然后您可以创建模拟硬件行为的“假”API。
MSP430器件的寄存器名称均在器件特定的头文件中声明。虽然您不一定能够轻易模仿这些寄存器的行为,但您可以编写自己的等效文件,将寄存器映射到程序可访问的存储器位置。
模仿端口寄存器,串口状态寄存器和其余部分的按位功能将是一项艰巨的任务。