为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

COS操作系统的任务切换

2018-05-06 6页 doc 22KB 33阅读

用户头像

is_729658

暂无简介

举报
COS操作系统的任务切换COS操作系统的任务切换 司新生 2012-07-13################2012-07-13#######2#012-07-13######## (鹤壁职业技术学院河南鹤壁458030) [摘 要] μ C\OS- ?操作系统是一个多任务占先式实时操作系统,每一个任务由三部分组成,任务控制块,任务的私有堆栈、任务代码。每一个任务有一个决定其重要性的任务优先级, 系统通过任务就绪表来进行任务的切换, 就绪的任务在任务就绪表中设置 其标志位, 退出就绪的任务在就绪表中撤消其标志位。 任务的切换过程就是通过任务就绪表...
COS操作系统的任务切换
COS操作系统的任务切换 司新生 2012-07-13################2012-07-13#######2#012-07-13######## (鹤壁职业技术学院河南鹤壁458030) [摘 要] μ C\OS- ?操作系统是一个多任务占先式实时操作系统,每一个任务由三部分组成,任务控制块,任务的私有堆栈、任务代码。每一个任务有一个决定其重要性的任务优先级, 系统通过任务就绪来进行任务的切换, 就绪的任务在任务就绪表中设置 其标志位, 退出就绪的任务在就绪表中撤消其标志位。 任务的切换过程就是通过任务就绪表找到优先级最高的任务, 保存原来运行 任务的上下文到该任务的私有堆栈中,从最高优先级的任务私有堆栈中复制断点数据到工作寄存器中,pc 指针指向该任务的代码段, 实现了任务的切换。 [关键词] 操作系统任务控制块优先级任务切换 [中图分类号]G642[文献标识码]A[文章编号]1007-9416(2010)06-0012-02 址与向低地址两个方向,堆栈存储数据遵 0)来表示任务是否处于就绪状态,这个表1 μ C\OS- ?的任务μ C\OS- ?操作系统是一个多任务系 就叫做任务就绪状态表,简称叫任务就绪 循后进先出的。 统,它最多可以管理 64 个任务,但两个优 1.3 任务控制块 表。由一个 8 位的数组 OSRdyTbl[ ] 充 μ C\OS- ?操作系统任 任务控制块是先级最低的任务已被系统占用,一个是统 当,该数组最多 8 个元素,可以标示 64 个 计任务,一个是空闲任务。 空闲任务的作 务管理与切换的关键。 任务控制块是一个 任务。 用为当操作系统没有其它任务执行时, 就 C 语言的自定义结构体,主要包含有任务 任务就绪表就是一个二维数组 OSRdyTbl 转入空闲任务而不使系统没事可做。 堆栈栈顶地址、 任务的优先级、 上下任务 [ ],如果某一位为 1,则表明该优先级的任 1.1 任务的结构 每一个任务都有如务已就绪,可以进行调度,否则该任务还 控制块的地址、 任务的状态等相关信息。 下结构。 它由任务 任务控制块由上下控制块地址指针与上下 没有处于就绪状态,系统还不能直接运行 控制块 TCB , 任务代码, 任务堆栈组成, 任务控制块之间形成一个双向链表。一个 多个任务控制块形成一个任务控制块链 任务控制块的结构的主要成员如下 : 该项任务。例如 OSRdyTbl[2]的 D 为 1 则表 3表。每一个任务在创建时都被分配有一个 typedef struct os_tcb { 示任务优先级为 19 的任务已处于就绪状 struct os_tcb *OSTCBNext; // 指向 任务优先级,优先级序号从 0 到 63 ,优先 态,可以被系统运行。 为加快访问任务就 级数值越大则表示优先级越低,最高的优 下一个 TCB 的指针 绪表的速度, 系统定义了一个变量 先级是优先级序号为 0 的任务, 最低的优 struct os_tcb *OSTCBPrev; // 指向 OSRdyGrp 来表明就绪表每行中是否存在 先级是优先级为 63 的任务。操作系统可以 前一个 TCB 的指针 就绪任务。 设定管理的任务数, 在 OS_CFG.H 文件 根据任务的优先级 prio 、优先级就绪 中, 可以定义 OS_LOWEST_PRIO 值, 该 数组 OSRdyTbl[]、任务就绪组 OSRdyGrp。 值最大为 63 。每一个任务都有唯一的任务 OS_STK*OSTCBStkPtr;// 指向任系统就可以对任务进行管理与控制。 优先级,μ C\OS- ?操作系统任务切换的 μ C\OS- ?可以管理的 64 个任务的 务堆栈栈顶的指针 关键就是该任务的优先级, 操作系统总是 优先级 prio 值为 0,63(000000,111111), 运行处于就绪状态的最高优先级的任务。 由任务的优先级就可以找到该任务在任务 INT16UOSTCBDly;// 任务等待创建任务主要完成四项任务, 一是指出任 就绪表中所对应的位,优先级 prio 除以 8 时间 务代码存放的地址,二是指明任务参数指 取整,也就相当于优先级 prio 右移三位,代 INT8U OSTCBStat;// 任务的当针,也即任务参数地址,三是指明任务堆 表该任务在任务就绪表中的组号 x ,也即 前状态标志 栈栈顶指针,在进行任务切换时保存或恢 OSRdyTbl[]数组的下标等于 prio.[5:3]。优 INT8U 复与任务相关的寄存器的值, 四是确定任 OSTCBPrio;// 任务的优先级 prio 的低三位 prio.[2:0]代表在任务优 先级别 务的优先级,优先级的高低决定了任务的 先级组中的位 y 。为了加快任务的调度及 紧迫性和重要性。 任务创建的代码如下。 保证任务切换时间一致性,μ C\OS- ?操 INT8U OSTaskCreate ( 作系统预先定义了一个数组 OSMapTbl[], } OS_TCB;void (*task)(void *pd), // 任务代码 任务控制块的管理主要有以下几个变 指针 量,一是 OSTCBTbl[ ]—任务控制块数组; void *pdata, // 任务参数指针 二是 OSTCBPrioTbl[ ] —任务控制块优先 OS_STK *ptos, // 任务栈的栈顶指 OSMapTbl[0]=0000,0001B级数组,以 Prio 为下标存放已使能的 TCB OSMapTbl[1] = 0000,0010B 针 指针。 用于加速 TCB 的访问。 OSTCBCur OSMapTbl[2] = 0000,0100B INT8U prio // 任务的优先级 —全局系统变量, 指向当前正在运行的任 OSMapTbl[3] = 0000,1000B ); 务的 TCB 。 OSMapTbl[4] = 0001,0000B 1.2 任务堆栈 每一个任务都有一个2 任务就绪表及任务进入、脱离就绪 OSMapTbl[5] = 0010,0000B 私有的堆栈空 OSMapTbl[6] = 0100,0000B 状态OSMapTbl[7] = 1000,0000B 2.1 任务就绪表的结构 为了能够使 系统清楚地知道, 系统中 通过查表法, 操作系统就可以知道该 哪些任务已经就绪,哪些还没有就绪, μ优先级在任务就绪表中哪一组, 对应 间,在任务切换时保存 CPU 寄存器现场 C/OS_II 在 RAM 中设立了一个表, OSRdyGrp 的哪一位, 在该组中处于哪一 2012-07-13################2012-07-13#######2#012-07-13########(R0 ,R12、LR、SPSR 等)和本任务的私系统中的 每 个任务都在这个表中占据一位。例如:如果任务优先级prio为21的任 示十进制的 2,查表 OSMapTbl[2]=00000100B5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0,务,由 OSTCBPrioTbl[prio]就可以得到该知道 OSRdyTbl[2] 有任务进行就绪状态。 任务的任务控制块的地址。 2, 0, 1, 0,/* 0x20 to 0x2F10101 的低三位为 101,101 表示十进制 5, 3.2 切换任务上下文。 这里有四个*/ 查表 OSMapTbl[5]=00100000B 可确定 工作要做, 第一五保存当 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0,OSRdyTbl[2]的第五位为 1。 前任务的 CPU 的格寄存器内容到当前任务 2, 0, 1, 0,/* 0x30 to 0x3F2.2 任务进入就绪状态 只有进入就的私有堆栈中, 第二保存当前任务的堆栈 */ 绪状态的任务才能被调 的栈底地址到当前任务的任务 TCB 中,第 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0,度,从而被 CPU 执行。一个任务如何才能 三由最高任务的控制块 TCB 得到该任务的 处于就绪状态呢,只要在对应的任务就绪 私有堆栈地址 sp ,第四根据该任务的堆栈 2, 0, 1, 0,/* 0x40 to 0x4F*/ 表中登记该任务, 就使该任务处于就绪状 地址 sp ,装入该任务的中断的数据。 态。如果该任务的优先级为 prio,首先使 3.3 运行最高优先级的任务代码。 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0,该优先级对应的就绪组置位, 经任务调度后,PC 已指向最高优先级 2, 0, 1, 0,/* 0x50 to 0x5FOSRdyGrp|= OSMapTbl[prio>>3] 的代码段的位置,该任务获得了 CPU 的使 */ 然后使该组对应的的位置位, 用权, 从而实现了任务的切换工作。 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 结语 2, 0, 1, 0,/* 0x60 to 0x6Fμ C\OS- ?操作系统是一个多任务占 */ OSRdyTbl[prio>>3]|= OSMapTbl 先式的实时操作系统, 其对任务的管理依 [prio&0x07] 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0,靠任务控制块 TCB,任务控制块 TCB 保存 2.3 任务脱离就绪状态 有任务的私有堆栈地址、任务的代码段地 2, 0, 1, 0,/* 0x70 to 0x7F*/ 址、上下任务控制块 TCB 的地址及任务的 与任务进入就绪状态相反, 使该优先 优先级等信息。 所有就绪的任务在任务就 级的任务对应的位复位,如果该就绪组没 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0,绪表中都有登记, 根据任务就绪表就可以 有任务处于就绪状态, 就使该任务就绪组 2,0, 1, 0,/* 0x80 to 0x8F找到最高优先级的任务,任务的切换就是 对应的位复位。 首先使该任务对应的位复 */ 保存原来任务的数据到该任务的私有堆栈 位, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0,中,从最高优先级的任务堆栈中获得其被 OSRdyTbl[prio>>3]&=,OSMapTbl2,0, 1, 0,/* 0x90 to 0x9F中断的数据, PC 指向该任务的代码段并 [prio&0x07] */ 运行该段代码。 如果该就绪组没有任务处于就绪状 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0,[参考文献]态,则该就绪组对应的位复位, [1] 任哲.嵌入式实时操作系统μ C\OS- 2,0, 1, 0,/* 0xA0 to 0xAFif(OSRdyTbl[prio>>3]==0) ? -II 原理及应用(第二版)[M].北京:北京 */ { 航空航天大学出版社,2009. 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0,[2] 王田苗.嵌入式系统设计与实例开 OSRdyGrp&=,OSMapTbl[prio>>3]2, 0, 1, 0,/* 0xB0 to 0xBF发[M]. 北京: 清华大学出版社,2003 年 10 } */ 月 . 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0,[3] 原著作者(美)Jean J.Labrosse. 嵌入式实时操作系统μ C\OS- ? [M]. 译 2, 0, 1, 0,/* 0xC0 to 0xCF3 任务调度任务调度, 也就是找到优先级最高的 */ 者, 邵贝贝 等译. 北京: 北京航空航天大学 任务,然后转到该任务的代码段并执行该 出版社,2003. 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0,项段代码。 2, 0, 1, 0,/* 0xD0 to 0xDF3.1 找到优先级最高的任务 根据任*/ 务就绪表的结构, 任务就绪组 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0,中最低为 1 的位所对应的组中最低为 1 的 2, 0, 1, 0,/* 0xE0 to 0xEF位所对应的优先级就是处于就绪状态的最 */ 高优先级的任务。 如果 OSRdyGrp=01011010,则说明四 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0,个组中有任务处于就绪状态, 而 2, 0, 1, 0/* 0xF0 to 0xFFOSRdyTbl[1] 这一组优先级别最高。如果 */ OSRdyTbl[1]=10010010,则说明该组有三 }; 个任务处于就绪状态,从右数第二个 1 所 设最高优先级组为 y , 该组内优先级 代表的优先级是所有就绪的任务中优先级 最高的位为 x , 则 y=OSUnMapTbl 最高的。 为了快速得到优先级最高的任 [OSRdyGrp],x= OSUnMapTbl[OSRdyTbl 务,μ C\OS- ?仍然采用查表的方式,μ [y]],与由优先级找到就绪组和该组内的位 C\OS- ?操作系统预先定义了一个数组 的方法相反, 则最高优先任务的优先级 OSUnMapTbl[256] INT8U const OSUnMapTbl[] = { p r i o = y * 3 + x。 当0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, OSRdyGrp=01011010b=0x5a,OSRdyTbl[1]=10010010=0x92 时, y= OSUnMapTbl[0x5a]=1 x=OSUnMapTbl[OSRdyTbl[1]]= 2, 0, 1, 0,/* 0x00 to 0x0FOSUnMapTbl[0x92]=1 */ prio=1*3+1=4 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0,也就是说优先级为 4 的任务是当前优 2, 0, 1, 0,/* 0x10 to 0x1F Your requestcould not be processed becauseof a configurationerror: "Could not connect to LDAPserver." For assistance,contact your network support team.
/
本文档为【COS操作系统的任务切换】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索