我正在为 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/