9984|9

6

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求助关于CCS5.2编译器结构体按字节对齐 [复制链接]

是这样的,我想定义一个共用体如union data
{
char buff [100];
strcut shuju
{
int aa;
char bb;
int ee;
.....
.....
}data;
}
现在我把接收到的数据转换后存到data里边;然后我就想直接将buff发送出去(因为是共用体,所以buff和data共用相同内存)
但是由于结构体不是按字节对齐的,导致数据和buff对应不上;使得接收到的数据不正确,在CCS5.2编译器里如何让结构体按
字节对齐呢,网上找了很久都没有解决办法。哪位大神知道怎么解决呢




最新回复

为了便于处理器寻址,数据的存储一般都有这样的限制。 数据的排列顺序一般在制定协议的时候需要考虑。 下面有些我常用的方法,不知道你适不适用,不是解决问题,只是为了便于编程。 (1)无法按照从大到小的顺序排列的数据域,可以在定协议的时候加上占位字节,比如 int aa; char bb; char rsv[n]; //n的大小取决于机器字节宽度,也就是编译器默认的对齐宽度; int cc; (2)无法更改协议的,结构体的定义只能使用字节作为数据域的单位,如 char aa[4]; char bb; char cc[4]; 发送端结构体变量赋值时和接收端结构体成员取值时使用宏定义。 #define SET_MEMBER_32(m, v)  \              m[0] = (v>>0)&0xFF;\              m[1] = (v>>8)&0xFF;\              m[2] = (v>>16)&0xFF;\              m[3] = (v>>24)&0xFF; #define SET_MEMBER_16... 同样定义GET_MEMBER_16 GET_MEMBER_32  详情 回复 发表于 2015-11-2 22:29
点赞 关注
 

回复
举报

2549

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
这个思路可以实现么
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

板凳
 
有个地方我能提醒楼主下,其余的我帮不了你。就是
strcut shuju{
int aa;
char bb;
int ee;
.....
.....
}data;
这里面int aa;
char bb;
int ee;
的顺序与结构体的字节对齐有关系。
顺序不一样会导致结构体的所占用的内存的大小不一样。
前段时间我也刚好是碰到这个问题。
附件的word档,是我当时看网页还是资料我忘记了,我给摘录下来了。 结构体对齐.docx (329.29 KB, 下载次数: 68)

 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

4
 
huaiqiao 发表于 2015-10-26 12:32
有个地方我能提醒楼主下,其余的我帮不了你。就是
strcut shuju{
int aa;
char bb;
int ee;
.....
.. ...

这个我有VC++6.0测试了确实和顺序有关,
比如:strcut shuju{
char a;
char b;
int c;
};
strcut shuju1{
char a;
int c;
char b;
};
shuju占8个字节,shuju1占12个字节;在VC++6.0中可以用#program pack(参数)命令解决,可是CCS5.2编译器不支持。比较揪心,

点评

你这两种情况下,是的不一样。这个问题,你去TI的http://www.deyisupport.com/这个网站可以发帖子,问问。好像是TI的工程师回答问题的。  详情 回复 发表于 2015-10-29 22:14
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

5
 
数码小叶 发表于 2015-10-26 11:51
这个思路可以实现么

实现前提是解决内存对齐方式,不然数据对不齐

点评

我问的是纯C语言考虑实现不了吧  详情 回复 发表于 2015-10-30 08:00
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

6
 
lqw1314 发表于 2015-10-29 21:28
这个我有VC++6.0测试了确实和顺序有关,
比如:strcut shuju{
char a;
char b;
int c;
};
strcut  ...

你这两种情况下,是的不一样。这个问题,你去TI的http://www.deyisupport.com/这个网站可以发帖子,问问。好像是TI的工程师回答问题的。
 
 
 

回复

2549

帖子

0

TA的资源

五彩晶圆(初级)

7
 
lqw1314 发表于 2015-10-29 21:30
实现前提是解决内存对齐方式,不然数据对不齐

我问的是纯C语言考虑实现不了吧
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

8
 
lqw1314 发表于 2015-10-29 21:30
实现前提是解决内存对齐方式,不然数据对不齐

理论上应该是可以实现的,你觉得为什么不能实现呢
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

9
 
huaiqiao 发表于 2015-10-29 22:14
你这两种情况下,是的不一样。这个问题,你去TI的http://www.deyisupport.com/这个网站可以发帖子,问问 ...

很不错的网站,谢谢分享
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

10
 
为了便于处理器寻址,数据的存储一般都有这样的限制。
数据的排列顺序一般在制定协议的时候需要考虑。
下面有些我常用的方法,不知道你适不适用,不是解决问题,只是为了便于编程。

(1)无法按照从大到小的顺序排列的数据域,可以在定协议的时候加上占位字节,比如
int aa;
char bb;
char rsv[n]; //n的大小取决于机器字节宽度,也就是编译器默认的对齐宽度;
int cc;
(2)无法更改协议的,结构体的定义只能使用字节作为数据域的单位,如
char aa[4];
char bb;
char cc[4];
发送端结构体变量赋值时和接收端结构体成员取值时使用宏定义。
#define SET_MEMBER_32(m, v)  \
             m[0] = (v>>0)&0xFF;\
             m[1] = (v>>8)&0xFF;\
             m[2] = (v>>16)&0xFF;\
             m[3] = (v>>24)&0xFF;

#define SET_MEMBER_16...

同样定义GET_MEMBER_16 GET_MEMBER_32
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表