我拦截了对微控制器寄存器的调用

时间:2014-07-09 14:28:49

标签: c embedded cpu-registers intercept

针对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;

是否有可能像我对函数那样对寄存器进行类似的操作?我不想在项目代码中引入更改。

2 个答案:

答案 0 :(得分:0)

MSP430器件的寄存器名称均在器件特定的头文件中声明。虽然您不一定能够轻易模仿这些寄存器的行为,但您可以编写自己的等效文件,将寄存器映射到程序可访问的存储器位置。

模仿端口寄存器,串口状态寄存器和其余部分的按位功能将是一项艰巨的任务。

答案 1 :(得分:0)

您可以通过创建包含声明的“假”处理器头来简单地将内存映射处理器外设寄存器声明为易失性数据:

extern volatile uint16_t PCDIR_L ;

它们当然不会像外设寄存器那样,但它可以构建代码。

更好的方法是构建硬件抽象层,以便外围访问是通过功能API而不是直接访问硬件,然后您可以创建一个模仿硬件行为的“虚假”API。