mrcn 发表于 2023-12-12 22:20:35

STM32F4上,RT-Thread5.0.2内核无法启动,无法进入PendSV中断【求助】

与代码应该没有关系,此前在另外的板子下正常运行过,今天换了另外一块板子,发现系统就无法启动了,串口打印内核版本号后系统表现为卡死。

进入调试环境下后,手动暂停CPU,发现CPU运行在0x1fff0000段,是STM32的原厂DFU,是正常情况下不应该进入的地址。



从Reset_Handler开始单步跟踪,发现问题。

在rtthread_startup函数中,最后会调用rt_system_scheduler_start启动调度器;在确定接下来应该执行的任务后,调用rt_hw_context_switch_to触发PendSV。

理应在这时应该进入PendSV,并在PendSV中切换到相关Thread,脱离前期运行状态。

此时,相关用来屏蔽中断的寄存器位已经全部取消。



并且,PendSV也的确进入了Pend状态;



但是并未进入PendSV_Handler,而是继续往下执行到了“never goes here”的地方,并通过bx lr,回到了rtthread_startup函数。(在上上图,可看到LR是0x0804f6b1,即rtthread_startup的末尾)





此时的SP是0x20001d80,读取后发现附近都是空的,都是0,因此pop pc后,CPU跳转到了0x0,并进入了STM32的DFU模式。

并且发现一个更加奇怪的现象,把电源开关一下后,就可以运行正常了。但是在此时按键复位,就又再也没法正常运行了。然后断开电源再重新上电,又能正常运行。


并且在进入这种状态后,在IAR或者MDK的调试模式内,不论是软件复位还是调试器硬件复位,还是在板子上人工按键复位,PC的指针都是直接指向0x1fff0000段了,就不再进入用户flash了。

复位电路就是最简单的RC复位,附加了一个按键可以直接拉低复位引脚。


重复了好多次后上电,突然一下这个问题就消失了,断开电源再重新上电后,再怎么按按键来复位,也不再出现这个现象了。



疑问:为什么相关寄存器都正常的前提下,CPU就是不进中断呢?没有思路了,希望有大神看到了能点拨一二。。


eric2013 发表于 2023-12-13 08:26:16

帮顶。
页: [1]
查看完整版本: STM32F4上,RT-Thread5.0.2内核无法启动,无法进入PendSV中断【求助】