ucosii任务管理及调度

合集下载

uCOS-II的任务切换机理及中断调度优化

uCOS-II的任务切换机理及中断调度优化

uCOS-II的任务切换机理及中断调度优化uC/OS-II的任务切换机理及中断调度优化摘要:μC/OS-II是一种适用于嵌入式系统的抢占式实时多任务操作系统,开放源代码,便于学习和使用。

介绍μC/OS-II在任务级和中断级的任务切换原理,以及这一操作系统基于嵌入式系统的对于中断的处理;相对于内存资源较少的单片机,着重讨论一种优化的实用堆栈格式和切换形式,以提高资源的利用率;结合MSP430单片机,做具体的分析。

关键词:实时多任务操作系统μC/OS MSP430 中断堆栈引言在嵌入式操作系统领域,由Jean J. Labrosse开发的μC/OS,由于开放源代码和强大而稳定的功能,曾经一度在嵌入式系统领域引起强烈反响。

而其本人也早已成为了嵌入式系统会议(美国)的顾问委员会的成员。

不管是对于初学者,还是有经验的工程师,μC/OS开放源代码的方式使其不但知其然,还知其所以然。

通过对于系统内部结构的深入了解,能更加方便地进行开发和调试;并且在这种条件下,完全可以按照设计要求进行合理的裁减、扩充、配置和移植。

通常,购买RTOS 往往需要一大笔资金,使得一般的学习者望而却步;而μC/OS对于学校研究完全免费,只有在应用于盈利项目时才需要支付少量的版权费,特别适合一般使用者的学习、研究和开发。

自1992第1版问世以来,已有成千上万的开发者把它成功地应用于各种系统,安全性和稳定性已经得到认证,现已经通过美国FAA认证。

1 μC/OS-II的几大组成部分μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。

核心部分(OSCore.c) 是操作系统的处理核心,包括操作系统初始化、操作系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。

能够维持系统基本工作的部分都在这里。

任务处理部分(OSTask.c) 任务处理部分中的内容都是与任务的操作密切相关的。

包括任务的建立、删除、挂起、恢复等等。

嵌入式操作系统_第5章 ucOS-II - 任务就绪表及任务就绪组

嵌入式操作系统_第5章 ucOS-II - 任务就绪表及任务就绪组

0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 2
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 3
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 4
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0

y = OSUnMapTbl[OSRdyGrp]; prio = (INT8U)((y << 3)
+ OSUnMapTbl[OSRdyTbl[y]]);
优先级判定表OSUnMapTbl[256] (os_core.c)
举例: 如OSRdyGrp的值为
00101000B,即0X28,则 查得 OSUnMapTbl[OSRdyGrp] 的值是3,它相应于 OSRdyGrp中的第3位置1;
图5-6 在就绪表中查找最高优先级别任务的过程
从任务就绪表中获取优先级别最高的就绪任务可用如下 类似的代码:
y = OSUnMapTal[OSRdyGrp]; //D5、D4、D3位
x = OSUnMapTal[OSRdyTbl[y]]; //D2、D1、D0位
prio = (y<<3)+x;
//优先级别
};
优先级判定表OSUnMapTbl[256]
OSUnMapTbl[]这个数组的生成原则:先 把一个数用二进制表示,然后从低位往高 位数,返回第一次碰到1的位置。比如: OSUnMapTbl[0x111100(60)] = 2。可 以看到,如果要表示8位数的对应关系, 则数组的大小为2^8=256。这也是为什么 OSRdyTbl[],OSRdyGrp采用8位的原因。

μCOSⅡ中的任务调度

μCOSⅡ中的任务调度

任务延时若干时钟节拍 任务的状态字 0,就绪 任务优先级 用于加速任务进入就绪态的过 或进入等待事件发生状态的过
与TCB相关的结构
两个关键: • 优先级数分解为高三位和低三位分别确定;
• 高优先级有着小的优先级号 ;
优先级和就绪任务表的位置关系
• 每个就绪的任务都放入就绪表中(ready list) 中,就绪表有两个变量:OSRdyGrp、OSRdyTbl[]
μ C/OSⅡ中的任务调度
Group01小组 柴永锋 李逢春 苗 冬
相关介绍
• C/OS是占先式实时多任务内核,优先级最高的任 务一旦准备就绪,则拥有CPU的所有权开始投入运 行。
• C/OS中不支持时间片轮转法,每个任务的优先级 要求不一样且是唯一的 • C/OS –II 2.51版本支持64个任务,每个任务一 个特定的优先级。优先级越高,数字越小。 • C/OS任务调度所花的时间为常数,与应用程序中 建立的任务数无关
Task scheduler
void OS_Sched (void) /*os_core.c中*/ { INT8U y; OS_ENTER_CRITICAL(); if ((OSLockNesting =0)&&(OSIntNesting= 0)) { y = OSUnMapTbl[OSRdyGrp]; OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy != OSPrioCur) { OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy]; OSCtxSwCtr++; OS_TASK_SW(); } } OS_EXIT_CRITICAL(); }

uCOS-II的任务切换机理及中断调度优化

uCOS-II的任务切换机理及中断调度优化

摘要:μC/OS-II是一种适用于嵌入式系统的抢占式实时多任务操作系统,开放源代码,便于学习和使用。

介绍μC/OS-II在任务级和中断级的任务切换原理,以及这一操作系统基于嵌入式系统的对于中断的处理;相对于内存资源较少的单片机,着重讨论一种优化的实用堆栈格式和切换形式,以提高资源的利用率;结合MSP430单片机,做具体的分析。

关键词:实时多任务操作系统μC/OS MSP430 中断堆栈引言在嵌入式操作系统领域,由Jean J. Labrosse开发的μC/OS,由于开放源代码和强大而稳定的功能,曾经一度在嵌入式系统领域引起强烈反响。

而其本人也早已成为了嵌入式系统会议(美国)的顾问委员会的成员。

不管是对于初学者,还是有经验的工程师,μC/OS开放源代码的方式使其不但知其然,还知其所以然。

通过对于系统内部结构的深入了解,能更加方便地进行开发和调试;并且在这种条件下,完全可以按照设计要求进行合理的裁减、扩充、配置和移植。

通常,购买RTOS往往需要一大笔资金,使得一般的学习者望而却步;而μC/OS对于学校研究完全免费,只有在应用于盈利项目时才需要支付少量的版权费,特别适合一般使用者的学习、研究和开发。

自1992 第1版问世以来,已有成千上万的开发者把它成功地应用于各种系统,安全性和稳定性已经得到认证,现已经通过美国FAA认证。

1 μC/OS-II的几大组成部分μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。

核心部分(OSCore.c) 是操作系统的处理核心,包括操作系统初始化、操作系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。

能够维持系统基本工作的部分都在这里。

任务处理部分(OSTask.c)任务处理部分中的内容都是与任务的操作密切相关的。

包括任务的建立、删除、挂起、恢复等等。

因为μC/OS-II是以任务为基本单位调度的,所以这部分内容也相当重要。

ucos II 内核学习之三:任务调度

ucos II 内核学习之三:任务调度

ucos II 内核学习之一:任务调度学校的教学方式多是先让你学原理,再应用它。

Muc21则不喜欢这种方式,依然记得在学校枯燥无味地学一大堆理论,更郁闷的是不知道是应用在什么地方。

Mcu21喜欢先学会用它了,然后再去了解它的原理。

对ucos II也一样,当我用过之后,再去看它的内核,或许理解起来会更容易。

实现任务切换,需要调用函数OSSched()。

程序代码如下void OSSched (void){INT8U y;OS_ENTER_CRITICAL();if ((OSLockNesting | OSIntNesting) == 0) (1){y = OSUnMapTbl[OSRdyGrp]; (2)OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);if (OSPrioHighRdy != OSPrioCur) (3){OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; (4)OSCtxSwCtr++; (5)OS_TASK_SW(); (6)}}OS_EXIT_CRITICAL();}其基本实现原理大致是先找出优先级最高的任务,OSTCBHighRdy指向优先级最高任务的任务控制块,接着调用宏OS_TASK_SW(),宏OS_TASK_SW()完成实质性任务切换工作。

下面具体了解下代码的作用。

1. 首先判断是不是在在中断子函数中调用,任务调度有没有上锁(1)2. 如果不是在中断子函数中调用,并且任务调度没有上锁,找出就绪表中优先级最高的任务(2)3. 检验这个优先级最高的任务是不是当前正在运行的任务,以此来避免不必要的任务调度(3)。

4. 如果不是,OSTCBHighRdy指向优先级最高的那个任务控制块OS_TCB(4)5. OSCtxSwCtr加1,这个值是记录任务切换次数的。

uCOS-II 的任务

uCOS-II 的任务

uC/OS-II 的任务:从任务的存储结构来看,uC/OS-II的任务由三个部分构成:1任务程序代码,任务的执行部分2任务堆栈,用来保存任务工作环境3任务控制块,用来保存任务属性每一个任务都作为一个节点,组成一个双向的任务链表。

用户任务:从程序代码上看,用户任务似乎就是一个C语言函数,但是这个函数不是一般的C语言函数,它是一个任务(线程)。

因此,它不是被主函数或其他函数调用的,主函数mian()只是负责创建和启动它们,而由操作系统负责来调度它们。

系统任务:uC/OS-II预定义了两个为应用程序服务的系统任务:4空闲任务(OSTaskIdle)5统计任务(OSTaskStat)其中空闲任务是每个应用程序必须使用的。

OSTaskIdle由系统自动创建,在系统初始化时,∙OSInit --> OS_InitTaskIdle --> OSTaskIdle如果用户应用程序要使用统计任务,则必须把定义在OS_CFG.H 中的OS_TASK_STAT_EN设置为1,并且必须在创建统计任务之前调用函数OSStatInit( )对统计任务进行初始化。

任务优先级:优先级数目通过OS_CFG.H中的OS_LOWEST_PRIO配置。

固定地,系统总是把最低优先级别OS_LOWEST_PRIO自动赋给空闲任务。

如果应用程序中还使用了统计任务,则系统会把OS_LOWEST_PRIO - 1自动赋给统计任务。

由于每个任务都具有唯一的优先级别,因此uC/OS-II通常也用任务的优先级别来作为这个任务的标识。

任务堆栈:堆栈的增长方向随系统所使用的处理器不同而不同,为提高应用程序的可移植性,可利用OS_CFG.H中的OS_STK_GROWTH作为选择开关。

把CPU启动任务时所需的初始数据事先存放在任务的堆栈中,当任务获得CPU使用权时,就可以把堆栈中的初始数据复制到CPU 的各寄存器中,使任务顺利地启动并运行。

任务堆栈的初始化工作是由系统通过在OSTaskCreate ( )中调用OSTaskStkInit ( )来完成的。

基于μCOS-II操作系统的任务调度机制

基于μCOS-II操作系统的任务调度机制

基于μC/OS-II操作系统的任务调度机制论文关键词:μC/OS-II;多任务;任务调度论文摘要:μC/OS-II操作系统之所以在10多年的时间里作为一个嵌入式实时的多任务操作系统得到了广泛的应用,原因之一是它的任务管理机制存在许多的优点。

多任务运行的最大难点就在于多任务的调度。

WANG Yu-rong,ZHU Jian-bin(Computer Science College Wuhan University of Science and Engineering,Wuhan 430073,China)Abstract:As a multi-task embedded real time operation system, μC/OS-II Operating Systems has been widely used in more ten years.One of the reason is that the Operating Systems has many advantages.The hardest point is the schedul of tasks when we run multi-task Operating Systems.Key words:μC/OS-II;Multi-task;task-scheduling1 引言嵌入式系统是一种应用范围非常广泛的系统。

可以这样理解,除了桌面计算机和服务器外所有计算设备都属于嵌入式系统。

在短短十多年的时间里,伴随着微电子技术、软件技术的发展,嵌入式系统被广泛的用于如生物医学仪器、智能汽车、通信设备、网络设备、仪器仪表、手持设备等诸多领域。

[1] 它是以应用为中心的,而嵌入式操作系统则是嵌入式系统应用中的核心。

嵌入式系统是计算机硬件和软件的结合体,或许还加上机械等其他部分,被设计来完成专门的功能。

在一些情况下,嵌入式系统是一个大的系统或产品的一部分,就象汽车上的防抱死装置,与通用计算机相对。

μC OS-II 实验一任务基本管理

μC OS-II 实验一任务基本管理

void MyTask(void *pdata) { while(1) { printf("This is MyTask!\n"); Beep(1950, 20); n++; //通过空循环进行延时 通过空循环进行延时 if(n>=10) { printf("MyTask Suspended!\n"); n = 0; OSTaskSuspend(OS_PRIO_SELF); } } }
创建任务示例示例
void MyTask(void *pdata) { pdata = pdata; while(1) { printf("M"); Beep(1950, 20); n++; if(n>=CharPerLine) { printf("\n"); n = 0; } OSTimeDly(OS_TICKS_PER_SEC); } }
等待状态
OSTaskResume()
OSTaskSupend()
OS_TASK_SW() 就绪状态 任务CPU使用权被剥夺 使用权被剥夺 任务 运行状态
挂起任务函数原型 INT8U OSTaskSuspend (INT8U prio); ; 如果参数prio为常数 为常数OS_PRIO_SELF,则表示挂起 如果参数 为常数 , 当前任务自身。 当前任务自身。 恢复任务函数原型: 恢复任务函数原型: INT8U OSTaskResume (INT8U prio)
任务删除
所谓删除一个任务,就是把任务置于休眠状态,具 所谓删除一个任务,就是把任务置于休眠状态, 体的做法就是, 体的做法就是,把当初分配给该任务的任务控制块 从任务控制块链表中删除, 从任务控制块链表中删除,并归还给空任务控制块 链表, 链表,然后就绪任务表中把该任务的就绪状态位置 0. 删除一个任务,并不是说任务的代码被删除了, 删除一个任务,并不是说任务的代码被删除了,只 是任务的代码不能被µC/OS_II的内核管理和调用。 的内核管理和调用。 是任务的代码不能被 的内核管理和调用

ucosii实时操作系统分析-任务管理及调度精品PPT课件

ucosii实时操作系统分析-任务管理及调度精品PPT课件
(48页例2-8) 10、用信号量实现任务间同步和互斥示例程序演示--0.9(可选)
(119页例4-4,122页例4-5) 11、用消息邮箱实现任务间通信示例程序演示--0.9(可选)(136页例4-8) 3
实时操作系统C/OБайду номын сангаас-II
1 C/OS-II概述 2 任务概念 3 任务调度核心问题分析
4
C/OS简介
美国人Jean Labrosse 1992年完成 应用面覆盖了诸多领域,如照相机、医疗器械、音
响设备、发动机控制、高速公路电话系统、自动提 款机等 1998年C/OS-II,目前的版本C/OS -II V2.61 ,2.72 2000年,得到美国航空管理局(FAA)的认证, 可以用于飞行器中 网站()
( 31页2.4.2) 5、任务调度器实现流程图表述--1 (43页2.4.3) 6、任务调度器实现及源代码分析--1 (43页2.4.3 ) 7、任务切换的过程描述--0.8(可选) (43页2.4.3 ) 8、用户任务的实现(编写一个示例程序验证调度算法)--1 (43页例2-7) 9、任务状态切换(挂起和恢复任务)示例程序演示--0.9(可选)
任务控制块是一个数据结构,保存该任务的相关参数,包括任务 堆栈指针,任务的当前状态,任务的优先级等。
任务CPU使用权被剥夺时,TCB保存该时刻任务状态;任务重新得 到CPU控制权时,TCB确保任务从当时被中断的那一点丝毫不差地 继续执行。
OS_TCB全部驻留在RAM中。
任务控制块就相当于一个任务的身份证,没 有任务控制块的任务是不能被系统承认和管 理的。
µC/OS-II操作系统中进程调 度模块分析
1
1、课程任务:
背景
分析µC/OS-II操作系统中的进程调度模块的源代码

第3章 μCOS-II操作系统任务调度

第3章 μCOS-II操作系统任务调度
人民邮电出版社出版 杨宗德编著
2011-3-30
6
µC/OS-II 操作系统标准教程 如果一个优先级为44(二进制码为101 100)的任务处于就绪状态 ptcb->OSTCBY ptcb->OSTCBBitY ptcb->OSTCBX ptcb->OSTCBBitX 将该任务添加到就绪表中 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX; OSRdyGrp |= ptcb->OSTCBBitY; 即 OSRdyTbl[5] = OSRdyTbl[5] | (00010000)B //将OSRdyTbl[5]的Bit4位置位,标识优先级44任务就绪 OSRdyGrp = OSRdyGrp | (00100000)B //将OSRdyGrp的Bit5位置位,标识OSRdyTbl[5]组有一个及以上任务就绪 = (INT8U)(prio >> 3) = 1 << ptcb->OSTCBY = (INT8U)(prio & 0x07) = 1 << ptcb->OSTCBX =(5)d =(00100000)B =(4)d =(00010000)B
14

µC/OS-II 操作系统标准教程
任务级任务切换基本过程
• (1)将当前任务的PC位置、通用寄存器数据、CPU的状态入栈; • (2)修改全局变量OSPrioCur(当前任务优先级变量)的值为全局 变量OSPrioHighRdy(最高优先级任务优先级)的值,即把最高就 绪任务优先级设置为新的当前任务优先级; • (3)修改原任务TCB的第1个成员(指向栈顶的指针*OSTCBStkPtr) 的值为当前SP寄存,以便再次返回; • (4)获取最高优先级的任务控制块中第1个成员(指向堆栈栈顶指 针*OSTCBStkPtr)的值到sp寄存器; • (5)修改OSTCBCur的值为新就绪最高优先级任务的任务控制块地 址; • (6)将新任务的PC位置、通用寄存器数据、CPU的状态出栈,开 始执行新的任务。

嵌入式实时操作系统uCOS-II原理(课件PPT) μCOS-II中的任务管理

嵌入式实时操作系统uCOS-II原理(课件PPT) μCOS-II中的任务管理
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 2
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 3
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 4
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
5 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0

prio=29 0 0 0 1 1 1 0 1
y = OSUnM图5a-6p在T就bl绪[O表S中R查d找yG最高rp优];先级别任务的过程 prio = (INT8U)((y << 3)
任当务控应制用块结程构序的主调要用成员函数OSTaskCreate( )
任务及控任制务块控(O制S_块TC链B)表 t…y创统进任务控这表…pOssIII数具链的表…ettNNNrrd…S建函行务控制个的TTTuue任_会有接任。fcc188Stts任 任 制 认6UU务T一数初从制块任头μ栈务理控tooUr当由按相为务即Kuss控__c个始空块各务部O务务块和ttt制*C指有的制cc进于用应一,相oSObbOOOs/块任化任,个控T_S**SSS控的的管行这户数个故当tT优针关O块OOC链TTTcbCSS务。务然成制BCCCS表系 些提量链这于BTT{BBBI制 身 任理先、 的-SCCDSP时这控后员块ntIBBtr统任供的表个是kliayi块 份 务的NPPot级任 属I;,个制用进链t;r;te初务的任。链一re用x///;vt///就 证 是这函块任行入(任任任/;;别务 性//始控任务表些指///指务务务来指个数链务赋到)向相 , 不等的 的向化制务控叫空等的的向来任记函首表的值任后待当优前时块数制做白当 没 能务为一当 表一的前先一空数先获属,务堆录个,还为块空的时状级个任任于 有 被栈些前 就会为取性最控任限态别任务初没系并任身任栈务务标(务是 任 系控与状 叫调 被 一 对后 制顶控始有统 把务份志节控控制务的用创个任再块制拍一务统制任态做块化对创它块证指制块数块的链系建任务把链针个控承的函应建们链。)务任、的块表指堆指管任务针针

uCOS-II任务调度过程

uCOS-II任务调度过程

uCOS-II任务调度过程ucos-II是基于任务优先级抢占式任务调度法的,就是内核在管理调度时,调用任务切换函数(一般为SSched()),在该函数中将此时已处于就绪状态(条件一)并且为最高优先级(条件二)的任务的保存于其栈中的相应信息压入cpu寄存器中(软中断完成),然后cpu 开始运行该任务的代码。

内核是何时进行任务调度的呢?虽然uC/OS-II是可被剥夺资源的内核(高优先级可强行占有低优先级正在使用的资源),但此事发生的前提是内核实时"检测"到了更高就绪的优先级了,那么内核是怎样来实时检测的呢?带着这个问题让我们再来看看任务的结构——里边有函数OSTimeDly(OS_TICKS_PER_SEC),一看就知道这是个延时函数,除了延时外它还会有其他用途呢?经查看其源码了解到里边有一条代码:OSSched(),对,函数OSTimeDly()的作用就是将此时正在运行的函数挂起(保存任务控制块OS_TCB中的相应信息)(任务控制块OS_TCB是系统分配给每个任务的信息存储单元),然后调用函数OSSched()进行任务切换,进而执行就绪的最高优先级任务。

此刻,我们了解到uCOS-II的任务切换是在执行的任务中调用延时函数OSTimeDly()进行的。

现在,还有一个问题还没解决,就是当延时到了,内核如何将资源返还给被延时挂起的任务?我们先来了解一下任务控制块(OS_TCB),任务控制块是一个数据结构,当任务的cpu使用权被剥夺时,uC/OS-II用它来保存该任务的状态。

当任务重新得到cpu使用权时,任务控制块确保任务从当时被中断的那一点丝毫不差地继续执行。

OS_TCB全部驻留在RAM中。

在OS_TCB中有一项时间延时项OSTCBDly,调用函数OSTimeDly()过程中有一步骤就是给OSTCBDly赋延时值。

uC/OS—II中有函数OSTimTick(),叫时钟节拍函数,它的一项工作就是给每个用户任务控制块OS_TCB中的时间延迟项OSTCBDly减1(如果该项不为零),当某项任务的任务控制块中的时间延时项OSTCBDly减为0时,这个任务就进入了就绪态,等待任务切换。

uCOS-II原理2_任务管理

uCOS-II原理2_任务管理
OSRdyGrp&=~OSMapTbl[prio>>3];
O從SR任dy務Grp就緒表中獲取優先順序O別SRd最yT高bl[y的] 就緒任務可用如 D下7 類D6似D的5 代D4碼D:3 D2 D1 D0 D7 D6 D5 D4 D3 D2 D1 D0
00 1 0 1 0 00 0 1 1 0 00 00
保存CPU寄存器中的內容及存 v{oi在d m應ain(用voi程d) 式/t/中y這pe是定de系f義統un任定si在g義n務創e的d建堆一in用t個疊戶O數的任S據_務S棧類T時K型區,; 要非常簡單,
即定……義一個OS_STK類傳型遞任的務一的個堆疊數指組針和並在創建
使OS用Ta函sk數Create( )創建任 儲任務私有數據的需要,每個 一 可以個OS了任Ta。s務kM&CMr時yeTayatT把esak(s,k這Ag個u, 數組任//的//務任傳優地務遞先的給址順指任賦序針 務別的給參該數任務就
程式通過訪問它來瞭解CPU的利用率, 所以這個系統任務OSTaskStat( )叫做 統計任務
任務及的優優先先順權序別 用O的說該供O個固O應把統順共SSS戶_常明常使_定_用優計序OCLLS可F數應數用O地O程先任別_GWW權 每 來 的 越 序L以.用一的EOμ,E式順務是OHSSCSW一優大分 表 別根程旦優T中_系T中序,:E/_L_SO個先則為 示 越據式被先P通O統P還別因0TSRWR,_級順表應中定I過 E。低6_總I使此OPOS4IOS1R用任義序給T,I示別序數個是用用自_,I_LO把程務,別表P共把了戶動O2-任都別優字RW1…任式優則為示IO最統任賦E個務用最先0OSSO表務的先意:最_賦低計務給TS的一高順L__需順味低O值0示的優任可空PLW,優個,序RO要序著優E的任優先務以閒IWS1先數O數E別,別 系先T方,順, 使任S-務先_T1順字字,在的統順P法2序系用務_自R,P檔數中序I,別統的。動RO…I目可別+來則優如賦O1…-。會先果給2,,

实验二UCOS-II任务管理(DOC)

实验二UCOS-II任务管理(DOC)

班级学号姓名同组人实验日期室温大气压成绩实验二 UCOS-II 任务管理一、实验目的1、掌握 UCOS-II 中任务管理的函数的应用。

2、掌握 UCOS-II 在 STM32平台下对硬件的控制。

3、掌握开发 UCOS-II 应用的程序构造。

二、实验步骤1、 UCOSII工作原理UCOSII供给系统时钟节拍,实现任务切换和任务延时等功能。

这个时钟节拍由OS_TICKS_PER_SEC(在 os_cfg.h 中定义)设置,一般我们设置 UCOSII的系统时钟节拍为1ms~100ms。

本次实验利用 STM32的SYSTICK准时器来供给 UCOSII时钟节拍。

UCOSII的任何任务都是经过一个叫任务控制块( TCB)的东西来控制的,每个任务管理块有 3 个最重要的参数:( 1)任务函数指针; (2) 任务货仓指针; (3) 任务优先级。

在UCOSII中,使用 CPU的时候,优先级高(数值小)的任务比优先级低的任务拥有优先使用权,即任务就绪表中老是优先级最高的任务获取 CPU使用权,只有高优先级的任务让出 CPU使用权(比方延时)时,低优先级的任务才能获取 CPU使用权。

UCOSII不支持多个任务优先级相同,也就是每个任务的优先级一定不相同。

任务的调动其实就是 CPU 运转环境的切换,即: PC指针、 SP指针和存放器组等内容的存取过程UCOSII的每个任务都是一个死循环。

每个任务都处在以下5种状态之一的状态下,这 5种状态是:睡眠状态、就绪状态、运转状态、等候状态 ( 等候某一事件发生 ) 和中断服务状态。

睡眠状态,任务在没有被装备任务控制块或被剥夺了任务控制块时的状态。

就绪状态,系统为任务装备了任务控制块且在任务就绪表中进行了就绪登记,任务已经准备好了,但因为该任务的优先级比正在运转的任务的优先级低,还临时不可以运转,这时任务的状态叫做就绪状态。

运转状态,该任务获取 CPU使用权,并正在运转中,此时的任务状态叫做运转状态等候状态,正在运转的任务,需要等候一段时间或需要等候一个事件发生再运转时,该任务就会把 CPU的使用权让给其余任务而使任务进入等候状态。

第五章UCOS-ii任务管理

第五章UCOS-ii任务管理
序 0 1 2 3 4 5 6 7 号 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000 值(二进制表示)
D7 D6 D5 D4 D3 D2 prio=29 0 0 0 1 Y 1 1
D1 D0 0 1 X OSRdyTbl[prio>>3] | = OSMapTbl[prio&0x07];
能把时间都用在调度上。因此就需要设计高效的多任务调度方
法。查找高优先级的任务,与正在运行的任务的优先级进行比
较以确定是否进行任务切换是内核在每个时钟中断都需要做的
事情。为满足这样的需要,μC/OS-II的开发者采用了就绪表Βιβλιοθήκη 5.1.1就绪任务表的结构
• 就绪任务表:实质是是一个INT8U类型的数组 OSRdyTble[] INT8U OSRdyTbl[OS_RDY_TBL_SIZE];
OSRdyGrp D7 D6 D5 D 4 D3 D2 0 0 1 0 1 0
D1 D0 0 0
OSRdyTbl[y ] D7 D6 D5 D4 D3 D2 0 1 1 0 0 0
D1 D0 0 0
y = OSUnMapTal[OSRdyGrp];
x= OSUnMapTal[OSRdyTbl[y]];
OSRdyGrp为0x69,以此值为偏移量查表
/*0x00 to 0x0F*/ /*0x10 to 0x1F*/ /*0x20 to 0x2F*/ /*0x30 to 0x3F*/ /*0x40 to 0x4F*/ /*0x50 to 0x5F*/ /*0x60 to 0x6F*/ /*0x70 to 0x7F*/ /*0x80 to 0x8F*/ /*0x90 to 0x9F*/ OSRdyTb1[0]为0x30,以此值为偏移量查表 /*0xA0 to 0xAF*/ /*0xB0 to 0xBF*/ 就绪任务组优先级最高的就是4(0<<3+4) /*0xC0 to 0xCF*/ /*0xD0 to 0xDF*/ /*0xE0 to 0xEF*/ /*0xF0 to 0xFF*/
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

9
C/OS的性能特点(二)

占先式(Preemptive) 多任务
C/OS-II可以管理64个任务,然而,目前这一版本保留8个给系统。应用程序最多 可以有256个任务

可确定性
全部 C/OS-II的函数调用与服务的执行时间具有可确定性。

任务栈
每个任务有自己单独的栈, C/OS-II允许每个任务有不同的栈空间,以便压低应 用程序对RAM的需求。

OSTaskCreateExt()
提问:C/OS-II中的任务是进程还是线程?
18
任务主函数
一个任务通常是一个无限循环(返回值类型void)
void MyTask(void *pdata)
{
while (1) {
Why?
do something;
waiting; do something;
}
}


2000年,得到美国航空管理局(FAA)的认证,可以用于飞行器 中
网站()

8
C/OS的性能特点(一)

公开源代码 可移植性(Portable)
绝大部分 C/OS-II的源码是用移植性很强的ANSI C写的。和微处理器 硬件相关的那部分是用汇编语言写的。汇编语言写的部分已经压到最 低限度,使得 C/OS-II便于移植到其他微处理器上。 C/OS-II可以在 绝大多数8位、16位、32位以至64位微处理器、微控制器 、数字信号处 理器(DSP)上运行。
系统保留了优先级为0、1、2、3、 OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2, OS_LOWEST_PRI0-1以及OS_LOWEST_PRI0这8个任 务以被将来使用,用户可以有56个应用任务; 任务的优先级同样也是它的标识号ID。


21
空闲任务和统计任务

内核总是创建一个空闲任务OSTaskIdle(); 总是设置为最低优先级,OS_LOWEST_PRIOR; 当所有其他任务都未在执行时,空闲任务开始 执行; 应用程序不能删除该任务; 空闲任务的工作就是把32位计数器OSIdleCtr 加1,该计数器被统计任务所使用;
实时操作系统C/OS-II
1
C/OS-II概述
2
任务管理
3 4
中断和时间管理
任务之间的通信与同步
存储管理
5
1
通用操作系统和嵌入式(实时)操作系统

通用操作系统:Windows/NT/XP、Linux、UNIX等,用于PC机 、服务器, 嵌入式(实时)操作系统:用于嵌入式设备的操作系统,具有通 用操作系统的基本特点,又具有系统实时性、硬件的相关依赖性 、软件固态化以及应用的专用性等特点; 嵌入式(实时)操作系统通常包括与硬件相关的底层驱动软件、 系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器 Browser等; 嵌入式(实时)操作系统的重要指标:实时性(中断响应时间、 任务切换时间等)、尺寸(可裁剪性 )、可扩展性(内核、中间 件);
typedef double FP64;
15
C/OS-II的文件结构
16
1
C/OS-II概述
2
任务和任务管理
3 4
中断和时间管理
任务之间的通信与同步
存储管理
5
17
任务的实现
创建任务的系统服务

OSTaskCreate()
INT8U OSTaskCreate ( void (*task)(void *pd), //任务代码指针 void *pdata, //任务参数指针 OS_STK *ptos, //任务栈的栈顶指针 INT8U prio //任务的优先级 );
} OS_TCB;
24
栈指针 OSTCBStkPtr:指向当前任务栈顶的指针 ,每个任务可以有自己的栈,栈的容量可 以是任意的; OSTCBStkBottom:指向任务栈底的指针; OSTCBStkSize:栈的容量,用可容纳的指 针数目而不是字节数(Byte)来表示。


25
26
链表指针


一旦任务建立了,任务控制块OS_TCB将 被赋值。
23
任务控制块TCB
typedef struct os_tcb { 栈指针; INT16U 链表指针; OS_EVENT void INT8U INT8U 其他…… OSTCBId; *OSTCBEventPtr; *OSTCBMsg; OSTCBStat; OSTCBPrio; /*任务的ID*/ /*事件指针*/ /*消息指针*/ /*任务的状态*/ /*任务的优先级*/

可固化(ROMable)
C/OS-II是为嵌入式应用而设计的,这就意味着,只要读者有固化手 段(C编译、连接、下载和固化), C/OS-II可以嵌入到读者的产品 中成为产品的一部分。

可裁剪(Scalable)
可以只使用 C/OS-II中应用程序需要的那些系统服务。也就是说某产 品可以只使用很少几个 C/OS-II调用,而另一个产品则使用了几乎所 有 C/OS-II的功能,这样可以减少产品中的 C/OS-II所需的存储器空 间(RAM和ROM)。这种可剪裁性是靠条件编译实现的。

系统服务
C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存 的申请与释放、时间相关函数等。

中断管理
中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则 高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。

稳定性与可靠性
10
µC/OS-II图书
27
空闲TCB链表

所有的任务控制块都被放臵在任务控制块列表数组 OSTCBTbl[]中,系统初始化时,所有TCB被链接成空闲的 单向链表,头指针为OSTCBFreeList。当创建一个任务后 ,就把OSTCBFreeList所指向的TCB赋给了该任务,并将它 加入到使用链表中,然后把OSTCBFreeList指向空闲链表 中的下一个结点。
FS C/C++ 设备驱动
RTOS
KERNEL 调试工具
其它组件
TCP/IP
设备I/O
BSP 嵌入式硬件平台
7
C/OS简介
1、C/OS——Micro Controller O S,微控制器操作系统 2、 C/OS简介

美国人Jean Labrosse 1992年完成 应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动 机控制、高速公路电话系统、自动提款机等 1998年C/OS-II,目前的版本C/OS -II V2.61,2.72

所有的任务控制块分属于两条不同的链表 ,单向的空闲链表(头指针为 OSTCBFreeList)和双向的使用链表(头 指针为OSTCBList);

OSTCBNext、OSTCBPrev:用于将任务控制 块插入到空闲链表或使用链表中。每个任 务的任务控制块在任务创建的时候被链接 到使用链表中,在任务删除的时候从链表 中被删除。双向连接的链表使得任一成员 都能快速插入或删除。



2
嵌入式操作系统的发展
应用程序
应用程序
通信协议
库函数
应用程序
文件系统
API GUI
文件系统
API GUI
操作系统内核
操作系统内核
操作系统内核
驱动程序和固件
驱动程序和固件
驱动程序和固件
80年代初期
80年代中期-90年代中 期
90年代末期-21世纪
3
常见的嵌入式操作系统
实时嵌入式操作系统的种类繁多,大体上可分为两 种,商用型和免费型。 商用型的实操作系统功能稳定、可靠,有完善的技 术支持和售后服务,但往往价格昂贵,如Vxworks、 QNX、WinCE、Palm OS等。 免费型的实时操作系统在价格方面具有优势,目前 主要有Linux,μC/OS是一种源码开放的商业RTOS;
19
任务也可以自我删除(并非真的删除,只是内核不 再知道该任务)
void MyTask (void *pdata) {
...... /* 用户代码 */
OSTaskDel(OS_PRIO_SELF); }
20

μ C/OS-Ⅱ可以管理多达64个任务;
OS_CFG.H 中定义=63

每个任务被赋以不同的优先级,取值从0到 OS_LOWEST_PRIO-2,数值越小,优先级越高;
28
系统初始化后…
指针数组,指向相应TCB
29
任务的状态-休眠

休眠状态(Dormant):任务存在于内存 空间中,但内核不可见;
可以通过以下函数通知内核,使之变为就 绪状态:


OSTaskCreate()或OSTaskCreateExt()

可以通过以下函数返回到休眠状态:

OSTaskDel()
11
µC/OS-II的各种商业应用

全世界有数百种产品在应用:

Avionics Medical Cell phones
Routers and switches
High-end audio equipment Washing machines and dryers UPS (Uninterruptible Power Supplies)
用ANSI C书写
支持任何8, 16, 32-bits CPU 支持SMC, MMC, SD, CF, IDE, Flash, RAM 其他介质
14
可移植的数据类型
typedef unsigned char BOOLEAN;
相关文档
最新文档