STM32使用RTOS BootLoader跳转app进入异常中断问题

588 阅读1分钟

一、问题描述

在boot中不使用RTOS,跳转到APP中,APP可以正常运行。但是boot中使用RTOS跳转到APP中,程序配置完时钟后就会进入MemManage_Handler错误中断。

二、解决方法

1.在跳转APP前加__set_CONTROL(0);就不会出错了,这个函数的功能就是把psp置回msp。

2.如果出现hardfault,或者调试看到程序跳到汇编程序的B指令上,可以查一下是否在boot中用到的中断没有关闭。

三、原因分析

1.加__set_CONTROL(0);的原因是使用操作系统后系统内核会使用PSP模式,跳转到APP后没有恢复到MSP模式就会导致内存异常从而进入到内存异常中断。

2.出现hardfault,或者调试看到程序跳到汇编程序的B指令上,是因为boot中开启了一些中断,而中断跳转到app前没有DISABLE掉这些中断而APP中又没有写中断服务函数,导致跳转到中断时找不到服务函数。

四、PSP与MSP

PSP与MSP的逻辑地址是相同的,都是R13,但确是不同的物理寄存器。不带操作系统时,中断和非中断都使用MSP;带操作系统的主函数和中断使用MSP而各个Task使用PSP。

五、为什么会有PSP与MSP

因为CPU和OS需要这种机制,这么做的好处就是隔离了应用程序和OS。程序的运行是需要堆栈的,堆栈的push和pop都是通过SP来实现的,然后这样就实现了应用程序和OS的隔离。Task用PSP,OS用MSP,这样就很安全,task怎么操作都不会影响到内核OS.