c - 对齐与打包属性

标签 c attributes embedded structure memory-alignment

我正在为 16 位 PIC 开发固件并用 C(Microchip C30 编译器)编写。我的设备从外部设备接收到一长串字节,然后我试图将这些字节复制到一个结构中。结构定义如下:

typedef struct __attribute__((__packed__)) {
    char    F1Nickname[17];
    char    F2Nickname[17];
    DWORD   F1CurrentPos;
    DWORD   F2CurrentPos;
    WORD    F1CurrentTemp;
    WORD    F2CurrentTemp;
    DWORD   F1MaxPos;
    DWORD   F2MaxPos;
    BYTE    F1TempCompOn;
    BYTE    F2TempCompOn;
    BYTE    CheckSum;
} deviceStatus;

我遇到了一个奇怪的问题,每当结构中的字节总数为奇数时,我的程序就会卡住并陷入 AddressError 服务例程。我可以通过简单地向结构添加一个额外的字节来解决这个问题,但这似乎是一个创可贴修复。

我将 packed 属性放在结构上,因为我想确保编译器不会在我的变量之间插入任何填充字节。如果发生这种情况,从接收到的字符数组复制过来时,我的结构中的值将不正确。

我知道还有一个属性叫aligned。 aligned 只是将结构的开头对齐到偶数字节还是将结构中的每个项目对齐到偶数字节?你认为这里需要 aligned 属性吗?如果我将 aligned 属性添加到这个结构中,我也应该将它添加到发送数据的设备上的结构中,对吗?截至目前,它们的定义方式与上面所示完全相同。

如果我添加了 aligned 属性,我应该删除 packed 属性吗?他们基本上不做相反的事情吗?

最佳答案

__attribute____packed__ 不是 C 标准的一部分,而是您的编译器提供的扩展。确定它们的含义的唯一方法是在编译器文档中查找。

关于c - 对齐与打包属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7025965/

相关文章:

c - C 数组中第二最少出现的元素

c - 编写一个工作代码来打印非常非常大的数字的阶乘需要多长时间

c++ -/usr/bin/ld : cannot find/usr/lib64/libasan. so.0.0.0 在 redhat 上

ruby-on-rails - ActiveRecord : Attributes protected by default. 它们如何公开?

c# - 如何使用属性向 C# 类添加可见信息?

c++ - 使用旧 GLIBC 版本检测堆栈溢出

运行gprof后计算MIPS?

java - 没有找到适合 println 的方法... Java

linux - ps -e、rss 与 vsz 的结果

c - 安装AVR开发平台for mac时架构x86_64错误