ucosii任务管理及调度
- 格式:ppt
- 大小:2.17 MB
- 文档页数:170
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) 任务处理部分中的内容都是与任务的操作密切相关的。
包括任务的建立、删除、挂起、恢复等等。
摘要:μ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 内核学习之一:任务调度学校的教学方式多是先让你学原理,再应用它。
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,这个值是记录任务切换次数的。
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 ( )来完成的。
基于μ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] 它是以应用为中心的,而嵌入式操作系统则是嵌入式系统应用中的核心。
嵌入式系统是计算机硬件和软件的结合体,或许还加上机械等其他部分,被设计来完成专门的功能。
在一些情况下,嵌入式系统是一个大的系统或产品的一部分,就象汽车上的防抱死装置,与通用计算机相对。
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 任务管理一、实验目的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的使用权让给其余任务而使任务进入等候状态。