我试图编写一些处理寄存器接口的代码。寄存器接口是通用的,并且在我正在使用的芯片上使用。有几种不同类型的实例,它们使用寄存器接口的子集。
我想知道,在C中是否有某种方法可以使用主寄存器接口创建结构,然后将各种子集设置为只能访问其已使用的寄存器?
因此,例如,让我们调用不同的可能子集A,B和C.
寄存器界面可能如下所示:
OFFSET NAME NEEDED BY
0x00 -- CFG A B C
0x04 -- VERSION A B C
0x08 -- SIZE B C
0x0C -- TYPE A C
0x10 -- USER A
因此,使用相同的格式that ARM uses for their SCS register interface,我可以为master创建以下结构:
typedef volatile struct {
uint32 cfg;
uint32 version;
uint32 size;
uint32 type;
uint32 user;
} master_t;
该部分相对简单。但我很难想出一种方法来实现a_t,b_t和c_t类型,使其内容仍然指向正确的偏移,而不仅仅是在与上面完全相同的方法中创建单独的结构(这会使传播更改/错误修正非常痛苦;实际用例更像是master_t的50个寄存器。
基本上,我的最终目标是,如果你将a_t指向正确的内存地址,然后尝试编写会(例如)尝试访问a_t.size的代码,编译器就会抛出错误。有什么方法可以在C?
答案 0 :(得分:1)
也许是这样:
typedef struct
{
uint32 cfg;
uint32 version;
uint32 filler;
uint32 type;
uint32 user;
} SUB_A_T;
typedef struct
{
uint32 cfg;
uint32 version;
uint32 size;
} SUB_B_T;
typedef struct
{
uint32 cfg;
uint32 version;
uint32 size;
uint32 type;
} SUB_C_T;
typedef UNION
{
SUB_A_T a;
SUB_B_T b;
SUB_C_T c;
} MASTER_T;
访问:
MASTER_T master;
master.a.cfg = 1;
master.a.version = 2;
master.a.type = 3;
master.a.user = 4;
// master.a.size = 11 This line would cause a compiler error.
或者...
master.b.cfg = 10;
master.b.version = 20;
master.b.size = 30;
// master.b.type = 22 This line would cause a compiler error.
// master.b.user = 33 This line would cause a compiler error.
或者...
master.c.cfg = 100;
master.c.version = 200;
master.c.size = 300;
master.c.type = 400;
// master.c.user = 44 This line would cause a compiler error.