ARM上遗留的位字段兼容性问题

ARM上遗留的位字段兼容性问题,arm,bit-fields,Arm,Bit Fields,我正在将PowerPC遗留代码移植到ARM上。最初的开发人员在一段非常重要的代码中使用了位字段。当我使用ARM工具链交叉编译时,我得到 warning: multiple accesses to volatile structure member because of packed attribute [- fstrict-volatile-bitfields] 这显然是由于位字段的压缩和偏移方式,这似乎与ARM工具链不兼容。我看到GCC发布了一个补丁,但它看起来并没有真正解决这个问题(我个

我正在将PowerPC遗留代码移植到ARM上。最初的开发人员在一段非常重要的代码中使用了位字段。当我使用ARM工具链交叉编译时,我得到

warning: multiple accesses to volatile structure member because of packed attribute [-  fstrict-volatile-bitfields]
这显然是由于位字段的压缩和偏移方式,这似乎与ARM工具链不兼容。我看到GCC发布了一个补丁,但它看起来并没有真正解决这个问题(我个人还没有尝试过这个补丁)

例如,位字段在头文件中定义

typedef struct
   {  
   T8    BitFieldOffset;     //current bit offset value
   Tsv32 Data; //extracted bit field (may be exp_golomb- unsigned or signed)
   }  __pack__ TExtractBits;
   Tn8* extractBitField (Tn8 *pBuf, TExtractBits *pExtractBits, T32 numFieldBits);
然后在.cpp中

TExtractBits teb;
teb.BitFieldOffset = 0;
pBuf = extractBitField(pBuf, &teb, 1); TimeCode_DropFrame = teb.Data;
pBuf = extractBitField(pBuf, &teb, 5); TimeCode_Hours = teb.Data;
pBuf = extractBitField(pBuf, &teb, 6); TimeCode_Minutes = teb.Data;
他们的方法是否聪明,可以使代码更跨平台友好?我想对这段代码做尽可能少的直接修改


感谢您的帮助

位字段在ARM中工作。显示一些代码。位字段似乎是结构的易失性成员的一部分,为了正确访问它,编译器需要生成对被视为易失性的区域的多重访问。它警告您可能会出现意外行为。正如斯塔克所说,代码将是一个很好的参考。位字段非常非常糟糕,永远不要使用它们,它们不可移植,不能在编译器之间,也不能在目标之间。您看到的是预期的,与ARM无关。添加了代码。提取的位字段数据被设置为易失性有符号长字符。我已经尝试将其类型更改为signed long和just long,这将删除编译器警告。但是,当程序在板上运行时,仍然会出现seg故障。