原创 关于bitfiled的

2010-2-1 18:55 3113 5 5 分类: MCU/ 嵌入式
  前些日在VC下的一段代码需要移植到PPC上,利用codewarrior作为编译器,该部分程序主要涉及到一些位操作,而在这个过程中遇到一些小问题——VC下位域的位置与codewarrior下设定正好相反,如下: 
union{
uint8 bytes;
struct{
uint8 bit1 : 1; -- lsb in vc++6.0 & msb in cw for MPC55xx
...
uint8 bit7 : 1; -- msb in vc++6.0 & lsb in cw for MPC55xx }bits;
}Byte_tag;
  小查了下资料:
  cw for X12下位域以byte为单位分配,高于byte以每16位进行安排,最高32bits,每16位位序从上至下为msb->lsb,如下图:
748705c9-8f61-49f1-bb12-d87c72438afa.gif
  对比cw for MPC55xx下,默认情况下16位、32位均为msb->lsb安排,另外位域可以通过“#pragma has8bytebitfields on”选项扩展到64bits;可以利用“#pragma reverse_bitfields on”将位序进行反转(ms X12下没有这个选项)。
  
  ms有些规律,至少和大小端、CPU总线位数感觉还是有点关系的,不过,对于“位域”操作,位域在存储的位置与编译器是相关,如果应用对于位域在字节/字中的位置敏感的话,那么这样的程序在移植的过程中可能会遇到麻烦,这样反而利用宏定义来完成“位”的操作显得实惠得多。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /3 下一条