中科因仑“3+1”工程特种兵精英论坛

标题: 在MDK中 定义结构体出现“空洞”问题的解决办法 [打印本页]

作者: liliuyang    时间: 2016-5-30 17:03
标题: 在MDK中 定义结构体出现“空洞”问题的解决办法
在MDK中 定义结构体出现“空洞”问题的解决办法

白话的说:如果结构体里面除了u8外还有u16等大于一个char的类型,那么里面元素地会出现不连续---我们叫做空洞现象

查标准:
  ANSI C规定
      ANSI C规定一种结构类型的大小是它所有字段的大小以及字段之间或字段尾部的填充区大小之和。
      填充区就是为了使结构体字段满足内存对齐要求而额外分配给结构体的空间。
      那么结构体本身有对齐要求,ANSI C标准规定结构体类型的对齐要求不能比它所有字段中要求最严格的那个宽松,可以更严格。


现象出现:
比如这个结构体
typedef struct
{                        
    u8 jing[4];                        
    u8 wei[4];                                                   
    u16 direction;                             
    u16 high;                             
    u8 satellite;                             
    u8 mile[4];                           
}GpsRealTimeDataStruct;

GpsRealTimeDataStruct temp;


我们如果想把这个结构体里的各个元素都复制到数组gpsSendRealTimebuffer里,以下这样做是不行的
u8 i;
u8 gpsSendRealTimebuffer[17];
u8 *ps=&temp. jing[0];
for(i=0;i<17;i++){
    gpsSendRealTimebuffer[ i]=*ps;
    ps++;
}


//解决办法:MDK里有个关键字 __packed 修饰结构体中的某个域,被修饰的域以压缩的方式存储。
typedef __packed struct
{                        
    u8 jing[4];                        
    u8 wei[4];                                                   
    u16 direction;                             
    u16 high;                             
    u8 satellite;                             
    u8 mile[4];                           
}GpsRealTimeDataStruct;

我们如果想把这个结构体里的各个元素都复制到数组gpsSendRealTimebuffer里,以下这样做就是可行的了
u8 i;
u8 gpsSendRealTimebuffer[17];
u8 *ps=&temp. jing[0];
for(i=0;i<17;i++){
    gpsSendRealTimebuffer [ i]=*ps;
    ps++;
}

因为有了 __packed的修饰,它会起到压缩数据的功能,它是牺牲了时间(执行效率可能会降低),节省了空间(RAM)






欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) Powered by Discuz! X3.4