说说我对uCOS-II任务调度的理解,大家看看对不,不对请指教

2019-07-20 22:20发布

OS:uCOS-II

以前我一直认为是一个任务只要在运行,只有中断才可以打断它继续运行;但是最近测试发现只要比它优先级高的任务都可以打断它继续运行。只要高优先级的任务满足运行的条件,不管低优先级任务是否在运行,它都可以打断它来抢先运行自己。


总结:
1、中断可以打断任何任务而抢先运行,不管任务是否在运行都没有关系,即中断来了它就要使用CPU
2、高优先级的任务只要满足运行的条件,不管低优先级的任务是否在运行都没有关系,即使低优先级任务在运行,高优先级任务也可以打断它【类似中断的现象】而运行自己


这样理解对吗?不对请指点
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
49条回答
stayhungry
1楼-- · 2019-07-23 11:11
天山狐狸 发表于 2016-5-5 16:14
哈哈,今天测试了下没有中断情况下,高优先级打断正在运行的低优先级任务的情况,事实证明确实如我楼主位 ...

顶19楼的前辈说的话~

因为Systick handler本身是一个中断服务程序,一般的话每1ms会进入一次,然后退出这个中断的时候(就是运行OSIntExit();时候)会触发一次任务切换。
天山狐狸
2楼-- · 2019-07-23 14:26
 精彩回答 2  元偷偷看……
天山狐狸
3楼-- · 2019-07-23 14:50
来俩不甜的 发表于 2016-5-6 11:25
我觉得是在systickhandler里面进行任务切换了,高优先级任务怎么可能会打断低优先级任务呢。

应该就在滴答定时器中判断并做的任务切换。另:抢占型OS就需要这样,永远是高优先级的任务先运行

下面是滴答定时器中断中的代码
[mw_shl_code=applescript,true]void  SysTick_Handler (void)
{
  #if OS_CRITICAL_METHOD == 3u
    OS_CPU_SR cpu_sr;
  #endif

  OS_ENTER_CRITICAL();
  OSIntNesting++;
  OS_EXIT_CRITICAL();

  OSTimeTick();                               /*  Call uC/OS-II's OSTimeTick()*/

  OSIntExit();
}[/mw_shl_code]
特朗姆斯
4楼-- · 2019-07-23 17:40
 精彩回答 2  元偷偷看……
来俩不甜的
5楼-- · 2019-07-23 22:14
特朗姆斯 发表于 2016-5-8 22:04
我有一个疑问

假设systick的中断间隔是10ms,所有的任务执行一遍至多需要4ms。那么在没有滴答定时器中 ...

不会,任务在4ms后执行完毕,必须要调用一个延时 或者等待信号量等可以引起任务调度的函数,若在此之前高优先级任务就绪了则在此之后就会运行此高优先级任务,否则进入空闲任务
特朗姆斯
6楼-- · 2019-07-24 01:49
来俩不甜的 发表于 2016-5-9 09:23
不会,任务在4ms后执行完毕,必须要调用一个延时 或者等待信号量等可以引起任务调度的函数,若在此之前高 ...

那么如果假设当前正在运行的低优先级任务总共需要占用2ms的运行时间,然后这个任务运行到1ms之后高优先级的任务突然来了,是否会打断正在运行的低优先级任务?

一周热门 更多>