我正在使用嵌入式CPU,需要编写用于验证整个系统的C测试。要检查的一件事是访问系统中的所有寄存器。
我已经使用struct(区分寄存器字段)和union(能够作为一个整体访问寄存器)的组合建模寄存器。 例如:
typedef unsigned long Uint32;
typedef volatile struct
{
volatile Uint32 Divider: 4; //3:0
volatile Uint32 Unused: 28; //31:4
}XClkRstDivBits;
typedef union
{
Uint32 all;
XClkRstDivBits bit;
}XClkRstDivRegs;
通过这种方式,我只能访问寄存器字段,或访问整个寄存器:
#define REG_ADDRESS 0x000A
volatile XClkRstDivRegs *ClkRstDivReg = (XClkRstDivRegs *) REG_ADDRESS;
ClkRstDivReg->all = 0xA5A5A5A5; //Access entire register
ClkRstDivReg->bit.Divider = 0x5;
我有一些以这种方式定义的寄存器,有些有几个字段,所有字段都分配不同。 注意“未使用”部分,大多数寄存器都有一些未使用或保留的位,这些位不会写入并读为零。
我想写一个可以从寄存器读取的宏,并检查寄存器上的数据是否等于我期望的数据。但是,我希望这个功能能够:
宏应如下所示:
#define READ_AND_COMPARE_REG(Reg, ExData, Rdata) ...
Reg是指向寄存器的指针; ExData是一个包含预期数据的无符号32位数据,但在未使用的位上没有掩码,Rdata是一个无符号的32位变量,用于存储来自寄存器的读数。
提前感谢所有人。