打印

STM32 pendSV 的疑问

[复制链接]
8724|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
airwill|  楼主 | 2010-4-12 09:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人最近 STM32 上想玩一下 DIY RTOS.
由 pendSV 来完成任务现场切换.

现在的问题是, 由软件仿真来运行是, pendSV 异常服务能够在设置悬起后的立即执行.
而硬件仿真时发现并非如此, pendSV 异常服务要在设置悬起后的不知道啥时候才会执行到.

环境: STM32F107VC / JLINK v8 / Keil RV 3.5 版
沙发
lxyppc| | 2010-4-12 13:13 | 只看该作者
一般是把pendSV设置为低优先级,所以如果在其它中断中设置PendSV,则PendSV要等的其它的中断执行完之后才会执行

使用特权

评论回复
板凳
airwill|  楼主 | 2010-4-13 08:28 | 只看该作者
同意楼上的观点, 您说的是对的.
不过我的问题是, 发现已经进入 thread 模式了还是没有运行 PendSV 服务.
我打开 Peripherals->Core Perihperals-> NVIC 窗口.
Pend System Service 里, E,P 栏都为1

使用特权

评论回复
地板
ShakaLeo| | 2010-4-13 08:44 | 只看该作者
PendSV要在打开中断的环境下才能响应,如果Thread模式既没有屏蔽中断,也没有屏蔽异常,那么设置悬起PendSV却不响应就没道理了,先排除是硬件问题,我觉得硬件问题的可能性不大。

使用特权

评论回复
5
lxyppc| | 2010-4-13 09:35 | 只看该作者
还有一个问题,就是你是如何观察到“在硬件环境下pendSV不知道在什么时候才会执行”这个现象的
会不会是你的观察方式所引入的不确定性

使用特权

评论回复
6
airwill|  楼主 | 2010-4-13 10:19 | 只看该作者
这个问题是发生在单步跟踪的状态下, 跟踪好多好多步, pendSV 就是不出来服务.
可是我直接在 PendSV 的服务入口设置断点, 却能够在全速运行时 抓到 PendSV 的服务

使用特权

评论回复
7
lxyppc| | 2010-4-13 10:32 | 只看该作者
哦,那你试试全速运行反转IO,通过IO的变化来观察
不要用调试器的功能

使用特权

评论回复
8
airwill|  楼主 | 2010-4-13 11:23 | 只看该作者
从 PendSV 的断点, 检查堆栈中的地址, 倒是确实在执行 PendSV 悬起的地址后面, 郁闷.
楼上的办法我已经使用, 但是在我这样复杂的系统里, 没有调试器, 实在太困难了

使用特权

评论回复
9
lxyppc| | 2010-4-13 11:42 | 只看该作者
对了,你只会在Thread模式中设置PendSV吧,你可以试试把PendSV设置为最高优先级,看看是否能立即进入
如果还是不能立即进入,那就要怀疑调试器是否做了什么动作了

如果PenSV不容易调试,可能想想有没有其它的办法,比如用一个不用的外设中断来虚拟PendSV

使用特权

评论回复
10
airwill|  楼主 | 2010-4-13 12:17 | 只看该作者
不使用仿真器, 全速运行反转IO, 借助示波器来观察执行的时间关系. 这办法对于调试 RTOS, 真会成为噩梦的!
在PendSV 服务里, 我看了堆栈中的断点地址, 却是在 执行悬起 pendSV 的指令后面, 难道被 JLINK 愚弄了?

使用特权

评论回复
11
ShakaLeo| | 2010-4-13 12:22 | 只看该作者
在PendSV的入口点断点,单步运行也运行不到断点吗? 以前我也曾经发现过用JLINK单步调试和全速运行时的运行顺序有点不同,至今没搞明白是什么原因,推测是JLINK选项里的一些设置的问题。

使用特权

评论回复
12
airwill|  楼主 | 2010-4-13 15:25 | 只看该作者
to:楼上, 是单步跟踪不能进入 PendSV 服务程序
to:9楼, 在Thread模式和 Handle 模式都有 设置悬起 PendSV. 也没有设置优先级, PendSV和其他都是优先级 0 . 用 ULINK 也有这样的问题.

使用特权

评论回复
13
ShakaLeo| | 2010-4-13 15:57 | 只看该作者
楼主用PendSV切换任务,单步运行不能进入PendSV,那么单步运行时,该切换任务的时候能切换吗?不会是单步运行的时候一直在一个任务里运行吧。我的意思是,也许是单步的时候,进入PendSV这个步骤没有显现出来,或者单步用step into试试,别用step over.

使用特权

评论回复
14
airwill|  楼主 | 2010-4-14 08:56 | 只看该作者
To:楼上. 我的单步是用step into 的,而且是在 disasamble 窗口里进行的.
最新进展, 昨晚我改用以前的 ULINK1 调试, 发现能够正常进入 PendSV 服务, 看来真的让 JLINK 这个调试器给"调试"了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

556

主题

17727

帖子

885

粉丝