问题描述
近日(20240828)由于昨日(20240827)修复上一篇博客出现问题过程中,不小心运行了rm -r /*
指令,导致需要重装系统,但临时更换了另一块树莓派,但由于该树莓派架构为aarch64
,与原先架构armv7
不一致,导致相同代码运行过程中出现bus Error
,程序无法正常运行。
报错内容:
正常运行的树莓派架构:
问题成因
Bus Error(总线错误)
事实上,总线错误几乎都是由于未对齐的读或写引起的。它之所以称为总线错误,是因为出现未对齐的内存访问请求时,被阻塞(block)的组件就是地址总线。对齐(alignment)的意思就是数据项只能存储在地址是数据项大小的整数倍的内存上。在现代的计算机架构中,尤其是RISC架构,都需要数据对齐,因为与任意的对齐有关的有关的额外逻辑会使整个内存系统更大且更慢。通过迫使每个内存访问局限在一个cache行或一个单独的页面内,可以极大地简化并加速如cache控制器和内存管理单元(MMU)这样的硬件。
我们用地址对齐这个术语来陈述这个问题,而不是直截了当地说是禁止内存跨页访问,但它们说的是同一回事。例如,**访问一个8字节的double数据时,地址只允许是8的整数倍。**所以一个double数据可以存储于地址24,地址8008或32768,但不能存储于地址1006(因为它无法被8整除)。页和cache的大小都是经过精心设计的,这样只要遵守对齐规则就可以保证一个原子数据项不会跨过一个页或cache块的边界。
- 参考文章:C中的总线错误和段错误
MAVLINK协议
根据试验现象(通过MAVLINK
协议下达任务过程中,仅下达航点时,出现bus error
问题)和调试步骤定位到问题为下述代码中的mavlink_msg_gcs_set_waypoints_get_waypoint_l