MDK 4.12 下结构体定义语法

转自: 船过水无痕    http://blog.csdn.net/liuyu60305002/article/details/6952274


最近在做移植时,遇到个问题,之前采用的IAR  STVD环境都没有问题,今天采用MDK 4.12,出现了问题,出现 'expected an identifier'警告。

  1. typedef struct _data  
  2. {  
  3.      u8 phy_id[8];  
  4.     u8 sec_id[6];  
  5.     u8 switch_s;  
  6.     union battery  
  7.     {              
  8.         u16 battery0; //高位字节填充整数部分,低位字节填充小数部分  
  9.         struct {  
  10.         u8 battery2; //电池部分的小数部分  
  11.         u8 battery1; //电池能量的整数部分  
  12.         };  
  13.     };  
  14.   
  15. }data;  
  16.  <pre name="code" class="cpp">typedef struct _message  
  17. {  
  18.   u8 cmd;  
  19.   struct _data data;  
  20.   u8 reserved;  
  21.   u16 ack;  
  22. }message;</pre>//message 的大小字节对齐为21个字节  
  23. <pre></pre>  
  24. <p>下图是不顾警告直接编译后动态调试时所看到的结构内容,明显的没有battery0的符号,后面证实,这里MDK没有给分配空间</p>  
  25. <p><img src="http://hi.csdn.net/attachment/201111/9/0_1320819835M9KV.gif" alt=""></p>  
  26. <p></p>  
  27. <p>(STVD 编译的STM8S程序)发送端填充结构体内容如下:</p>  
  28. <p></p>  
  29. <pre name="code" class="cpp">       msg.cmd = TAG_COORDINARY_CMD;  
  30.         seq++;  
  31.           
  32.         battery_h=3;  
  33.         _memcpy(&msg.data.phy_id[4],(char *)&seq,4);  
  34.         _memcpy(msg.data.sec_id,(char *)&seq,4);  
  35.         msg.data.switch_s = 0;  
  36.         msg.data.battery0 = battery_h << 8 | battery_l; //标签电压值  
  37.         msg.reserved = 0x36;  
  38.         msg.ack = 0xFFEE;</pre><br>  
  39. <p></p>  
  40. <p>(MDK 编译的STM32程序) 接收端接收后内容如下:</p>  
  41. <p><img src="http://hi.csdn.net/attachment/201111/9/0_1320820181p8qz.gif" alt=""><br>  
  42. </p>  
  43. <p>万恶的MDK啊,reserved 和ack的数值都是错误的。<br>  
  44. </p>  
  45. <p><br>  
  46. </p>  
  47. <p>非的改成这样才能编译通过:</p>  
  48. <p></p>  
  49. <pre name="code" class="cpp">typedef struct _data  
  50. {  
  51.      u8 phy_id[8];  
  52.     u8 sec_id[6];  
  53.     u8 switch_s;  
  54.     union   
  55.     {              
  56.         u16 battery0; //高位字节填充整数部分,低位字节填充小数部分  
  57.         struct {  
  58.         u8 battery2; //电池部分的小数部分  
  59.         u8 battery1; //电池能量的整数部分  
  60.         }batt;   
  61.     }battery;  
  62. }data;</pre>这样问题又来了,与原来的字节数比多了几个字节,估计是对齐导致的。这里是24个字节。  
  63. <p></p>  
  64. <p><br>  
  65. </p>  
  66. <p>最后是使用__packed进行修饰才正常,调试也通过</p>  
  67. <p></p>  
  68. <pre name="code" class="cpp">typedef __packed struct _data  
  69. {  
  70.     u8 phy_id[8];  
  71.     u8 sec_id[6];  
  72.     u8 switch_s;  
  73.     __packed union   
  74.     {             
  75.         u16 battery0; //高位字节填充整数部分,低位字节填充小数部分  
  76.         __packed struct {  
  77.         u8 battery2; //电池部分的小数部分  
  78.         u8 battery1; //电池能量的整数部分  
  79.         }batt;  
  80.     }battery;  
  81. }data;  
  82.   
  83.   
  84. typedef __packed struct _message  
  85. {  
  86.   u8 cmd;  
  87.   struct _data data;  
  88.   u8 reserved;  
  89.   u16 ack;  
  90. }message;</pre>  
  91. <p></p>  
  92. <p><img src="http://hi.csdn.net/attachment/201111/9/0_1320821881f1ix.gif" alt=""><br>  
  93. </p>  
  94. <p>总结:</p>  
  95. <p>MDK 4.12在处理联合体与结构体时,语法上与IAR STVD VS等工具的编译器有些出入。<br>  
  96. </p>  
  97. <p>MDK 4.12下编译STM32程序时,要注意结构体大小问题,默认是字对齐方式的。可使用__packed关键字修饰为字节方式对齐。<br>  
  98. </p>  
  99. <br>  
  100. <pre></pre> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值