收藏官网首页
查看: 19212|回复: 3

自动生成的代码,编译报错。

3

主题

10

帖子

98

积分

注册会员

Rank: 2

积分
98
跳转到指定楼层
楼主
发表于 2017-10-5 15:18:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
汉枫LPB120模块


这个是什么原因?

3

主题

10

帖子

98

积分

注册会员

Rank: 2

积分
98
沙发
 楼主| 发表于 2017-10-5 21:21:42 | 只看该作者
自问自答
举个例子:

struct {
    char a;    //1byte
    int b;    //4byte
    char c[2]    //2byte
    double d;    //8byte
}Struct_A;
在计算机内存中,结构体变量的存储通常是按字长对齐的,比如8位机里就按字节对齐,那么上述结构体共占用1+4+2+8=15byte。
在16位机里,变量就按照2字节对齐,比如a这个成员,虽然是个char类型,地址在0x80000000本身只占1字节,但是下一个成员b却不能使用0x80000001这个地址,而必须使用0x80000002,这就是按字长对齐。以上结构体占用的空间也就是2+4+2+8=16字节
同理,在32位机中,如果a在0x80000000的话,b只能放在0x80000004,因为这里的字长是4个字节。以上结构体占用空间4+4+4+8=20字节
也就是说总有一些字节是浪费掉的,这样做的目的很简单,就是因为在大多数计算机体系结构中,对内存操作时按整字存取才能达到最高效率,相当于是以空间换取时间。当然在某些计算机体系结构中,比如ARM,是支持非对齐字传输的,也就是说变量并不一定要按照字长对齐,尽管这样可能会降低效率,但换来的是存储空间上的节约。对于程序员来讲,则需要将结构体**为紧凑型结构体。**的关键字依编译器不同而异,你可以去查一下__packed关键字,可以得到更详细的说明。使用紧凑型结构体,则会强制编译器将结构体成员按1字节对齐,则以上结构体占用空间仍为15字节

3

主题

10

帖子

98

积分

注册会员

Rank: 2

积分
98
板凳
 楼主| 发表于 2017-10-5 21:23:48 | 只看该作者
如果移植到其他MCU平台不支持  __packed  怎么办?  很简单   #define  __packed   
定义为空宏即可。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表