C如何基于struct的结构

时间:2014-05-14 17:55:54

标签: c struct

我试图编写一些处理寄存器接口的代码。寄存器接口是通用的,并且在我正在使用的芯片上使用。有几种不同类型的实例,它们使用寄存器接口的子集。

我想知道,在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?

1 个答案:

答案 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.