打印

求教UCOSII 问题

[复制链接]
2874|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yun123789|  楼主 | 2011-12-8 14:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
菜鸟向高手们请教:在UCOS II ,在一个时钟节拍内如果正在运行一低优先级任务,此时有一高优先级任务就绪,是否会产生任务切换呢?任务切换是在哪几种情况下,进行切换的啊? 谢谢!

相关帖子

沙发
john_lee| | 2011-12-8 17:26 | 只看该作者
会的。只要有比当前任务优先级高的任务就绪,调度器就会切换任务。

使用特权

评论回复
板凳
linuo| | 2011-12-9 08:13 | 只看该作者
怀疑2楼所说。注意“在一个时钟节拍内”。

使用特权

评论回复
地板
sjl2006| | 2011-12-9 16:08 | 只看该作者
可能会。任务切换的触发条件除了tick中断,还有其他类型中断,如串口中断、外部INT等。两个tick之间可能出现这些中断,取决于板子的硬件配置。同时,任务切换的触发条件除了中断,还有阻塞,这也可能在两个tick之间发生。总之,tick只是任务切换的一个条件,但不是充分必要条件。

使用特权

评论回复
5
john_lee| | 2011-12-10 00:32 | 只看该作者
怀疑2楼所说。注意“在一个时钟节拍内”。
linuo 发表于 2011-12-9 08:13

考你几个问题:如果所有任务都没有使用延时函数和pend的超时功能(调用*pend()函数时,timeout参数为0),那么系统节拍还有意义吗?把系统节拍定时器完全去掉(不调用OSTimeTick(),甚至把OSTimeTick()从os_core.c中删掉),系统还能运转吗?*post()还能唤醒被阻塞的任务吗?

使用特权

评论回复
6
漂亮阿姨| | 2011-12-10 19:07 | 只看该作者
毫无疑问,约翰·李是高手。没有时钟节拍的系统是可以运转的,不然不能叫做抢占式调度了。

使用特权

评论回复
7
Green_Hand| | 2011-12-10 19:57 | 只看该作者
印象中源码是这样的:当有优先级就绪。会出现一个判断是否高于低于当前优先级。高于的话,就切出去了。

使用特权

评论回复
8
llf021421| | 2011-12-12 20:54 | 只看该作者
4楼说的很对!!
总的来说,引起任务切换有二个方式:第一个是系统时钟引发中断进行切换,第二个个是任务调用延时函数,或者等待信号量或者等待邮箱引起的任务切换。
第一个是每一个时钟节拍利用调度器进行一个任务切换,第二个是随时都可以进行的,在一个时钟节拍内也是可以进行的。

使用特权

评论回复
9
李富贵| | 2011-12-12 21:01 | 只看该作者
4楼说的很对!!
总的来说,引起任务切换有二个方式:第一个是系统时钟引发中断进行切换,第二个个是任务调用延时函数,或者等待信号量或者等待邮箱引起的任务切换。
第一个是每一个时钟节拍利用调度器进行一个任务 ...
llf021421 发表于 2011-12-12 20:54


虽然四楼说得对,但是你说的并不对。
每个systick只是检查一下有没有到时间的OSTimeDly任务,以及Pend任务的超时,如果两者都没有,则什么都不干,如果有到时间的才会调度。

使用特权

评论回复
10
haitao10086| | 2011-12-15 09:50 | 只看该作者
路过

使用特权

评论回复
11
xinzha| | 2011-12-15 10:50 | 只看该作者
按照ucos文档的说法是在三种情况下任务切换代码会去检查是否有必要切换,
1、中断
2、时钟节拍到时
3、调用系统函数
而实际1和2都是由中断引发的,当系统定制好之后,时钟节拍是基本可预知的,而中断和调用系统函数的发生时间却是不可预知的,所以即使时钟节拍不到时一样有可能发生切换。

使用特权

评论回复
12
我是韩老五| | 2011-12-21 15:35 | 只看该作者
11楼说的很正确,任务切换事件发生在任务切换函数中,有任务切换函数的地方就应该可以切换任务

使用特权

评论回复
13
jiebin689| | 2012-2-22 10:01 | 只看该作者
一种情况是  任务调用延时函数时发生 任务调度
还有一种情况是 任务运行时,因为时钟节拍是由中断产生的而中断也会发生任务调度
所以任务运行时也会发生任务调度。

这样理解
对不?

使用特权

评论回复
14
madcool| | 2012-4-29 17:17 | 只看该作者
在ucosii中,任务切换又以下两个原因引起:1、任务主动释放CPU,比如任务睡眠,信号量等操作;2、CPU被剥夺,如另一个高优先的任务重新处于就绪状态。对于情况1,切换的时间点是由任务调用schedule函数决定的,对于情况2,一般伴随中断,由于ucosii系统托管了系统中断,在中断执行末尾会检查是否有高优先级的任务处于就绪状态,如果有就进行任务切换。tick其实也是中断的一种。所以总结一下,显式的调用shedule函数和在中断退出的时候都有可能引发任务切换

使用特权

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

本版积分规则

0

主题

2

帖子

1

粉丝