内存访问违规是导致HardFault的最常见原因,其本质是处理器试图访问一个不允许访问的地址或以不允许的方式访问内存。Cortex-M3处理器具有精细的内存映射机制,将地址空间划分为多个不同特性的区域,每个区域都有特定的访问权限。
野指针 (Wild Pointer/Dangling Pointer) 问题在C语言开发中尤为常见。未初始化的指针变量包含随机值,解引用这类指针相当于随机地址访问。更隐蔽的是”释放后使用”问题,在使用动态内存分配的系统中最常见,内存块被释放后,指向它的指针未置为NULL,后续再次使用该指针会导致访问已释放内存。指针计算错误也会导致问题,如错误的指针算术运算使指针远远超出目标数组或结构的范围。
数组越界 (Array Out-of-Bounds) 访问是另一类常见的内存访问违规。向大小有限的数组边界外写入数据会破坏相邻内存区域的关键数据。栈上的数组越界会覆盖函数的栈帧中的返回地址、帧指针或其他局部变量,导致函数返回时跳转到非法地址。全局变量区的数组越界则会破坏其他全局变量或数据结构,导致程序逻辑混乱。值得注意的是,数组读取越界虽然可能不会立即引发故障,但读出的无效数据参与运算后,可能导致后续的逻辑错误。
访问非映射地址 (Access to Unmapped Address) 是直接导致BusFault的常见原因。Cortex-M3的地址空间中有大量未分配区域,向这些区域进行读写操作会立即触发总线错误。外设未初始化就访问其寄存器也是常见错误,在启用外设时钟前访问其寄存器,总线无法完成操作,会触发错误。执行非代码区的数据同样危险,当程序指针因栈溢出或函数指针错误指向数据区或外设区时,CPU试图将这些数据当作指令执行,结果往往是执行了未定义指令或非法地址访问
|
|