rtos 强制跳出HardFault_Handler
时间: 2023-11-28 17:44:39 浏览: 135
FreeRTOS 中断优先级嵌套错误引发HardFault异常解决
5星 · 资源好评率100%
根据提供的引用内容,我们可以得知在CM3中,硬fault是一种系统异常,而且有多种类型。如果想要强制跳出HardFault_Handler,可以使用以下方法:
```c
// 定义一个函数指针
typedef void (*pFunction)(void);
// 定义一个函数,用于获取堆栈指针
__asm uint32_t get_PSP(void)
{
MRS R0, PSP
BX LR
}
// 定义一个函数,用于获取堆栈底部地址
uint32_t get_stack_bottom(void)
{
uint32_t stack_bottom = 0;
uint32_t stack_size = 0;
uint32_t psp_value = 0;
// 获取堆栈指针
psp_value = get_PSP();
// 获取堆栈大小
stack_size = *(uint32_t *)psp_value;
// 计算堆栈底部地址
stack_bottom = psp_value - stack_size + 4;
return stack_bottom;
}
// 定义一个函数,用于强制跳出HardFault_Handler
void jump_to_app(void)
{
uint32_t app_addr = 0;
pFunction Jump_To_Application;
// 获取应用程序的起始地址
app_addr = *(volatile uint32_t *)(0x08000000 + 4);
// 判断应用程序地址是否合法
if ((app_addr & 0x2FFE0000) == 0x20000000)
{
// 关闭所有中断
__disable_irq();
// 设置堆栈指针
__set_MSP(*(volatile uint32_t *)0x08000000);
// 跳转到应用程序
Jump_To_Application = (pFunction)app_addr;
Jump_To_Application();
}
}
// 定义HardFault_Handler函数
void HardFault_Handler(void)
{
uint32_t stack_bottom = 0;
// 获取堆栈底部地址
stack_bottom = get_stack_bottom();
// 判断是否需要跳转到应用程序
if (*(volatile uint32_t *)stack_bottom == 0x12345678)
{
jump_to_app();
}
// 此处可以添加其他处理代码
}
```
以上代码中,我们定义了一个函数指针pFunction,用于指向应用程序的起始地址。然后我们定义了一个get_PSP函数,用于获取堆栈指针。接着我们定义了一个get_stack_bottom函数,用于获取堆栈底部地址。最后我们定义了一个jump_to_app函数,用于跳转到应用程序。在HardFault_Handler函数中,我们首先获取堆栈底部地址,然后判断是否需要跳转到应用程序,如果需要就调用jump_to_app函数跳转到应用程序。
阅读全文