uCOS-II原理-课件-.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《uCOS-II原理-课件-.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- uCOS II 原理 课件
- 资源描述:
-
1、为什么要学习C/OS-II一.凡从事嵌入式系统开发工作的人,必须对嵌入式操作系统有足够的了解。二.对于初学者,从C/OS-II开始是个明智的选择。1.C/OS-II麻雀虽小,却五脏基本全(它是个微内核)。2.可以学习实时系统的一些编程技巧。3.可以把在学校中学到的操作系统抽象概念具体化。4.具有很强的实用性。5.学习数据结构应用的好例子。讲座的主要内容一.计算机操作系统的基本概念二.操作系统中常用的数据结构三.并发操作系统的概念四.任务的要素五.C/OS-II的任务管理(任务调度)六.C/OS-II的中断和时钟七.C/OS-II的任务的同步与通信八.C/OS-II的存储管理九.硬件抽象层和测试
2、台操作系统是一种为应用程序提供服务的系统软件,是一个完整计算机系统的有机组成部分。从层次来看,操作系统位于计算机硬件之上,应用软件之下。所以也把它叫做应用软件的运行平台。什么是计算机操作系统 (Operating System,OS)它在计算机应用程序与计算机硬件系统之间,屏蔽了计算机硬件工作的一些细节,并对系统中的资源进行有效的管理。通过提供函数(应用程序接口(API),从而使应用程序的设计人员得以在一个友好的平台上进行应用程序的设计和开发,大大地提高了应用程序的开发效率。计算机操作系统的作用从用户的角度来看,它就是一大堆函数(API和系统函数),用户可以调用(普通调用或系统调用)它们来对系
3、统资源进行操作。计算机硬件用汇编语言编写的硬件抽象层高级语言的接口应用软件操作系统操作系统计算机操作系统的功能处理器的管理存储管理网络和通信的管理I/O设备管理文件管理任务管理任务表存储分配表文件目录设备表 总之,需要一大堆表 操作系统中经常使用的数据结构(数组)数组1。同一数据类型数据的集合;2。占用连续内存空间;3。其中的所有元素名称都相同,但每个元素都有一个编号;4。元素名去掉编号(下标),得到的是数组名,数组名是个指针。int a10a0a1a2a3a9aa+1使用上的特点:1。分类存放;2。检索速度快且恒定;3。缺点:占用连续空间大a+2a+3a+9应用:记录同类事物的表操作系统中经
4、常使用的数据结构(位图)位图是数组的一种特殊应用a10(可以记录80个事物的状态)a0a1a2a3a9aa+1a+2a+3a+9应用:登记表1/0D7 D6 D5 D4 D3 D2 D1 D0操作系统中经常使用的数据结构(结构)1。不同数据类型数据的集合;2。占用连续内存空间;struct Student int age;char*name;char sex;使用上的特点:1。不分类存放,但用来描述同一事物;2。检索速度快且恒定;应用:通讯录中的一条记录、工具箱、厨房等等next next 两个元素的链表操作系统中经常使用的数据结构(链表)struct Student Student*next
5、 int age;char*name;char sex;1。同数据类型数据的集合;2。不占用连续内存空间。使用上的特点:1。分类存放,但空间上不连续(不需要大量的连续存储空间);2。检索速度慢,且耗费的时间不固定;应用:存放大量的较大的表,类似档案柜操作系统中经常使用的数据结构(队列)按照先进先出的规则组织的数据结构可以用数组也可以用链表来实现主要用于对象的排队操作系统中经常使用的数据结构(堆栈)按照先进后出规则组织的数据结构主要用数组来实现主要用于程序模块的嵌套运行什么是多任务系统简单地说,就是能用一个处理器并发(注意,不是同时!)地运行多个程序的计算机管理系统。并发:由同一个处理器轮换地运
6、行多个程序。或者说是由多个程序轮班地占用处理器这个资源。且在占用这个资源期间,并不一定能够把程序运行完毕。并发过程示意图处理器如何进行程序的切换?程序的切换(两句话)处理器是个傻瓜,PC让它干啥,它就干啥。PC是个指路器,它指向哪儿,处理器就去哪儿。从此可以知道,哪个程序占有了PC,哪个程序就占有了处理器。=PC深刻地理解深刻地理解PC是理解系统进行程序切换动作的关键。所谓切换就是:PC 目标地址如何操作PC指令:不同的计算机类型的指令是不同的。数据传送指令数据传送指令子程序返回指令(子程序返回指令(由堆由堆栈弹出栈弹出)中断服务程序返回指令中断服务程序返回指令(由堆栈弹出由堆栈弹出)小结小结
7、系统是通过把待运行程系统是通过把待运行程序的地址赋予程序计数序的地址赋予程序计数器器PC来实现程序的切换来实现程序的切换的。的。任务代码任务堆栈内存处理器PCSP任务运行时与 处理器之间的关系处理器通过两个指针寄存器(PC和SP)来与任务代码和任务堆栈建立联系并运行它寄存器组程序运行环境运行环境包括了两部分:处理器中的运行环境和内存中的运行环境任务代码任务堆栈内存处理器PCSP多任务时的问题任务代码任务堆栈内存任务代码任务堆栈内存?当有多个任务时,处理器中的运行环境应该怎么办?寄存器组程序运行环境程序 虚拟处理器PCSP 虚拟处理器PCSP 虚拟处理器PCSP 虚拟处理器PCSP调度器多任务时
8、任务与处理器 之间关系的处理程序处理器PCSP在内存中为每个任务创建一个虚拟的处理器(处理器部分的运行环境由操作系统的调度器按某种规则来进行这两个复制工作复制当需要运行某个任务时就把该任务的虚拟处理器复制到实际处理器中复制当需要中止当前任务时,则把任务对应的虚拟处理器复制到内存复制再把另一个需要运行的任务的虚拟处理器复制到实际处理器中寄存器组寄存器组也就是说,任务的切换是任务运行环境的切换虚拟处理器虚拟处理器应该存储的主要信息:1。程序的断点地址(PC)2。任务堆栈指针(SP)3。程序状态字寄存器(PSW)4。通用寄存器内容5。函数调用信息(已存在于堆栈)另外再用一个数据结构保存任务堆栈指针(
9、SP),这个数据结构叫做任务控制块,它除了保存任务堆栈指针之外还要负责保存任务其他信息。这些内容通常保存在任务堆栈中,这些内容也常叫做任务的上下文。任务控制块是由操作系统另行构造的一个数据结构,每个任务都有一个。任务控制块结构的主要成员typedef struct os_tcb OS_STK OS_STK *OSTCBStkPtrOSTCBStkPtr;/指向任务堆栈栈顶的指针 INT8U INT8U OSTCBStatOSTCBStat;/任务的当前状态标志 INT8U INT8U OSTCBPrioOSTCBPrio;/任务的优先级别 OS_TCB;任务代码任务堆栈内存任务控制块其实,程序
10、切换的关键是把程序的私有堆栈指针赋予处理器的堆栈指针SPSP实质上系统是通过SP的切换来实现程序的切换的。要建立一个概念:具有控制块的程序才是一个可以被系统所运行的任务。程序代码、私有堆栈、任务控制块是任务的三要件。任务控制块提供了运行环境的存储位置。任务的基本概念把一个大型任务分解成多个小任务,然后在计算机中通过运行这些小任务,最终达到完成大任务的目的。在C/OS-II中,与上述那些小任务对应的程序实体就叫做“任务”(实质上是一个线程),C/OS-II就是一个能对这些小任务的运行进行管理和调度的多任务操作系统。从应用程序设计的角度来看,C/OS-II的任务就是一个用户编写的C函数和与之相关联
11、的一些数据结构而构成的一个实体。任务代码任务堆栈内存在内存中应该存有任务的代码和与该任务配套的堆栈任务切换过程获得待运行任务的任务控制块恢复待运行任务的运行环境处理器的PC=任务堆栈中的断点地址处理器的SP=任务块中保存的SP如何获得待运行任务的任务控制块?小结一个完整的任务应该有如下三部分:任务代码(程序)任务的私有堆栈(用以保护运行环境)任务控制块(提供私有堆栈也是虚拟处理器的位置)这些都是任务方应该提供的基本信息。C/OS-II中的任务管理 任务的状态及其转换正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把CPU的使用权让给别的任务而使任务进入等待状态。任务在
12、没有被配备任务控制块或被剥夺了任务控制块时的状态叫做任务的睡眠状态系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,这时任务的状态叫做就绪状态。处于就绪状态的任务如果经调度器判断获得了CPU的使用权,则任务就进入运行状态一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序,这时任务的状态叫做中断服务状态前面谈到,一个任务的任务控制块的主要作用就是保存该任务的虚拟处理器的堆栈指针寄存器SP。其实,随着任务管理工作的复杂性的提高,它还应该保存一些其他信息。任务控制块任务在系统中的身份证 由于系统存在着多个任务,于是系统如何来识别并管理一个任务就是一个需要解决的问题。识别一个任
13、务的最直接的办法是为每一个任务起一个名称。由于C/OS-II中的任务都有一个惟一的优先级别,因此C/OS-II是用任务的优先级来作为任务的标识的。所以,任务控制块还要来保存该任务的优先级别。另外,前面也谈到,一个任务在不同的时刻还处于不同的状态,显然,记录了任务状态的数据也应该保存到任务控制块中。基于上述原因,系统必须为每个任务创建一个保存与该任务有关的相关信息的数据结构,这个数据结构就叫做该任务的任务控制块(TCB)。任务控制块结构的主要成员typedef struct os_tcb OS_STK OS_STK *OSTCBStkPtrOSTCBStkPtr;/指向任务堆栈栈顶的指针 INT
14、8U INT8U OSTCBStatOSTCBStat;/任务的当前状态标志 INT8U INT8U OSTCBPrioOSTCBPrio;/任务的优先级别 OS_TCB;任务控制块是不是像我们人在一个国家中的身份证?(其实,系统中的所有资源都应该有身份证。)任务在内存中的结构 用户任务代码的用户任务代码的 一般结构一般结构void MyTask(void*pdata)for(;)可以被中断的用户代码;可以被中断的用户代码;OS_ENTER_CRITICAL();/进入临界段(关中断)进入临界段(关中断)不可以被中断的用户代码;不可以被中断的用户代码;OS_EXIT_CRITICAL();/退
15、出临界段(开中断)退出临界段(开中断)可以被中断的用户代码;可以被中断的用户代码;临界段临界段无限循无限循环环于是可以这样说,C/OS-II任务的代码结构是一个可以带有临界段的无限循环。系统提供的空闲任务 在多任务系统运行时,系统经常会在某个时间内无用户任务可运行而处于所谓的空闲状态,为了使CPU在没有用户任务可执行的时候有事可做,C/OS-II提供了一个叫做空闲任务OSTaskIdle()的系统任务voidOSTaskIdle(void*pdata)#ifOS_CRITICAL_METHOD=3OS_CPU_SRcpu_sr;#endifpdata=pdata;/防止某些编译器报错for(;
16、)OS_ENTER_CRITICAL();/关闭中断OSdleCtr+;/计数OS_EXIT_CRITICAL();/开放中断空闲任务只是做了一个计数工作注意!空闲任务中没有调用任务延时函数C/OS-II规定,一个用户应用程序必须使用这个空闲任务,而且这个任务是不能用软件来删除的系统提供的另一个任务 统计任务C/OS-II提供的另一个系统任务是统计任务OSTaskStat()。这个统计任务每秒计算一次CPU在单位时间内被使用的时间,并把计算结果以百分比的形式存放在变量OSCPUsage中,以便应用程序通过访问它来了解CPU的利用率,所以这个系统任务OSTaskStat()叫做统计任务任务的优先
17、权及优先级别C/OS_II把任务的优先权分为64个优先级别,每一个级别都用一个数字来表示。数字0表示任务的优先级别最高,数字越大则表示任务的优先级别越低用户可以根据应用程序的需要,在文件OS_CFG.H中通过给表示最低优先级别的常数OS_LOWEST_PRIO赋值的方法,来说明应用程序中任务优先级别的数目。该常数一旦被定义,则意味着系统中可供使用的优先级别为:0,1,2,OS_LOWEST_PRIO,共OS_LOWEST_PRIO+1个固定地,系统总是把最低优先级别OS_LOWEST_PRIO自动赋给空闲任务。如果应用程序中还使用了统计任务,系统则会把优先级别OS_LOWEST_PRIO-1自
18、动赋给统计任务,因此用户任务可以使用的优先级别是:0,1,2OS_LOWEST_PRIO-2,共OS_LOWEST_PRIO-1个任务堆栈保存CPU寄存器中的内容及存储任务私有数据的需要,每个任务都应该配有自己的堆栈,任务堆栈是任务的重要的组成部分 在应用程序中定义任务堆栈的栈区非常简单,即定义一个OS_STK类型的一个数组并在创建一个任务时把这个数组的地址赋给该任务就可以了。例如:/定义堆栈的长度#defineTASK_STK_SIZE 512/定义一个数组来作为任务堆栈OS_STK TaskStkTASK_STK_SIZE;typedefunsignedintOS_STK;/这是系统定义的
19、一个数据类型voidmain(void)OSTaskCreate(MyTask,/任务的指针&MyTaskAgu,/传递给任务的参数&MyTaskStkMyTaskStkN-1,/任务堆栈栈顶地址20/任务的优先级别);在创建用户任务时,要传递任务的堆栈指针和任务优先级别使用函数OSTaskCreate()创建任务时,一定要注意所使用的处理器对堆栈增长方向的支持是向上的还是向下的任务堆栈的初始化应用程序在创建一个新任务的时候,必须把在系统启动这个任务时CPU各寄存器所需要的初始数据(任务指针、任务堆栈指针、程序状态字等等),事先存放在任务的堆栈中C/OS-II在创建任务函数OSTaskCrea
20、te()中通过调用任务堆栈初始化函数OSTaskStkInit()来完成任务堆栈初始化工作的它的原型如下:OS_STK*OSTaskStkInit(void(*task)(void*pd),void*pdato,OS_STK*ptos,INT16Uopt);由于各种处理器的寄存器及对堆栈的操作方式不尽相同,因此该函数需要用户在进行C/OS-II的移植时,按所使用的处理器由用户来编写。实现这个函数的具体细节,将在本书有关C/OS-II移植的章节中做进一步的介绍其实,任务堆栈的初始化就是对该任务的虚拟处理器的初始化(复位)。任务控制块(OS_TCB)及任务控制块链表C/OS-II用来记录任务的堆栈
21、指针、任务的当前状态、任务的优先级别等一些与任务管理有关的属性的表就叫做任务控制块任务控制块就相当于是一个任务的身份证,没有任务控制块的任务是不能被系统承认和管理的任务控制块结构的主要成员typedefstructos_tcbOS_STK *OSTCBStkPtr;/指向任务堆栈栈顶的指针struct os_tcb*OSTCBNext;/指向后一个任务控制块的指针struct os_tcb*OSTCBPrev;/指向前一个任务控制块的指针INT16U OSTCBDly;/任务等待的时限(节拍数)INT8U OSTCBStat;/任务的当前状态标志INT8U OSTCBPrio;/任务的优先级别
22、OS_TCB;任务控制块链表空任务控制块链表当应用程序调用函数OSTaskCreate()创建一个任务时,这个函数会调用系统函数OSTCBInit()来为任务控制块进行初始化。这个函数首先为被创建任务从空任务控制块链表获取一个任务控制块,然后用任务的属性对任务控制块各个成员进行赋值,最后再把这个任务控制块链入到任务控制块链表的头部 当进行系统初始化时,初始化函数会按用户提供的任务数为系统创建具有相应数量的任务控制块并把它们链接为一个链表。由于这些任务控制块还没有对应的任务,故这个链表叫做空任务块链表。即相当于是一些空白的身份证。任务就绪表及任务调度 多任务操作系统的核心工作就是任务调度。所谓调
23、度,就是通过一个算法在多个任务中确定该运行的任务,做这项工作的函数就叫做调度器。C/OS_II进行任务调度的思想是“近似地每时每刻总是让优先级最高的就绪任务处于运行状态”。为了保证这一点,它在系统或用户任务调用系统函数及执行中断服务程序结束时总是调用调度器,来确定应该运行的任务并运行它。C/OS_II进行任务调度的依据就是任务就绪表为了能够使系统清楚地知道,系统中哪些任务已经就绪,哪些还没有就绪,C/OS_II在RAM中设立了一个记录表,系统中的每个任务都在这个表中占据一个位置,并用这个位置的状态(1或者0)来表示任务是否处于就绪状态,这个表就叫做任务就绪状态表,简称叫任务就绪表任务就绪表就是
24、一个二维数组OSRdyTbl 为加快访问任务就绪表的速度,系统定义了一个变量OSRdyGrp来表明就绪表每行中是否存在就绪任务。OSRdyTbl1/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/0OSRdyGrpD7D6D5D4D3D2D1D01/01/01/01/0
25、1/01/01/01/0任务就绪表的示意图01234567xy01234567OSRdyGrpD7D6D5D4D3D2D1D011110000prio=29D7D6D5D4D3D2D1D01D7D6D5D4D3D2D1D01OSRdyTbl3把prio为29的任务置为就绪状态YXOSRdyGrp|=OSMapTblprio3;OSRdyTblprio3|=OSMapTblprio&0 x07;在程序中,可以用类似下面的代码把优先级别为prio的任务置为就绪状态:OSRdyGrp|=OSMapTblprio3;OSRdyGrp|=OSMapTblprio3;OSRdyTblprio3|=OSMa
展开阅读全文