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

问题描述 投票:0回答:2

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

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

c embedded cpu-registers intercept
2个回答
0
投票

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

extern volatile uint16_t PCDIR_L ;

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

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.