【问题标题】:How to get proper offset address in structure如何在结构中获得正确的偏移地址
【发布时间】:2015-12-14 10:00:28
【问题描述】:

我在单个结构下定义所有寄存器,并将其大小作为偏移量访问,如下所示。

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 字节大小的虚拟数组。

【问题讨论】:

  • 没有把虚拟数组放在那里?否则你的问题很不清楚。它是如何跳过 12 位的?
  • Ty Sami ......这是字节而不是比特......你现在有我的问题......清楚吗?
  • 你可以为结构体的每个变量分别赋值,如 REGP-> E1000_CTRL = , REGP->E1000_CTRL_DUP = ...等
  • 不幸的是,它仍然不清楚。你从哪里得到这些值?这个结构有什么用?为什么不想浪费 12 字节的内存?它是否在某个地方使用了数千次,所以很重要?
  • 如果您使用单个调用将值分配给 REGP,那么您最好使用虚拟变量。

标签: c memory struct structure


【解决方案1】:

由于您呈现的结构似乎要覆盖在某些现有内存或设备映射上,因此我们无法真正更改它。但是如果你的意思是你想在复制这些数据时节省内存,你当然可以“克隆”没有不必要的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.
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 2011-03-03
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    相关资源
    最近更新 更多