实时操作系统的任务调度原因分析

发布者:脑电狂徒最新更新时间:2015-05-05 来源: 51hei关键字:实时操作系统  任务调度  原因分析 手机看文章 扫描二维码
随时随地手机看文章
最近看了一些实时操作系统的源码,关于任务调度是实时操作系统的重要组成部分,但是何时发生调度,怎样才能发生调度却不是非常的清晰,书中一本而言所说的都是“如果有更高优先级任务就绪,就会发生调度”,这会让很多的读者产生很大的歧义:

在当前的任务中,并没有关于就绪表等全局变量的访问,当前的任务也有自己的堆栈空间,我并不知道是否有更高优先级的任务就绪,之所以产生这些疑惑是没有搞清楚什么时候发生调度,怎么知道需要调度。当前运行的任务,一般而言就是所谓的最高优先级的任务,在没有访问一系列全局变量的过程中,内核又是如何知道存在一个更高优先级的任务被就绪了呢?
 
一般而言,对于抢占型实时内核,一般在同步、或者通信的过程中会主动的调用调度函数,或者任务的挂起函数中使用调度函数,其他的函数中并没有发现其他的调度函数,而且这种情况下都是手动的调度任务,那么在没有这些函数的情况下,实时操作系统中内核是如何知道需要调度的呢?
 
我仔细查找了一些资料,别人总结了一些操作系统发生调度的原因如下:
  (1)正在执行的进程执行完毕。这时,如果不选择新的就绪进程执行,将浪费处理机资源。
  (2)执行中进程自己调用阻塞原语将白己阻塞起来进入睡眠等状态。
  (3)执行中进程调用了P原语操作,从而因资源不足而被阻塞;或调用了v原语操作激活了等待资源的进程队列。
  (4)执行中进程提出I/O请求后被阻塞。
  (5)在分时系统中时间片已经用完。
  (6)在执行完系统调用等系统程序后返回用户进程时,这时可看作系统进程执行完毕,从而可调度选择一新的用户进程执行。
  以上都是在可剥夺方式下的引起进程调度的原因。在CPU执行方式是可剥夺时.还有
  (7)就绪队列中的某进程的优先级变得高于当前执行进程的优先级,从而也将引发进程调度。
我对比了在实时操作系统中经常使用的调度方式发现,原因(2)、(3)、(7)是主要的原因,其他的一般在实时操作系统中很难找到。但是这还是不能回答什么时候发生调度这个问题。
 
我认为在实时操作系统中发生调度的主要有两个部分:
(1)自身需要睡眠等待,必须手动的调用调度函数(信息量,或者通信机制)。
(2)发生中断过,当执行完中断服务函数以后,需要重新调度。
 
其中原因(2)是我们在分析实时操作系统中实时性能的主要因素,很多人又会有很多的疑问,如果操作系统中很少使用中断,实质上在实时系统中必须存在的一个中断就是时间节拍中断,这个中断的存在就能保证实时操作系统的实时型。这个时间节拍选择也是设计过程中必须注意的。我们可以参看uC/OS-II的时间节拍代码,其中完成了所有对非任务挂起的任务的就绪操作(时间到期),这时也就知道了那个任务需要我们调度。在其他的中断服务函数执行完成以后也就需要那个任务需要被执行,进而实现了实时操作。

 

    void OSTimeTick (void)
    {
    #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
        OS_CPU_SR cpu_sr;
    #endif
        OS_TCB *ptcb;

        OSTimeTickHook(); /* Call user definable hook */
    #if OS_TIME_GET_SET_EN > 0
        OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
        OSTime++;
        OS_EXIT_CRITICAL();
    #endif
        if (OSRunning == TRUE) {
            ptcb = OSTCBList; /* Point at first TCB in TCB list */
            while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
                OS_ENTER_CRITICAL();
                if (ptcb->OSTCBDly != 0) {                     /* Delayed or waiting for event with TO */
                    if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
                        if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
                            OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task R-to-R (timed out)*/
                            OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
                        } else {
                                /* Yes, Leave 1 tick to prevent ... */
                            ptcb->OSTCBDly = 1; /* ... loosing the task when the ... */
                        } /* ... suspension is removed. */
                    }
                }
                ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
                OS_EXIT_CRITICAL();
            }
        }
    }

从上面的代码中我们可以知道每个任务都会被扫描一次,检测是否能够就绪,如果能够就绪就将就绪表中的值设置,这样也就知道了是否有更高优先级的任务就绪,是否需要调度操作。因为时间节拍中断的不断发生就能保证最高优先级任务的发生。因此时间节拍中断函数是在实时操作系统中非常重要的函数之一。当然任务之间切换以及在中断中切换到新的任务中的切换代码也是非常重要的,但是这些一般涉及到CPU寄存器的值,需要汇编代码实现。
因为中断完成以后很多的任务可能因为信号量等信息的释放已经就绪,这时候必然需要任务的调度操作,这时候也就知道了那个任务是最高优先级的,那个任务应该被执行。这时也就是发生调度的时刻。
 
在UC/OS-II中通常采用关闭中断的方式进入临界区,因为关闭了中断,所有的中断服务函数都不会被执行,也就不会发生任务的调度。那么只有一个情况才会发生调度,也就是任务自身需要睡眠,手动选择调度函数,但是在临界区中不应该发生睡眠等,因此也就不可能手动调度,因此所有发生调度的可能都被清除了,这样也就保证了临界区代码的安全性。

关键字:实时操作系统  任务调度  原因分析 引用地址:实时操作系统的任务调度原因分析

上一篇:栈的妙用-实现迷宫问题
下一篇:UC/OS-II的内存管理OSMemCreate()分析

推荐阅读最新更新时间:2024-03-16 14:00

PLC编程口RS232的一次意外烧毁的原因分析
RS232是一种经典的通讯方式,至今绝大多数 PLC 上都至少有一个RS232口,作为编程口和普通的通讯口,两个多月前,一个同事在现场调试程序时,首先将编程电缆接在笔记本的串口上,然后去接PLC编程口,结果PLC的编程口马上被烧毁。   实际上,我在几年前现场调试时也曾经碰到过类似故障:当笔记本使用外接电源时,PLC的串口马上被烧毁或者表现的现象有点类似于短路――CPU的电源灯忽亮忽灭的;但是当去掉外接电源,笔记本使用电池供电时就没有问题了。注明一下,这个故障倒是与带电插拔无关。   最后查到的原因:当时使用的PLC是DC24V供电,最终发现由于配线的原因将供电电源的DC24V+与机柜接在一起了(实际上DC24V-接至机柜也会发
[嵌入式]
可重构系统功耗相关的硬件任务调度算法
   引 言   可重构系统是指以软件改变硬件结构以实现具体应用的计算平台,一般由非柔性但可编程的处理器和柔性的以程序控制重构的数字逻辑器件构成。目前国内外的可重构系统研究中,采用的可重构硬件主要是现场可编程门阵列(Field Programming Gate Array,FPGA)。可重构系统非常适合于那些对功耗有严格要求或者计算密集的应用,因为此类应用在FPGA上实现的功耗要大大低于在处理器上实现的功耗。将在FPGA上运行的任务视为“硬件任务”纳入实时操作系统(Real-time Operating Sys-tem,RTOS)的统一管理范围,可简化系统的设计与管理。因此,需要在传统的RTOS中引入硬件任务管理器,实现硬件任务
[嵌入式]
可重构系统功耗相关的硬件<font color='red'>任务</font><font color='red'>调度</font>算法
基于实时操作系统RTX51和AT89C52单片机实现智能交通灯的设计
介绍一种基于车流量变化动态调节时间的智能交通灯的设计方法;在进行流量统计的同时,对违章情况进行监测;根据模糊算法分配各车道的绿灯时间,实现车流动态调节。分析其中存在的多种任务,用传统的前后台编程方法实现难度较大,使用实时操作系统可简化程序设计,并使程序具有良好的可读性、可维护性和可移植性。介绍车流量检测的原理与绿灯时间分配方案。 随着城市汽车保有量的越来越多,城市的交通拥挤问题正逐渐引起人们的注意。交通灯是交管部分管理城市交通的重要工具。目前绝大部分交通灯其时间都是设定好的,不管是车流高峰还是低谷,红绿灯的时间都固定不变;还有一些交通灯能根据简单划分的时间段来调整时间,但控制起来都不是很灵活,这使得城市车流的调节不能达到最优。
[单片机]
基于<font color='red'>实时操作系统</font>RTX51和AT89C52单片机实现智能交通灯的设计
爱特梅尔和SEGGER为AVR32提供实时操作系统
爱特梅尔公司 ( Atmel® Corporation ) 和领先的嵌入系统中间件制造商 SEGGER 微控制器公司 宣布 ,提供 推出专为 AVR®32 微控制器 而设 的实时操作系统 embOS 。 爱特梅尔先进的 AVR32 微控制器架构专为满足 RTOS 应用需求而设计,具有快速的多级中断控制器、内存保护单元,并支持嵌套中断 (nested interrupts) 。从嵌入闪存以 66 MHz 运行时,具有出色的 1.08 DMIPS/MHz 能效指标,高达 83 Dhrystone MIPS (DMIPS) 的性能, AVR32 UC3 是当今市场中性能最
[新品]
RTOS的必备特性
随着信息家电的普及,智能化、网络化将会无所不在,所有这些都离不开嵌入式软件,而在嵌入式软件只中最核心的莫过于RTOS(Real Time Operating System,实时操作系统)。我们都非常熟悉Windows这样的操作系统,但却不一定熟悉嵌入式系统中常用的RTOS。如今,微软已经推出了Windows的嵌入式版本——Windows CE。而风靡一时的Linux也在嵌入式系统中扮演着重要角色。这样看来,传统桌面操作系统和嵌入式操作系统的界线似乎也在淡化。事实究竟如何呢?让我们来听听在嵌入式软件领域颇有造诣的专家是怎么说的。 用于嵌入式环境的操作系统RTOS与桌面操作系统有很多本质的不同。这些不同的特性导致产品开发的不同结果。
[嵌入式]
QNX为推出符合IEC 62304标准的实时操作系统
    全球互联嵌入式系统软件平台领导厂商QNX软件系统有限公司今日宣布扩大其产品和服务系列,帮助医疗设备制造商在开发须获监管批准的安全关键型产品中节省更多成本,这些产品包括输液泵、病人监护设备、血液分析系统、磁共振成像机、机器人辅助手术系统等。   新增产品系列中的QNX Neutrino 医用实时操作系统,符合IEC 62304对医疗设备软件生命周期过程制定的标准。QNX还提供现场评估、产品实地应用数据、有关可靠系统设计的培训课程,及达标咨询等服务。   QNX软件系统有限公司产品管理总监Grant Courville 表示:“医疗设备开发商必须应对日渐严格的监管压力、不断提升的系统复杂性以及与日俱增的互联要求,同时他
[医疗电子]
Small RTOS51实现基于8位单片机的温控器设计
目前,8位单片机在测控领域和智能化电子产品应用中仍占有重要地位.而应用嵌入式实时操作系统(ERTOS)会对8位单片机的软件开发带来极大方便。在此简要介绍嵌入式实时操作系统及其在程序设计中的优越性,重点介绍了适合于小RAM单片机的嵌入式实时操作系统Small RTOS51,以及基于8位单片机的硬件和软件的设计方法和过程。 1 嵌入式实时操作系统Small RTOS51简介 嵌入式系统已成为当今的热门话题之一,从消费类电子产品到各种工业设备,嵌入式系统已渗透到日常生活的各个角落。对于嵌人式系统,一个重要的特征是实时性,即在确定的时间内完成规定的功能,并能对外部异步事件做出正确响应。确保系统的实时性,需要软硬件配合来完成
[单片机]
嵌入式实时操作系统μC/OS-II下的多串口通信编程方法
本文介绍了以LPC2365为核心处理器、嵌入式实时操作系统μC/OS-II下的多串口通信编程方法。对于固定长度的短字节帧数据,通过设置合适的字节触发深度,一次中断完成数据接收任务;对于变长的长字节帧数据,则通过多次中断和等待延时的方法判断数据稳定并完成帧数据的接收;对于大量数据的接收和发送采用建立FIFO数据队列的方法。 通过这些措施较好地完成了多串口较大数据量的通信任务。 国产某掠海恒高硬体拖靶在拖曳飞行时,需要将自身的各种参数通过无线链路实时上传至拖曳母机,同时实时接收拖曳母机的遥控指令完成相应的动作。拖靶自身的参数包括:开关高控状态、 蓄电池 电压 、无线电高度表值、飞行高度装定值、垂向加速度值、舵翼角、温度值、普通
[单片机]
嵌入式<font color='red'>实时操作系统</font>μC/OS-II下的多串口通信编程方法
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved