关于ucos任务调度的问题,嵌入式高手进

书上说,一个任务在执行过程中,如果创建了一个新的优先级更高的任务,那马上就要跳到那个任务执行,但有的书上说,一个任务到另一个任务的切换,主要是靠OSTimeDly()之类... 书上说,一个任务在执行过程中,如果创建了一个新的优先级更高的任务,那马上就要跳到那个任务执行, 但有的书上说,一个任务到另一个任务的切换,主要是靠OSTimeDly()之类的延时函数来实现。一会儿又是中断调度切换,一会儿又是函数调度切换,脑子模糊了,求高手给我梳理下任务和任务之间调度切换的知识,怎么切换的,最好归类,还有OSTimeDly这个函数是怎么执行的,执行到什么时候才切换任务?

其实我也看了邵贝贝翻译的UCOS,但感觉那书只是个手册,讲的非常简略,原理是理解了,软件的应用细节还没有参透,而且对于我这种硬件出生的人,也无法理解每个函数的注释,毕竟只有一点点操作系统原理的基础。。。求高手了! 小弟跪谢!
展开
 我来答
樱信全无YX
2012-10-13 · TA获得超过630个赞
知道小有建树答主
回答量:323
采纳率:100%
帮助的人:243万
展开全部
从内核角度讲:
简化的(忽略一些细节),UCOS启动时会创建一个idle的任务,这个任务是最低优先级的,且不会被删除。调用OSTaskCreate可以创建新的任务,系统维护了一个任务列表(TCB)。

任务有休眠(可以理解成已经被从任务列表中删除的任务),等待,Ready,运行 4种状态(书上不是这么说的,但可以这么理解,等待状态可能有多种原因造成)
系统在中断处理函数中执行任务调度过程,执行优先级最高的,处于ready状态的任务。调度成功后此任务从ready变成运行状态。如果没有任何任务可以调度,那么idle这个任务就会运行。

从编程角度讲:
1. 硬件中断产生会导致调度,例如I/O中断,这个不需要细说。
2. 在当前任务中调用OSTaskCreae创建新任务,会导致一个系统的内核调用,会产生一个模拟中断,因为系统在中断处理时执行任务调度,所以如果新任务的优先级比当前的大,新任务会立刻被运行。
3. 调用OSStart会导致一个系统的内核调用,会产生一个模拟中断,因为系统在中断处理时执行任务调度,所以优先级最高的,处于ready状态的任务会被执行。
4. 调用OSTimeDly可以将当前任务改成等待状态,设置等待的时间,然后会导致一个系统的内核调用,会产生一个模拟中断。所以另一个优先级最高的,处于ready状态的任务会被执行;在系统的时钟中断中会在等待时间到了之后把任务改成ready状态。
5. OSSemPend、OSMboxPend,OSQPend等函数调用也会导致当前任务改成等待状态,然后会导致一个系统的内核调用,会产生一个模拟中断。所以另一个优先级最高的,处于ready状态的任务会被执行;这个等待状态必须在收到wakeup的信号才能解除。
6. 修改任务优先级也可以引起调度。
实际的硬件中断对应的系统调度函数是OSIntExt,其他软件模拟调度的函数是OSSched。

UCOS的调度原理总体来说非常简单,因为没有时间片概念和优先级反转的问题。
UCOS有很多优化或者定制版本,大多在调度上会有自己的修改,请注意。
追问
这位兄台回答得好,再问一下,如果一个任务是个死循环,比较长,在运行过程中没有产生外中断,也没有遇到可以产生调度的系统函数,那么它会一直执行吗? 不会被一直产生的定时器节拍中断打断?谢谢

还有OSTimeDly,执行这个函数的时候,是要延时后才进行任务调度,还是延时的同时就进行任务调度? 谢谢
追加20
追答
关于第一问:
即使定时器中断调度,但由于此时此任务仍然是最高优先级的,所以还是此任务运行。

第二问:
是先调度,此时调用了OSTimeDly的任务已经变成等待状态,不会参与调度了。
然后timer的中断会计数,直到此任务的延时结束才会把这个任务变成ready状态参与调度,如果此任务是最高优先级,则此任务就会立刻执行。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式