长话短说,我在C中使用了IAR编译器。
uint8_t packet[2048];
uint32_t* src = (uint32_t*)&packet[9];
uint32_t var = *src++;最后一条线会导致公共汽车故障。
uint8_t packet[2048];
uint32_t* src = (uint32_t*)&packet[9];
uint32_t var = 0xFE;
*src++;现在没有公共汽车故障。我可以在调试器中看到src指向我希望它指向的数据。增量--它按预期工作,但试图读取它会导致总线故障。
有什么帮助吗?
发布于 2016-05-25 20:30:40
这可能是,您的MCU需要读取32位整数,以对齐32位。
&packet[9]绝对不是32位对齐的,这就是为什么你会出错。
发布于 2016-05-25 22:11:19
对于&packet[9],uint32_t可能没有正确对齐。在ARM CPU上看到“总线错误”通常是对齐错误的标志。看这里用于解释对齐。
在第二个示例中,它可能通过优化*操作来避免总线故障,因为您从不使用结果。
请注意,即使您修复了这个问题,代码仍然会违反严格的混叠规则而导致未定义的行为。(uint8_t不能别名为uint32_t)。有些编译器目前看来“工作正常”,但代码在将来的任何时候都可能中断。
您的代码的安全等价物是:
uint8_t *src = &packet[9];
uint32_t var;
memcpy(&var, src, sizeof var);
src += sizeof var;注意,如果源数据被指定为具有整数的特定字节顺序(例如,您是从网络流中获取它,而不是前面通过同一方法保存的数据),那么您将希望使用一个方法来读取独立于uint32_t表示的数据。(换句话说,"endianness")。
https://stackoverflow.com/questions/37446831
复制相似问题