完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
嗨,我正在做一个和SD卡通信的项目,数据是字节流,有时我需要分析字节,但有时需要解释为WORD或DWORD。在定义各自的数据结构之前,我决定通过XC16为结构和联合更新内存分配。在《编译器用户指南》(DS5000207)的第154页上,我遇到以下情况:这是一个结构,其中成员x被打包,因此它紧跟着一个,没有用于对齐的填充:struct foo{char a;int x[2]u.((packed))};所以如果结构foo被对齐n个单词边界,WORD的数组“x”将放在变量a旁边的存储器中,因此会得到一个奇数地址。通常,在像这样的情况下,编译器会添加一些额外的命令,以避免解决语句的错误,例如:但是,在上面的定义之后,文档给出以下注释:注意:设备架构要求单词在偶数字节边界上对齐,因此必须小心当使用packed属性以避免运行时寻址错误时,请注意。显然,XC16没有添加这些额外的命令来访问上面结构“foo”中的数组“x”!如果是这种情况,并且具有上面定义的结构“foo”,那么,“packed”属性对于正确访问数组“x”没有帮助,所以使用“int x[2]”实际上变得毫无意义,甚至更糟,可能变得危险。请帮助理解这段文档。谢谢,--Alex
|
|
相关推荐
4个回答
|
|
|
“打包”只是为了减少内存(RAM)的消耗-不完全是为了缓解你的生活!因此,按照升序排序变量的内存需求是很好的做法:dWord(s)-字(s)-字节(s)。因此,由于填充而造成的“损失”最小化。BTW:我不希望编译器适应打包变量的代码生成。也许有些人这样做,但大体上是这样。…用“打包”你声明你知道你在做什么,并关心适当的代码。
|
|
|
|
|
|
如果直接访问Stutt成员,编译器应该生成非对齐访问所需的指令。这在没有具体指令的情况下在架构上可能非常低效,所以应该尽可能避免。但是,如果间接访问,例如您将得到地址错误。
|
|
|
|
|
|
谢谢大家的评论!为了结束这个话题,我用下面的简单程序做了一个快速测试:然后查看生成的程序集代码——与语句对应的片段如下所示:我不知道PIC程序集,所以阅读,尤其是理解正在发生的事情对我来说是困难的。但是,我可以清楚地看到,如果对齐的话,这将需要更多的代码。此外,代码工作正常,不会产生地址异常。因此,我只是为自己确认,编译器确实插入了必要的代码来正确地操作未对齐的变量——只要它知道它们是未对齐的。谢谢!
|
|
|
|
|
|
代码太多了。一些指令就足够了。但是,如果它是对齐的,它只会是一个指令。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
473 浏览 0 评论
5793 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3530 浏览 3 评论
1124浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1097浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
873浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 07:53 , Processed in 0.660007 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
308