完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
|
|
……介绍了它自己的问题。例如,访问平台上的“值”成员可能会触发一个未对齐的访问错误,这取决于平台。
|
|
|
|
只要它是通过具有packed属性的类型访问的,编译器将使用字节加载和存储来访问字段。由于有性能命中,您可能不想使用频繁访问的结构类型的属性。此外,如果试图通过未修饰的指针访问字段(例如,正常的UIT16*T*指针),则会触发异常。属性语法也是GCC特定的,使代码不可移植。
|
|
|
|
真的?你用XC32和PIC32设备检查了吗?我做到了,我没有看到3。底线:注意听。你不可能总是得到你所期望的。尤其是,对于一种架构和那个平台的特定编译器的经验不一定要传给其他人。C语言本身故意忽略了硬件的内部工作(例如,内存访问),并且不能保证“打包”对于特定的编译器和引入其自身问题的特定体系结构能做什么。例如,根据平台,对上面“值”成员的访问可能触发未对齐的访问故障。问题是,打包实际上非常依赖于设备以及编译器的体系结构。(正如您在前一篇文章中提到的)但是……事实证明,XC32编译/链接过程至少足够正常,不会为PIC32设备创建带有这种声明的不对齐变量。行为可能不同于某些人的“预期”,但它不会创建运行时错误。至少它没有为我做这件事,正如我在这个例子中所展示的:PIC32MX170F256B使用XC32版本1.40、自由模式、优化级别1:sizeof(I2CDACMessage_t)=4sizeof(dac.)=8&dac.[0]、address=A000FFA8dac.[0]、address=0x12&dac.[0]、value=A000FFAAdac。.[0]=0x3456&dac.[0],unuse=A000FFA8dac.[0],unuse=0x12&dac.[0],msB=A000FFA9cac.[0],msB=0&dac.[0],lsB=A000FFAAdac.[0],lsB=56&dac.[1],address=A000FFACdac.[1]。值=0x9abc&dac.[1]。未使用=A000FFACdac.[1]。未使用=0x78&dac.[1]。msB=A000FFADdac.[1]。msB=0&dac.[1]。lsB=A000FFAEdac.[1]。联合中的cond结构并不符合某些人“预期”,给定联合中的第一个结构的成员。最后(我保证):在这个特定情况下(即,这些结构的联合、这个设备、这个编译器版本、这个编译器模式、这个编译器优化级别),填充的属性不做任何事情。(结果与原始、非包装、定义)相同,戴夫
|
|
|
|
填充属性不是递归应用的,所以它需要这个属性:现在只通过字节加载和存储(只要编译器知道属性)访问值字段:但是,正如我前面所说的,这样的代码很可能会崩溃:Access PtR函数DOES不知道指针是一个未对齐的值,并且将使用常规的半字加载和存储指令。
|
|
|
|
谢谢大家。尽管结构上的packed属性确实有效,但由于您的警告,我选择了一个简单的char[3],并且因为值的字节按照错误的顺序存储,以满足我的传输需求。
|
|
|
|
只有小组成员才能发言,加入小组>>
5203 浏览 9 评论
2016 浏览 8 评论
1942 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3188 浏览 3 评论
请问电源和晶体值之间有什么关系吗?PIC在正常条件下运行4MHz需要多少电压?
2243 浏览 5 评论
754浏览 1评论
641浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
549浏览 1评论
PIC Kit3出现目标设备ID(00000000)与预期的设备ID(02c20000)不匹配。是什么原因
653浏览 0评论
553浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-5 07:27 , Processed in 1.377772 second(s), Total 59, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号