程序内跳转stm32的系统自带boot,为什么必须加__set_CONTROL(0)
做内部函数跳转到stm32系统自带的bootload地址为(0x1FFF0000)处,参考了csdn上的一些代码,总是不成功。
现象是,跳转成功,但是没有办法用stm32cubeprogram识别并连接。
后来,偶然看到一个示例中,在跳转前加了 __set_CONTROL(0);就成功了。 这是为什么呢?
在在 RTOS 工程,这条语句很重要,设置为特权级模式,使用 MSP 指针,然后跳转 eric2013 发表于 2023-6-26 10:50
在在 RTOS 工程,这条语句很重要,设置为特权级模式,使用 MSP 指针,然后跳转
不管用FreeRTOS,还是RTX,还是UCOS,还是threadX,都必须这一句代码吗? caicaptain2 发表于 2023-6-26 13:23
不管用FreeRTOS,还是RTX,还是UCOS,还是threadX,都必须这一句代码吗?
是的,现在各种RTOS都是双栈用法,任务里面使用PSP,中断里面是MSP 本帖最后由 yunqi 于 2023-6-28 16:21 编辑
CONTROL 寄存器也是通过 MRS 和 MSR 指令来操作的:
MRS R0, CONTROL
MSR CONTROL, R0 Cortex-M3 处理器支持两种工作模式,线程模式和处理模式:
--在复位时处理器进入线程模式,异常返回时也会进入该模式。特权和用户(非特权代码能够在线程模式下运行。
--出现异常时处理器进入处理模式,在处理模式中,所有代码都是特权访问的 yunqi 发表于 2023-6-28 15:57
Cortex-M3 处理器支持两种工作模式,线程模式和处理模式:
--在复位时处理器进入线程模式,异常返回时也会 ...
stm32系统自带的bootload地址为(0x1FFF0000)处,不过也是一段固化的代码。
我的疑问是,这个代码并不会造成硬件fault之类的异常,为什么一定要设定为特权模式才能运行bootload?
似乎只是为了切换到复位后默认的MSP指针而已? 与特权等级无关? caicaptain2 发表于 2023-6-28 16:53
stm32系统自带的bootload地址为(0x1FFF0000)处,不过也是一段固化的代码。
我的疑问是,这个代码并 ...
我猜测,是因为跳转后执行的Boot代码,要重新初始化,而这部门初始化的有些操作,需要特权模式才能执行。否则会报异常。 eric2013 发表于 2023-6-26 15:01
是的,现在各种RTOS都是双栈用法,任务里面使用PSP,中断里面是MSP
站长,你见过PSRAM存储器没?有推荐型号没。 yunqi 发表于 2023-6-29 09:16
站长,你见过PSRAM存储器没?有推荐型号没。
整理了三个厂家
页:
[1]