使用C struct和union

时间:2016-06-21 14:43:21

标签: c struct unions cpu-registers

我正在使用嵌入式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;

我有一些以这种方式定义的寄存器,有些有几个字段,所有字段都分配不同。 注意“未使用”部分,大多数寄存器都有一些未使用或保留的位,这些位不会写入并读为零。

我想写一个可以从寄存器读取的宏,并检查寄存器上的数据是否等于我期望的数据。但是,我希望这个功能能够:

  1. 处理所有登记册
  2. 将结果与预期结果进行比较时,自动归零或忽略未使用的位。
  3. 宏应如下所示:

    #define READ_AND_COMPARE_REG(Reg, ExData, Rdata) ...
    

    Reg是指向寄存器的指针; ExData是一个包含预期数据的无符号32位数据,但在未使用的位上没有掩码,Rdata是一个无符号的32位变量,用于存储来自寄存器的读数。

    提前感谢所有人。

0 个答案:

没有答案