如何在结构中获得正确的偏移地址
How to get proper offset address in structure
我在单个结构下定义所有寄存器并访问其大小作为偏移量,如下所示。
typedef struct _REG_STRUC {
UINT32 E1000_CTRL // 0x00000
UINT32 E1000_CTRL_DUP //0x00004
UINT32 E1000_STATUS //0x00008
UINT32 E1000_EERD //0x00014
UINT32 E1000_CTRL_EXT //0x00018
UINT32 E1000_FLA //0x0001C
UINT32 dummy[3] //0x00020-0x00028
UINT32 E1000_FCAH //0x0002C
}*REGP;
正如你在上面看到的那样,我插入了一个虚拟数组来跳过 12 个字节。如果我只跳过这 12 个字节,我将获得 E1000_FCAH 寄存器的确切内存位置。据我所知,这是浪费内存。如何克服这一点。了解我
编辑:阅读 this thread 后,我了解了填充概念。我想通过将其用作偏移地址来访问 reg E100_FCAH 。因此,为了避免错误获取(由于 12 字节的间隙),我使用了大小为 12 字节的虚拟数组。
由于您呈现的结构似乎是要覆盖在某些现有内存或设备映射上,我们无法真正更改它。但是如果你的意思是你想在复制这个数据时节省内存,你当然可以 "clone" 没有不必要的 dummy
(和任何其他不必要的成员)的结构,并复制它:
typedef struct _PACKED_STRUC {
UINT32 E1000_CTRL // 0x00000
UINT32 E1000_CTRL_DUP //0x00004
UINT32 E1000_STATUS //0x00008
UINT32 E1000_EERD //0x00014
UINT32 E1000_CTRL_EXT //0x00018
UINT32 E1000_FLA //0x0001C
UINT32 E1000_FCAH //0x0002C
}*PACKEDP;
void copy_from_raw(REGP rawp, PACKEDP outp) {
outp->E1000_CTRL = rawp->E1000_CTRL;
// etc.
}
我在单个结构下定义所有寄存器并访问其大小作为偏移量,如下所示。
typedef struct _REG_STRUC {
UINT32 E1000_CTRL // 0x00000
UINT32 E1000_CTRL_DUP //0x00004
UINT32 E1000_STATUS //0x00008
UINT32 E1000_EERD //0x00014
UINT32 E1000_CTRL_EXT //0x00018
UINT32 E1000_FLA //0x0001C
UINT32 dummy[3] //0x00020-0x00028
UINT32 E1000_FCAH //0x0002C
}*REGP;
正如你在上面看到的那样,我插入了一个虚拟数组来跳过 12 个字节。如果我只跳过这 12 个字节,我将获得 E1000_FCAH 寄存器的确切内存位置。据我所知,这是浪费内存。如何克服这一点。了解我
编辑:阅读 this thread 后,我了解了填充概念。我想通过将其用作偏移地址来访问 reg E100_FCAH 。因此,为了避免错误获取(由于 12 字节的间隙),我使用了大小为 12 字节的虚拟数组。
由于您呈现的结构似乎是要覆盖在某些现有内存或设备映射上,我们无法真正更改它。但是如果你的意思是你想在复制这个数据时节省内存,你当然可以 "clone" 没有不必要的 dummy
(和任何其他不必要的成员)的结构,并复制它:
typedef struct _PACKED_STRUC {
UINT32 E1000_CTRL // 0x00000
UINT32 E1000_CTRL_DUP //0x00004
UINT32 E1000_STATUS //0x00008
UINT32 E1000_EERD //0x00014
UINT32 E1000_CTRL_EXT //0x00018
UINT32 E1000_FLA //0x0001C
UINT32 E1000_FCAH //0x0002C
}*PACKEDP;
void copy_from_raw(REGP rawp, PACKEDP outp) {
outp->E1000_CTRL = rawp->E1000_CTRL;
// etc.
}