caicaptain2 发表于 2023-6-26 09:41:22

程序内跳转stm32的系统自带boot,为什么必须加__set_CONTROL(0)



做内部函数跳转到stm32系统自带的bootload地址为(0x1FFF0000)处,参考了csdn上的一些代码,总是不成功。
现象是,跳转成功,但是没有办法用stm32cubeprogram识别并连接。


后来,偶然看到一个示例中,在跳转前加了 __set_CONTROL(0);就成功了。 这是为什么呢?



eric2013 发表于 2023-6-26 10:50:08

在在 RTOS 工程,这条语句很重要,设置为特权级模式,使用 MSP 指针,然后跳转

caicaptain2 发表于 2023-6-26 13:23:45

eric2013 发表于 2023-6-26 10:50
在在 RTOS 工程,这条语句很重要,设置为特权级模式,使用 MSP 指针,然后跳转

不管用FreeRTOS,还是RTX,还是UCOS,还是threadX,都必须这一句代码吗?

eric2013 发表于 2023-6-26 15:01:55

caicaptain2 发表于 2023-6-26 13:23
不管用FreeRTOS,还是RTX,还是UCOS,还是threadX,都必须这一句代码吗?

是的,现在各种RTOS都是双栈用法,任务里面使用PSP,中断里面是MSP

yunqi 发表于 2023-6-28 15:53:20

本帖最后由 yunqi 于 2023-6-28 16:21 编辑

CONTROL 寄存器也是通过 MRS 和 MSR 指令来操作的:
MRS R0, CONTROL
MSR CONTROL, R0

yunqi 发表于 2023-6-28 15:57:33

Cortex-M3 处理器支持两种工作模式,线程模式和处理模式:
--在复位时处理器进入线程模式,异常返回时也会进入该模式。特权和用户(非特权代码能够在线程模式下运行。
--出现异常时处理器进入处理模式,在处理模式中,所有代码都是特权访问的

caicaptain2 发表于 2023-6-28 16:53:54

yunqi 发表于 2023-6-28 15:57
Cortex-M3 处理器支持两种工作模式,线程模式和处理模式:
--在复位时处理器进入线程模式,异常返回时也会 ...

stm32系统自带的bootload地址为(0x1FFF0000)处,不过也是一段固化的代码。

我的疑问是,这个代码并不会造成硬件fault之类的异常,为什么一定要设定为特权模式才能运行bootload?
似乎只是为了切换到复位后默认的MSP指针而已? 与特权等级无关?

yunqi 发表于 2023-6-29 09:13:51

caicaptain2 发表于 2023-6-28 16:53
stm32系统自带的bootload地址为(0x1FFF0000)处,不过也是一段固化的代码。

我的疑问是,这个代码并 ...

我猜测,是因为跳转后执行的Boot代码,要重新初始化,而这部门初始化的有些操作,需要特权模式才能执行。否则会报异常。

yunqi 发表于 2023-6-29 09:16:22

eric2013 发表于 2023-6-26 15:01
是的,现在各种RTOS都是双栈用法,任务里面使用PSP,中断里面是MSP

站长,你见过PSRAM存储器没?有推荐型号没。

eric2013 发表于 2023-6-30 09:34:58

yunqi 发表于 2023-6-29 09:16
站长,你见过PSRAM存储器没?有推荐型号没。

整理了三个厂家
页: [1]
查看完整版本: 程序内跳转stm32的系统自带boot,为什么必须加__set_CONTROL(0)