用户326326的组织
用户5442
添加快捷方式
分享
函数调用栈和fault analyzers
输入“/”快速插入内容
函数调用栈和fault analyzers
用户5442
1月15日修改
一、初始错误
1.错误类型
一般来说 错误类型就是以下四种 而最常见的是:Hardfault
在 ARM Cortex-M 系列处理器(如 STM32 芯片)中,
Hardfault
是一种
严重的系统故障异常
,当处理器检测到无法被其他异常(如总线故障、用法故障)处理的错误时,会触发该异常。以下是关于 Hardfault 的关键信息:
一、触发原因
Hardfault 的触发场景非常广泛,典型原因包括:
1.
内存访问错误
◦
数组越界(如
int arr[5]; arr[10] = 0;
);
◦
空指针 / 野指针解引用(如
int *p = NULL; *p = 10;
);
◦
栈溢出(局部变量过大、函数递归过深导致栈空间耗尽)。
2.
指令异常
◦
执行未定义的指令(如非法汇编指令、代码段被意外改写);
◦
特权级违规(如用户模式下访问特权寄存器)。
3.
硬件故障
◦
总线访问失败(如外设地址配置错误,访问不存在的硬件资源);
◦
外设异常(如 ADC、SPI 等外设配置冲突)。
4.
中断配置错误
◦
中断优先级配置非法(超出
0~15
范围);
◦
中断向量表未正确初始化(如向量地址无效)。
2. ARM Cortex-M 系列处理器寄存器
1.sp寄存器
•
SP_main(主堆栈指针,MSP)
:是默认的堆栈指针,用于
异常服务例程(如中断、系统调用)
、OS 内核以及需要特权访问的代码。系统复位后默认使用该堆栈。
•
SP_process(进程堆栈指针,PSP)
:用于
线程模式下的普通应用程序代码
(非异常场景)。在嵌入式操作系统中,不同任务可通过它维护独立堆栈,实现任务隔离。(在freertos下会用到)
2.LR与PC寄存器
1.
R14(连接寄存器,LR)
•
核心功能
:主要用于
保存函数调用、异常(中断、异常服务例程)发生时的返回地址
。
◦
当执行函数调用指令(如
BL
)时,LR 会自动存储调用指令的下一条指令的地址,函数执行完毕后可通过
BX LR
指令返回调用点。
◦
在异常(如中断、Hardfault)发生时,LR 会存储异常返回时需要恢复的指令地址,保障程序在异常处理完成后能正确回到原执行流程。