硬汉嵌入式论坛

 找回密码
 立即注册
查看: 470|回复: 1
收起左侧

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

[复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2023-12-12 22:20:35 | 显示全部楼层 |阅读模式
与代码应该没有关系,此前在另外的板子下正常运行过,今天换了另外一块板子,发现系统就无法启动了,串口打印内核版本号后系统表现为卡死。

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

c9a7720b206e650480cac3f9f7610032.png

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

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

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

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

al61a-tlce0.png

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

4b0d95fff51ac4634b81afa97330dc8a.png

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

1ff4202704d6782a98bd3c62fdaf71e9.png

84a6c1696ecbd37485b65e4b5d283c66.png

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

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


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

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


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



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


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2023-12-13 08:26:16 | 显示全部楼层
帮顶。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 21:00 , Processed in 0.227270 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表