【发布时间】:2021-07-28 15:05:48
【问题描述】:
我有一些旧代码(目标架构 armv5tejl 和 armv7l)声明了一个如下所示的结构:
#pragma pack(push,1)
struct modbus_pkt_s
{
uint8_t d_addr;
uint8_t cmd;
uint8_t payload[250];
uint8_t payload_length;
uint8_t pkt_length;
modbus_erc_t erc;
};
#pragma pack(pop)
其中 modbus_erc_t 是一个枚举:
typedef enum modbus_erc_e modbus_erc_t;
我还有一个函数可以计算 modbus 数据包的 CRC(它使用 d_addr、cmd 和 payload),它假设前三个结构字段被打包。
我想删除 #pragma 指令,因为我遇到了未对齐的内存访问问题(导致 SIGBUS)。
考虑到它们是无符号字符,我可以安全地删除那些#pragma 指令并假设前三个字段被打包吗?
【问题讨论】:
-
我会更改计算 CRC 的函数,使其不再依赖于要打包的那些字段。
-
当然可以,但我很乐意避免接触该代码。
-
试试看会发生什么。
-
它有效。但我正在寻找一种不受架构影响且能保证工作的解决方案。
-
该结构似乎用于通过不同设备之间的通信接口传输数据,所以不 - 不要删除打包的。而是确保接收器将数据放入正确对齐的数据结构中
标签: c struct alignment padding pragma