为什么说ucos ii是可剥夺的内核。

学习自:http://blog.csdn.net/lovekwf/article/details/8215355


即当高优先级的任务由于时钟DLY被阻塞时,一个低优先级的任务正无限循环中。当更高优先级的任务时间片延时到0时,会剥夺低优先级任务的执行。笔者在ccs下挖根寻源,找到了它可以剥夺的原因。

在此前先要了解,Ucos是实时操作系统,CPU被用来按照一个Tick,一个Tick的去执行指令,而每一个Tick是由分频的定时器产生的,每一个Tick(嘀嗒)都会引起系统的一次中断, tick (an interrupt generated by a hardware timer at a fixed time interval),它的ISR是OSTimeTick();一个Tick会调用一次OSTimeTick(),该函数内部会对OSTime(全局变量)加一。

还要了解,TCBlist是一个双向链表,它的每一个元素是一个TCB(任务控制块),包含了每一个任务的堆栈,优先级大小,以及状态信息(比如被切换了几次),待延时的Tick数(OSTCBDLY),OSTCBStat(任务当前状态)等重要信息。中断处理函数中会遍历每一个TCB,并会将OSTCBDLY不为0 的任务的OSTCBDLY减一。当判断OSTCBDLY为0时,会更新OSRdyGrp(一个全局变量记录当前就绪任务),否则其OSTCBStat继续是阻塞的。

有这些认识,遗憾的发现没有在这个Tick中断服务程序中发现OSIntctxsw(),OSShed()调用。那么OS究竟是如何在有更高优先级进入就绪时,产生调度的呢?

用汇编跟踪,发现,所有的中断在服务开始的时候会调用OSIntEnter(),主要内容是增加嵌套调用的计数。而与之对应的是在所有中断服务结束之前,内核会调用OSIntExit()(在OS_Core.c中)。

这两个函数成对出现,在OSIntExit(),发现了OS_ShedNew();进入这个函数,终于发现,原来这个函数会计算所有目前就绪的任务的最高的优先级,并判断如果这个值和当前在执行任务的优先级是否相同,如果相同的话,就继续执行当前任务,否则OSIntTcxSw()做上下文切换。

切换就不用多说了,把任务的上下文切换,就是把R0-R12,LR,PC和SPSR等寄存器换成更高优先级的任务的上下文。


总结:每一次Tick中断都会引起中断,在中断退出时,会把切换到当前所有就绪的任务中最高优先级任务。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于UCOSII实时操作系统 第一讲 初识uCOSII 4 1、uCOSII单任务实验: 4 2、uCOSII多任务实验: 6 3、任务状态之间的转换: 9 4、空闲任务和统计任务简介: 9 5、任务的三要件: 9 程序代码、私有堆栈、任务控制块 9 6、任务控制块TCB(P80) 9 7、创建任务 9 8、任务的栈空间 10 9、栈的增长方向: 10 第二讲 调度运行机制 11 1、任务挂起和恢复 11 2、任务挂起、恢复的状态转换 13 3、时钟节拍ISR 15 4、时钟节拍函数OSTimtick() 16 5、延时系统调用 16 第三讲 任务管理uCOSII 17 1、任务删除 17 2、任务请求删除实验 19 3、在源码中增加打印信息一般步骤 24 4、OSTaskDelReq()函数理解流程图 25 第四讲 互斥性信号量管理 26 1、优先级反转 26 2、信号量SEM使用 26 3、互斥信号量Mutux使用 29 4、关于信号量程序分析 32 5、关于互斥信号量分析 32 6、OSMutexPend()函数流程图 33 7、OSMutexPost()函数流程图 33 第五讲 消息邮箱 34 1、基本概念 34 2、对于OSMboxPend()理解 34 3、对于OSMboxPost()理解 34 4、消息邮箱管理一般程序 35 5、使用OSMboxQuery() 38 6、OSMboxPend()函数Timeout等待超时程序 38 7、OSMboxPost()函数邮箱状态为FUll程序 40 8、关于OSTimeTickHook(void)使用 41 第六讲 信号量集 43 1、信号量集案例 43 2、OSFlagPend()源码 46 3、OSFlagPost()源码 51 第七讲 动态内存 54 1、内存管理基本概念 54 2、内存管理基本概念 54 3、内存管理案例 54 4、案例分析 69 5、教学案例: 71

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值