UCOSii(二)——任务的就绪与调度

发布者:安静的夜晚最新更新时间:2018-05-01 来源: eefocus关键字:UCOSii  任务  调度 手机看文章 扫描二维码
随时随地手机看文章

一、任务的就绪与调度

1.1 任务状态

从ucosii用户手册(可以从上篇文章提到的地址下载)上的任务状态切换示意图:

这里写图片描述

如果学习过类似《操作系统》这样的课,会发现这张图很容易理解。

DORMANT (休眠状态)

这里我总算知道了为什么UCOS用Task的概念,而不是Process。如果仅仅将一段要被执行的指令序列称之为Process,那么它应该是不存在休眠状态的。因为一旦Process被释放,它就仅仅是一个静态的Program。它只是存在一个文件里,等着被其他进程被动调用的一段指令。

Task这个抽象的概念涵盖的面更广一点,当一段Task代码不被UCOS监控时,它就处于休眠态,永远不可能占用CPU。

调用OSTaskCreate()或 OSTaskCreateExt()可以将该任务置于就绪状态。当有新的任务进入就绪状态时,如果该任务优先级最高,它会立即运行。

调用OSTaskDel()可以让任务进入休眠状态。

READY (就绪状态)

当任务进入就绪状态时,每次调度程序都会选择就绪列表中优先级更高的任务来运行。

要进入多任务状态,必须先调用OSStart()。

RUNNING (运行状态)

该任务正占用CPU,直到它自己放弃CPU或者被中断程序打断。

WAITING(等待状态)

正在运行的任务可以调用OSTimeDly()或 OSTimeDlyHMSM()来延时等待一段时间,在这段时间内,该任务处于挂起状态。

也可以调用OSSemPend(),OSMboxPend(),或 OSQPend()来等待某个事件的发生,等待期间该任务也处于挂起状态。

如果所有任务都被挂起,那么系统将会运行一个优先级最低的空闲任务,执行执行 OSTaskIdle()函数。

1.2 任务控制块

Tcb是一个很关键的数据结构,Tcb里每个成员变量描述单一进程的单个属性,一个Tcb结构体描述单一进程的一组属性,Tcb链表描述所有进程的所有属性。之所以各个Tcb之间呈链表结构而不是数组,是因为多任务环境是动态的,进程可以被随时创建和消灭。

Tcb的成员变量大概分成以下几个部分:

(一)用于任务堆栈

变量定义:

    OS_STK *OSTCBStkPtr;#if OS_TASK_CREATE_EXT_EN
    void *OSTCBExtPtr;
    OS_STK *OSTCBStkBottom;
    INT32U OSTCBStkSize;
    INT16U OSTCBOpt;
    INT16U OSTCBId;#endif123456789

OSTCBStkPtr和OSTCBStkBottom分别描述栈顶和栈尾,OSTCBStkSize为堆栈大小。

OSTCBExtPtr为我们可以自己编辑的Tcb扩展块,OSTCBId为保留字,UCOSII版本暂未使用。

OSTCBOpt为选择项,表示在建立任务时要不要将任务堆栈清零。

(二)用于链表结构

变量定义:

struct os_tcb *OSTCBNext;struct os_tcb *OSTCBPrev;12

分别指向Tcb链表结构里的前一个和下一个成员。

(三)用于任务调度

变量定义:


if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN

    OS_EVENT *OSTCBEventPtr;#endif#if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN

    void *OSTCBMsg;#endif


    INT16U OSTCBDly;

    INT8U OSTCBStat;

    INT8U OSTCBPrio;1234567891011


OSTCBEventPtr和OSTCBMsg分别表示事件控制块的指针和传给任务的消息的指针。

OSTCBDly表示任务自己延时挂起的时间。

OSTCBStat表示任务当前的状态,为0表示任务就绪。

OSTCBPrio为任务的优先级。

(四)用于辅助调度算法

变量定义:

INT8U OSTCBX;
INT8U OSTCBY;
INT8U OSTCBBitX;
INT8U OSTCBBitY;1234

.OSTCBX, .OSTCBY, .OSTCBBitX 和 .OSTCBBitY用于加快调度算法的运行,分析这个优先级算法需要一定的篇幅,它的核心思想是利用索引加快每次查询的时间。

1.3 已就绪任务的调度

要进行已就绪任务调度的第一件事,是确定哪个就绪的任务是当前优先级最高的任务,这事由OSSched()执行。

函数OSSched()伪代码


void OSSched (void)

{    /* 关中断 */


    /* 检查用户是否调用了OSSchedLock()给调度器上锁,或位于中断子程序里。如果是,退出调度。 */


    /* 在已就绪进程里查找当前优先级最高的任务 */


    /* 判断该任务是否是当前的任务,如果是,退出调度程序 */  }12345678910


该函数执行完以后,OSTCBHighRdy指针总是指向即将运行的任务的Tcb,这作为一个接口供OS_TASK_SW()进行真正的任务切换工作。OS_TASK_SW()是一个宏,它生成以此软中断。软中断里执行任务调度。

OSCtxSw()伪代码

void OSCtxSw()
{    /* 保存当前任务的寄存器值 */

    /* 将新任务的一些属性传递给内核进行标记 */

    /* 恢复新任务的寄存器值 */

    /* 执行中断返回指令 */}


关键字:UCOSii  任务  调度 引用地址:UCOSii(二)——任务的就绪与调度

上一篇:UCOSii(三)——时间管理
下一篇:UCOSii(一)——系统初始化

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

点对多点的多任务无线通信
摘要:详细介绍无线通信在各种通信系统中的应用,单片机MCU与无线收发模块的硬件接口设计,点对多点无线通信协议的编写,点对多点无线通信系统打包与解包的软件设计。为无线通信系统的软硬件设计提供了可靠的解决方案。 关键词:无线通信 协议 通用串行总线 中央监控 远程终端 引言 现代世界是一个高速自动化的世界,各种各样的设备除了可以与计算机联机外,还可以互联机,而最简单的自动化联机方式就是使用串行通信。随着时代的进步,它并没有被取代,后倒是逐渐被广泛应用。如今,在许多场合有线连接的方式已经不能满足科技的高速发展。无线技术正以一种快速的速度进入许多产品,它与线相比主要有成本低,携带方便,省去有线布线的烦恼;特别适用于手持设备的通信、电
[网络通信]
科学家提出新型混合系统,可显著提升多任务处理能力
当前,大多数可移动机器人的功能都还处于很初级的阶段,对它们而言,要想足够智能地完成某些工作依然是一个严峻的挑战。如何为机器人设计一种类似“人脑”的大脑结构,来提升其智能化程度,一直是近年来的研究热点。 实际上,“类人机器人”的想法早在 40 年前就已经提出——模仿人脑的运转分工,即使用互补的两个脑结构,大脑(或前脑 cerebrum)负责视觉、听觉和思维等更高层次的认知功能,而小脑(cerebellum)则负责整合感官数据并控制运动、平衡和身体姿势。但是,在这一想法最初提出时,对应的机器人技术还尚未实现。 近日,一篇发表于《科学机器人》(Science Robotics)的论文就详细描述了一种混合系统,该系统将控制运动的模拟电路和
[机器人]
UCOIII中任务调度和切换
一、UCOSIII任务调度 1、可剥夺型任务调度 定义:任务调度就是中止当前正在运行的任务转而去执行其他的任务(UCOSIII是可剥夺型内核,因此当一个高优先级的任务准备就绪,并且此时发生了任务调度,那么这个高优先级的任务就会获得CPU的使用权) UCOSIII中的任务调度是由任务调度器来完成的,任务调度器有2种:任务级调度器和中断级调度器。 任务级调度器为函数OSSched()。 //OSSched为任务级调度器,如果在中断服务函数中不能使用 void OSSched (void) { CPU_SR_ALLOC(); //判断OSSched是否在中断服务函数中使用 if (OSIntN
[单片机]
UCOIII中<font color='red'>任务</font>的<font color='red'>调度</font>和切换
车载操作系统的调度算法分析与改进
引 言    随着现场总线技术、嵌入式微控制技术的发展,现代列车的过程控制已从集中型的直接数字控制系统发展成为基于网络的分布式控制系统。高速列车以保汪旅客乘车安全与舒适为基础,必须对车辆的制动、防滑、车门、供电及空调等设备分别进行控制、检测和诊断;各设备分别由相应的车载微机进行控制,构成各个子系统;子系统之间通过现场总线互联,形成全列车的网络控制系统。实际情况下,车载微机需要对多点的压力、温度以及许多其他的状态参量进行采集与监测.单一编程较为复杂,应选用嵌入式实时操作系统来完成这些任务。任务中有些需要按时间片进行调度,分时完成各个任务;而现有的源码开放的嵌入式实时操作系统一般都是抢占式多任务内核,因此需要对现有实时操作系统的任务调
[嵌入式]
变频器在调度绞车中的应用
1 引言   位于江苏省沛县境内的大屯煤电公司建立30年来,依靠倒推成本、科技创新等方式,始终保持旺盛的市场竞争力,成为我国煤炭行业唯一的一家自投产以来从未亏损过的企业。大屯选煤厂是大屯煤电公司的下属单位之一,于1979年4月兴建,1982年9月投产,是一座年处理能力210万吨的矿区选煤厂。选煤厂在生产中采用了大量的先进工艺和技术,变频调速技术在该厂得到了广泛应用。该厂有两台调度绞车,该设备是铁路煤仓调运铁路车辆的专用设备,可调运整列列车。 2 原设备存在问题   大屯选煤厂有两台调度绞车,该调度绞车采用双速三相异步电动机拖动,电机参数为:   电机型号 ydj-45/55-4/8   额定功率 45/55kw   额定电流 84.
[嵌入式]
μC/OS的任务调度实现方法及PowerPC上的优化
  μC/OS是Jean J.Labrosse开发的实时多任务内核,最初是为Motorola 8位处理器68HC11写的。在后来的相关著作中,作者将代码移植到了PC上,以便于更多的读者学习。μC/OSII继承了μC/OS的算法,有执行效率高、占用空间小、实时性强和可扩展性好等特点,被移植到几乎所有类型的CPU上,成为在嵌入式领域非常有影响力的RTOS。然而,由于该实时内核是为8位CPU设计的,对于那些具有优先级算法硬件指令的CPU,仅做移植是很不够的。    1 基于优先级的任务调度   一个基于优先级的实时多任务内核的任务调度机制需要实现下面三个核心的处理功能:   ◆ 将任务置于就绪态;   ◆ 将任务取消就绪
[嵌入式]
uC/OS-II的任务切换机理及中断调度优化
引 言   在嵌入式操作系统领域,由Jean J. Labrosse开发的μC/OS,由于开放源代码和强大而稳定的功能,曾经一度在嵌入式系统领域引起强烈反响。而其本人也早已成为了嵌入式系统会议(美国)的顾问委员会的成员。   不管是对于初学者,还是有经验的工程师,μC/OS开放源代码的方式使其不但知其然,还知其所以然。通过对于系统内部结构的深入了解,能更加方便地进行开发和调试;并且在这种条件下,完全可以按照设计要求进行合理的裁减、扩充、配置和移植。通常,购买RTOS往往需要一大笔资金,使得一般的学习者望而却步;而μC/OS对于学校研究完全免费,只有在应用于盈利项目时才需要支付少量的版权费,特别适合一般使用者的学习、研究和开发。
[嵌入式]
高手带你深入理解ucos任务堆栈
首先,我们来理解一下两个概念: 1、堆栈就是一段连续的空间。用于存储数据的,在c计算机中有很多应用,比如发生中断时保存现场,c语言函数调用时保存现场和临时变量。 2、堆栈指针就是一个数据指针。有时候计算机自己更改其指针指向的位置来保存数据,如中断时,有时候我们程序员更改其值,比如ucos操作系统做任务切换时。 堆栈作用的就是用来保存局部变量,从实质上讲也就是将CPU寄存器的值保存到RAM中。在uCOS中,每一个任务都有一个独立的任务堆栈。为了深入理解任务堆栈的作用,不妨分析任务从“出生”到“消亡”的整个过程,具体就是分析任务的建立,运行,挂起几种状态中任务堆栈的变化情况。 目前假设系统运行着一个由用户创建的用以完成
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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