分享
分销 收藏 举报 申诉 / 76
播放页_导航下方通栏广告

类型ucOS-II入门经典教程PPT学习课件.ppt

  • 上传人:a199****6536
  • 文档编号:11692582
  • 上传时间:2025-08-05
  • 格式:PPT
  • 页数:76
  • 大小:5.64MB
  • 下载积分:16 金币
  • 播放页_非在线预览资源立即下载上方广告
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    ucOS II 入门 经典 教程 PPT 学习 课件
    资源描述:
    ,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,嵌入式实时操作系统,C/OS-II,讲座,北 华 大 学,任 哲,2006 广州,1,为什么要学习,C/OS-II,一.凡从事嵌入式系统开发工作的人,必须,对嵌入式操作系统有足够的了解。,二.对于初学者,从,C/OS-II,开始是个明智的选择。,1.,C/OS-II,麻雀虽小,却五脏基本全(它是个微内核)。,2.可以学习实时系统的一些编程技巧。,3.可以把在学校中学到的操作系统抽象概念具体化。,4.具有很强的实用性。,5.学习数据结构应用的好例子。,2,讲座的主要内容,一.计算机操作系统的基本概念,二.操作系统中常用的数据结构,三.并发操作系统的概念,四.任务的要素,五.,C/OS-II,的任务管理(任务调度),六.,C/OS-II,的中断和时钟,七.,C/OS-II,的任务的同步与通信,八.,C/OS-II,的存储管理,九.硬件抽象层和测试台,3,操作系统是一种为应用程序提供服务的,系统软件,,是一个完整计算机系统的有机组成部分。,从层次来看,操作系统位于计算机硬件之上,应用软件之下。所以也把它叫做应用软件的运行,平台,。,什么是计算机操作系统,(Operating System,OS),4,它在计算机应用程序与计算机硬件系统之间,,屏蔽,了计算机硬件工作的一些细节,并对系统中的资源进行有效的,管理,。,通过提供函数(应用程序接口(,API,),从而使应用程序的设计人员得以在一个友好的平台上进行应用程序的设计和开发,大大地,提高了应用程序的开发效率,。,计算机操作系统的作用,从用户的角度来看,它就是,一大堆函数,(API和系统函数),用户可以调用(普通调用或系统调用)它们来对系统资源进行操作。,计算机硬件,用汇编语言编写,的,硬件抽象层,高级语言的接口,应用软件,操作系统,5,操作系统,计算机操作系统的功能,处理器的管理,存储管理,网络和通信的管理,I/O设备管理,文件管理,任务管理,任务表,存储,分配表,文件,目录,设备表,总之,需要一大堆,表,6,操作系统中经常使用,的数据结构(数组),数组,1。同一数据类型数据的集合;,2。占用连续内存空间;,3。其中的所有元素名称都相同,但每个元素都有一个编号;,4。元素名去掉编号(下标),得到的是数组名,数组名是个指针。,int a10,a0,a1,a2,a3,a9,a,a+1,使用上的特点:,1。,分类,存放;,2。检索速度快且,恒定,;,3。缺点:占用连续空间大,a+2,a+3,a+9,应用:记录,同类事物,的,表,7,操作系统中经常使用,的数据结构(位图),位图是数组的一种特殊应用,a10,(可以记录80个事物的状态),a0,a1,a2,a3,a9,a,a+1,a+2,a+3,a+9,应用:,登记表,1/0,D7 D6 D5 D4 D3 D2 D1 D0,8,操作系统中经常使用,的数据结构(结构),1。不同数据类型数据的集合;,2。占用连续内存空间;,struct Student,int age;,char*name;,char sex;,;,使用上的特点:,1。不,分类,存放,但用来描述同一事物;,2。检索速度快且,恒定,;,应用:,通讯录中的一条记录、,工具箱、厨房,等等,9,next,next,两个元素的链表,操作系统中经常使用,的数据结构(链表),struct Student,Student*next,int age;,char*name;,char sex;,;,1。同数据类型数据的集合;,2。,不,占用连续内存空间。,使用上的特点:,1。,分类,存放,但空间上不连续(不需要大量的连续存储空间);,2。检索速度,慢,,且耗费的,时间不固定,;,应用:,存放大量的较大,的表,类似档案柜,10,操作系统中经常使用,的数据结构(队列),按照,先进先出,的规则组织的数据结构,可以用,数组,也可以用,链,表,来实现,主要用于对象的排队,11,操作系统中经常使用,的数据结构(堆栈),按照,先进后出,规则组织的数据结构,主要用数组来实现,主要用于,程序模块的嵌套运行,12,什么是多任务系统,简单地说,就是能用一个处理器,并发(注意,不是同时!),地运行多个程序的计算机管理系统。,并发,:,由同一个处理器轮换地,运行多个程序。或者说是由多个,程序轮班地占用处理器这个资源。,且在占用这个资源期间,并不一,定能够把程序运行完毕。,并发过程,示意图,处理器如何进行程序的,切换?,13,程序的切换(两句话),处理器是个傻瓜,,PC,让它干啥,它就干啥。,PC,是个指路器,它指向哪,儿,处理器就去哪儿。,从此可以知道,哪个程序占有了,PC,,哪个程序就占有了处理器。,=,PC,深刻地理解,PC,是理解系统,进行程序切换动作的关键。,14,所谓切换就是:,PC 目标地址,如何操作PC,指令:,不同的计算机类型的指令是不同的。,数据传送指令,子程序返回指令(,由堆,栈弹出,),中断服务程序返回指令,(,由堆栈弹出,),15,小结,系统是通过把待运行程序的地址赋予程序计数器,PC,来实现程序的切换的。,16,任务代码,任务堆栈,内存,处理器,PC,SP,任务运行时与,处理器之间的关系,处理器通过两个指针寄存器(PC和SP)来与任务代码和任务堆栈建立联系并运行它,寄存器组,程序运行环境,运行环境包括了两部分:处理器中的运行环境和内存中的运行环境,17,任务代码,任务堆栈,内存,处理器,PC,SP,多任务时的问题,任务代码,任务堆栈,内存,任务代码,任务堆栈,内存,?,当有多个任务时,处理器中的运行环境应该怎么办?,寄存器组,程序运行环境,18,程序,虚拟,处理器,PC,SP,虚拟,处理器,PC,SP,虚拟,处理器,PC,SP,虚拟,处理器,PC,SP,调度器,多任务时任务与处理器 之间关系的处理,程序,处理器,PC,SP,在内存中为每个任务创建一个虚拟的处理器(处理器部分的运行环境,由操作系统的,调度器,按某种规则来进行这两个复制工作,复制,当需要运行某个任务时就把该任务的虚拟处理器复制到实际处理器中,复制,当需要中止当前任务时,则把任务对应的虚拟处理器复制到内存,复制,再把另一个需要运行的任务的虚拟处理器复制到实际处理器中,寄存器组,寄存器组,也就是说,任务的切换是,任务,运行环境的切换,19,虚拟处理器,虚拟处理器应该存储的主要信息:,1。程序的断点地址(PC),2。任务堆栈指针(SP),3。程序状态字寄存器(PSW),4。通用寄存器内容,5。函数调用信息(已存在于堆栈),另外再用一个数据结构保存任务堆栈,指针(SP),这个数据结构叫做任务,控制块,它除了保存任务堆栈指针之,外还要负责保存任务其他信息。,这些内容通常保存在任务堆栈中,这些内容也常叫做任务的上下文。,任务控制块是由操作系统另行构造的一个数据结构,每个任务都有一个。,任务控制块结构的主要成员,typedef struct os_tcb,OS_STK *OSTCBStkPtr,;,/指向任务堆栈栈顶的指针,INT8U OSTCBStat,;,/任务的当前状态标志,INT8U OSTCBPrio,;,/任务的优先级别,OS_TCB,;,任务代码,任务堆栈,内存,任务控制块,其实,程序切换的关键是,把程序的,私有堆栈指针,赋,予处理器的堆栈指针,SP,实质上系统是通过SP的切换,来实现程序的切换的。,要建立一个概念:具有,控制块的程序才是一个,可以被系统所运行的任务。,程序代码、私有堆栈、任,务控制块,是任务的三要件。,任务控制块提供了运行环,境的存储位置。,20,任务的基本概念,把一个大型任务分解成多个小任务,然后在计算机中通过运行这些小任务,最终达到完成大任务的目的。,在,C/OS-II中,与上述那些小任务对应的程序实体就叫做,“,任务,”,(实质上是一个线程),,C/OS-II就是一个能对这些小任务的运行进行管理和调度的多任务操作系统。,从应用程序设计的角度来看,,C/OS-II的任务就是一个用户编写的C函数和与之相关联的一些数据结构而构成的一个实体,。,任务代码,任务堆栈,内存,在内存中应该,存有任务的代,码和与该任务,配套的堆栈,21,任务切换过程,获得待运行任务的任务控制块,恢复待运行任务的运行环境,处理器的PC=任务堆栈中的断点地址,处理器的SP=任务块中保存的SP,如何获得待运行任务的任务控制块?,22,小结,一个完整的任务应该有如下三部分:,任务代码(程序),任务的私有堆栈(用以保护运行环境),任务控制块,(提供私有堆栈也是虚拟处理器的位置),这些都是任务方应该提供的基本信息。,23,C/OS-II,中,的,任务管理,24,任务的状态及其转换,正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把CPU的使用权让给别的任务而使任务进入等待状态,。,任务在没有被配备任务控制块或被剥夺了任务控制块时的状态叫做任务的睡眠状态,系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,这时任务的状态叫做就绪状态。,处于就绪状态的任务如果经调度器判断获得了,CPU,的使用权,则任务就进入运行状态,一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序,这时任务的状态叫做中断服务状态,25,前面谈到,一个任务的任务控制块,的主要作用就是保存该任务的虚拟,处理器的堆栈指针寄存器SP。,其实,随着任务管理工作的复杂性,的提高,它还应该保存一些其他信,息。,任务控制块,任务在系统中的身份证,由于系统存在着多个任务,于是,系统如何来识别并管理一个任务就是,一个需要解决的问题。识别一个任务,的最直接的办法是为每一个任务起一,个名称。,由于,C/OS-II中的任务都有一个,惟一的优先级别,因此,C/OS-II是用,任务的优先级来作为任务的标识,的。,所以,任务控制块还要来,保存该,任务的优先级别,。,另外,前面也谈到,一个任务在,不同的时刻还处于不同的状态,,显然,记录了任务,状态,的数据也,应该保存到任务控制块中。,基于上述原因,系统必须为每个任务创建,一个保存与该任务有关的相关信息的数据,结构,这个数据结构就叫做该任务的任务,控制块(TCB)。,任务控制块结构的主要成员,typedef struct os_tcb,OS_STK *OSTCBStkPtr,;,/指向任务堆栈栈顶的指针,INT8U OSTCBStat,;,/任务的当前状态标志,INT8U OSTCBPrio,;,/任务的优先级别,OS_TCB,;,任务控制块是不是像,我们人在一个国家中,的,身份证,?(其实,,系统中的所有资源,都应该有身份证。),26,任务在内存中的结构,27,用户任务代码的,一般结构,void MyTask(void*pdata),for(;),可以被中断的用户代码;,OS_ENTER_CRITICAL();,/进入临界段(关中断),不可以被中断的用户代码;,OS_EXIT_CRITICAL();,/退出临界段(开中断),可以被中断的用户代码;,临界段,无限循环,于是可以这样说,,C/OS-II任务的,代码结构是一个可以带有临界段的无限循环,。,28,系统提供的,空闲任务,在多任务系统运行时,系统经常会在某个时间内无用户任务可运行而处于所谓的空闲状态,为了使CPU在没有用户任务可执行的时候有事可做,,C/OS-II提供了一个叫做空闲任务,OSTaskIdle(),的系统任务,void OSTaskIdle(void*pdata),#if OS_CRITICAL_METHOD=3,OS_CPU_SR cpu_sr;,#endif,pdata=pdata;,/防止某些编译器报错,for(;),OS_ENTER_CRITICAL();,/关闭中断,OSdleCtr+;,/计数,OS_EXIT_CRITICAL();,/开放中断,空闲任务只是做了一个计数工作,注意!空闲任务中没有调用任务延时函数,C/OS-II,规定,一个用户应用程序必须使用这个空闲任务,而且这个任务是不能用软件来删除的,29,系统提供的另一个任务,统计任务,C/OS-II提供的另一个系统任务是统计任务,OSTaskStat(),。这个统计任务每秒计算一次CPU在单位时间内被使用的时间,并把计算结果以百分比的形式存放在变量OSCPUsage中,以便应用程序通过访问它来了解CPU的利用率,所以这个系统任务,OSTaskStat(),叫做统计任务,30,任务的优先权,及优先级别,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,自动赋给统计任务,因此用户任务可以使用的优先级别是:0,1,2,OS_LOWEST_PRIO-2,共OS_LOWEST_PRIO-1个,31,任 务 堆 栈,保存CPU寄存器中的内容及存储任务私有数据的需要,每个任务都应该配有自己的堆栈,任务堆栈是任务的重要的组成部分,在应用程序中定义任务堆栈的栈区非常简单,即定义一个OS_STK类型的一个数组并在创建一个任务时把这个数组的地址赋给该任务就可以了。,例如:,/定义堆栈的长度,#defineTASK_STK_SIZE 512,/定义一个数组来作为任务堆栈,OS_STK TaskStkTASK_STK_SIZE;,typedef unsigned int OS_STK;,/这是系统定义的一个数据类型,void main(void),OSTaskCreate(,MyTask,/任务的指针,&MyTaskAgu,/传递给任务的参数,&MyTaskStkMyTaskStkN-1,/任务堆栈栈顶地址,20,/任务的优先级别,);,在创建用户任务时,要传递任务的堆栈指针和任务优先级别,使用函数OSTaskCreate()创建任务时,一定要注意所使用的处理器对堆栈增长方向的支持是向上的还是向下的,32,任务堆栈的初始化,应用程序在创建一个新任务的时候,必须把在系统启动这个任务时CPU各寄存器所需要的初始数据(任务指针、任务堆栈指针、程序状态字等等),事先存放在任务的堆栈中,C/OS-II在创建任务函数OSTaskCreate()中通过调用任务堆栈初始化函数,OSTaskStkInit(),来完成任务堆栈初始化工作的,它的原型如下:,OS_STK*OSTaskStkInit(,void(*task)(void*pd),void*pdato,OS_STK*ptos,INT16U opt,);,由于各种处理器的寄存器及对堆栈的操作方式不尽相同,因此该函数需要用户在进行,C/OS-II的移植时,按所使用的处理器由用户来编写。实现这个函数的具体细节,将在本书有关,C/OS-II移植的章节中做进,一步的介绍,其实,任务堆栈的初始化就是对该任务的虚拟处理器的,初始化(复位),。,33,任务控制块 (OS_TCB),及任务控制块链表,C/OS-II用来记录任务的堆栈指针、任务的当前状态、任务的优先级别等一些与任务管理有关的属性的表就叫做,任务控制块,任务控制块就相当于是一个任务的身份证,没有任务控制块的任务是不能被系统承认和管理的,任务控制块结构的主要成员,typedef struct os_tcb,OS_STK *OSTCBStkPtr,;,/指向任务堆栈栈顶的指针,struct os_tcb*OSTCBNext,;,/指向后一个任务控制块的指针,struct os_tcb*OSTCBPrev;,/指向前一个任务控制块的指针,INT16U OSTCBDly,;,/任务等待的时限(节拍数),INT8U OSTCBStat,;,/任务的当前状态标志,INT8U OSTCBPrio,;,/任务的优先级别,OS_TCB,;,任务控制块链表,空任务控制块链表,当应用程序调用函数OSTaskCreate()创建一个任务时,这个函数会调用系统函数OSTCBInit()来为任务控制块进行初始化。这个函数首先为被创建任务从空任务控制块链表获取一个任务控制块,然后用任务的属性对任务控制块各个成员进行赋值,最后再把这个任务控制块链入到任务控制块链表的头部,当进行系统初始化时,初始化函数会按用户提供的任务数为系统创建具有相应数量的任务控制块并把它们链接为一个链表。,由于这些任务控制块还没有对应的任务,故这个链表叫做空任务块链表。即相当于是一些空白的身份证。,34,任务就绪表,及,任务调度,多任务操作系统的核心工作就是任务调度。,所谓调度,就是通过一个算法在多个任务中确定该运行的任务,做这项工作的函数就叫做调度器。,C/OS_II,进行任务调度的思想是,“,近似地每时每刻总是让优先级最高的就绪任务处于运行状态,”,。为了保证这一点,它,在系统或用户任务调用系统函数及执行中断服务程序结束时总是调用调度器,来确定应该运行的任务并运行它,。,C/OS_II进行任务调度的依据就是,任务就绪表,为了能够使系统清楚地知道,,,系统中哪些任务已经就绪,哪些还没有就绪,,C/OS_II在RAM中设立了一个记录表,,系统中的每个任务都在这个表中占据一个位置,并用这个位置的状态(1或者0)来表示任务是否处于就绪状态,,这个表就叫做任务就绪状态表,简称叫任务就绪表,任务就绪表就是一个二维数组OSRdyTbl,35,为加快访问任务就绪表的,速度,系统定义了一个变,量OSRdyGrp来表明就绪表,每行中是否存在就绪任务。,36,OSRdyTbl,1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0,1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0,1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0,1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0,1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0,1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0,1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0,1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0,OSRdyGrp,D,7,D,6,D,5,D,4,D,3,D,2,D,1,D,0,1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0,任务就绪表的示意图,0,1,2,3,4,5,6,7,x,y,0,1,2,3,4,5,6,7,37,OSRdyGrp,D,7,D,6,D,5,D,4,D,3,D,2,D,1,D,0,1,1,1,1,0,0,0,0,prio=29,D,7,D,6,D,5,D,4,D,3,D,2,D,1,D,0,1,D,7,D,6,D,5,D,4,D,3,D,2,D,1,D,0,1,OSRdyTbl3,把prio为29的任务置为就绪状态,Y,X,OSRdyGrp|=OSMapTblprio3;,OSRdyTblprio3,|=OSMapTblprio,在程序中,可以用类似下面的代码把优先级别为prio的任务置为就绪状态:,OSRdyGrp|=OSMapTblprio3;,OSRdyTblprio3|=OSMapTblprio,如果要使一个优先级别为prio的任务脱离就绪状态则可使用如下类似代码:,if(OSRdyTblprio3&=,OSMapTblprio&0 x07)=0),OSRdyGrp&=,OSMapTblprio3;,38,OSRdyGrp,D,7,D,6,D,5,D,4,D,3,D,2,D,1,D,0,1,1,1,1,0,0,0,0,prio=29,D,7,D,6,D,5,D,4,D,3,D,2,D,1,D,0,1,D,7,D,6,D,5,D,4,D,3,D,2,D,1,D,0,1,OSRdyTbly,x=,OSUnMapTalOSRdyTbly;,1,1,0,0,0,0,0,0,0,0,0,0,0,0,y=OSUnMapTalOSRdyGrp;,图5-6 在就绪表中查找最高优先级别任务的过程,从任务就绪表中获取优先级别最高的就绪任务可用如下类似的代码:,y=OSUnMapTalOSRdyGrp,;,/D,5,、D,4,、D,3,位,x=OSUnMapTalOSRdyTbly,;,/D,2,、D,1,、D,0,位,prio=(y3)+x,;,/优先级别,或,y=OSUnMapTblOSRdyGrp;,prio=(INT8U)(y 3),+OSUnMapTblOSRdyTbly);,39,优先级判定表OSUnMapTbl256(os_core.c),INT8U const OSUnMapTbl=,0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,;,举例:,如OSRdyGrp的值为00101000B,即0X28,则查得OSUnMapTblOSRdyGrp的值是3,它相应于OSRdyGrp中的第3位置1;,如OSRdyTbl3的值是11100100B,即0XE4,则查OSUnMapTblOSRdyTbl3的值是2,则进入就绪态的最高任务优先级,Prio=3*8+2=26,40,小结,系统通过查找任务就绪表来,获取待运行任务的优先级,优先级,41,任务切换过程,获得待运行任务的任务控制块,恢复待运行任务的运行环境,处理器的PC=任务堆栈中的断点地址,处理器的SP=任务块中保存的SP,如何获得待运行任务的任务控制块?,根据,就绪表,获得待运行任务的,任务控制块指针,其实,调度器在进行调度时,在这个位置还要进行一下判断:究竟是待运行任务是否为当前任务,如果是,则不切换;如果不是才切换,而且还要保存被中止任务的运行环境。,42,1,任务切换宏,OS_TASK_SW(),任务切换就是中止正在运行的任务(当前任务),转而去运行另外一个任务的操作,当然这个任务应该是就绪任务中优先级别最高的那个任务,先保护被中止任务的断点数据,后恢复待运行任务的断点数据,不要企图用PUSH和POP指令来使程序计数器PC压栈和出栈,因为没有这样的指令。,只好变通一下了。,中断动作和过程调用指令可以使PC压栈;,中断返回指令可以使PC出栈。,因此任务切换,OSCtxSw(,),必定是一个中断服务程序。,需要由宏,OS_TASK_SW(),来引发一次中断或者一次调用来使,OSCtxSw(,),执行任务切换工作,43,调度时机,很容易想到的调度时机就,是定时调度。,对于实时系统来说,应该尽,可能地实现即时调度。,44,用函数OSTaskCreate(),创建任务,应用程序通过调用OSTaskCreate()函数来创建一个任务,OSTaskCreate()函数的原型如下:,INT8U OSTaskCreate(,void(*task)(void*pd),/指向任务的指针,void*pdata,/传递给任务的参数,OS_STK*ptos,/指向任务堆栈栈顶的指针,INT8U prio/任务的优先级,),45,创建任务,的一般方法,一般来说,任务可以在调用函数OSStart()启动任务调度之前来创建,也可以在任务中来创建。但是,,C/OS-II有一个规定:在调用启动任务函数OSStart()之前,必须已经创建了至少一个任务。因此,人们习惯上在调用函数OSStart()之前先创建一个任务,并赋予它最高的优先级别,从而使它成为起始任务。然后在这个起始任务中,再创建其他各任务。,如果要使用系统提供的统计任务,则统计任务的初始化函数也必须在这个起始任务中来调用,void main(void),OSInit();,/对,C/OS-II进行初始化,OSTaskCreate(TaskStart,),;,/创建任务TaskStart,OSStart(),;,/开始多任务调度,void TaskStart(void*pdata),/在这个位置安装并启动,C/OS-II的时钟,OSStatInit();,/初始化统计任务,/在这个位置创建其他任务,for(;),起始任务TaskStart的代码,46,C/OS-II的,初始化,在使用,C/OS-II的所有服务之前,必须要调用,C/OS-II的初始化函数OSInit()对,C/OS-II自身的运行环境进行初始化,。,函数OSInit()将对,C/OS-II的所有的全局变量和数据结构进行初始化,同时创建空闲任务OSTaskIdle,并赋之以最低的优先级别和永远的就绪状态。如果用户应用程序还要使用统计任务的话(常数OS_TASK_STAT_EN=1),则OSInit()还要以优先级别为OS_LOWEST_PRIO-1来创建统计任务,初始化函数OSInit()对数据结构进行初始化时,主要要创建包括空任务控制块链表在内的5个空数据缓冲区。同时,为了可以快速地查询任务控制块链表中的各个元素,初始化函数OSInit()还要创建一个数组OSTCBPrioTblOS_LOWEST_PRIO+1,在这个数组中,按任务的优先级别的顺序把任务控制块的指针存放在了对应的元素中,47,C/OS-II的启动,C/OS-II进行任务的管理是从调用启动函数OSStart()开始的,当然其前提条件是在调用该函数之前至少创建了一个用户任务,48,第3章,C/OS-,的中断和时钟,49,本章主要内容:,50,C/OS-II系统,响应中断的过程,C/OS-II系统响应中断的过程为:系统接收到中断请求后,这时如果CPU处于中断允许状态(即中断是开放的),系统就会中止正在运行的当前任务,而按照中断向量的指向转而去运行中断服务子程序;当中断服务子程序的运行结束后,系统将会根据情况返回到被中止的任务继续运行或者转向运行另一个具有更高优先级别的就绪任务。,注意!,中断服务子程序运行结束之后,系统将会根据情况进行一次任务调度去运行优先级别最高的就绪任务,而并不是一定要接续运行被中断的任务的,。,51,中断请求,关闭中断,转到中断向量,保存CPU寄存器,通知内核退出ISR,ISR给任务发信号,中断返回,恢复CPU寄存器,中断响应,中断恢复,中断恢复,任务响应时间,任务响应时间,中断的响应过程,无新高级任务则返回原任务,通知内核退出ISR,恢复CPU寄存器,中断返回,有新高级任务则运行高级任务,通知内核进入ISR,52,void OSIntEnter(void),if(OSRunning=TRUE),if(OSIntNesting 0),OSIntNesting-;/中断嵌套层数计数器减一,if(OSIntNesting=0)&(OSLockNesting=0),OSIntExitY=OSUnMapTblOSRdyGrp;,OSPrioHighRdy=(INT8U)(OSIntExitY OSTCBStkPtr;,/SP指向待运行任务堆栈,用出栈指令把R1,R2,弹入CPU的通用寄存器;,RETI;,/中断返回,使PC指向待运行任务,54,应用程序中的,临界段,在应用程序中经常有一些代码段必须不受任何干扰地连续运行,这样的代码段叫做临界段。因此,为了使临界段在运行时不受中断所打断,在临界段代码前必须用关中断指令使CPU屏蔽中断请求,而在临界段代码后必须用开中断指令解除屏蔽使得CPU可以响应中断请求,由于各厂商生产的CPU和C编译器的关中断和开中断的方法和指令不尽相同,为增强,C/OS-II的可移植性(即在,C/OS-II的各个C函数中尽可能地不出现汇编语言代码),,C/OS-II用两个宏来实现中断的开放和关闭,而把与系统的硬件相关的关中断和开中断的指令分别封装在这两个宏中:,OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL(),第一种方法最简单,即直接使用处理器的开中断和关中断指令来实现宏,这时需要令常数OS_CRITICAL_METHOD=1。其示意性代码为:,#define OS_ENTER_CRITICAL(),asm(“DI”),关中断,#define OS_EXIT_CRITICAL(),asm(“EI”),开中断,第二种方法稍微复杂一些,但可以使CPU中断允许标志的状态,在临界段前和临界段后不发生改变。在宏OS_ENTER_CRITICAL()中,把CPU的允许中断标志保持到堆栈中,然后再关闭中断,这样在临界段结束时,即在调用宏OS_EXIT_CRITICAL()时只要把堆栈中保存的CPU允许中断状态恢复就可以了。这两个宏的示意性代码如下,:,#define OS_ENTER_CRITICAL(),asm(“PUSHPSW”),/*通过保存程序状态字来保存中,断允许标志*/,asm(“DI”),/关中断,#define OS_EXIT_CRITICAL(),asm(“POPPSW”),/恢复中断允许标志,55,C/OS-II的,系统时钟,C/OS-II与大多数计算机系统一样,用硬件定时器产生一个周期为ms级的周期性中断来实现系统时钟,最小的时钟单位就是两次中断之间相间隔的时间,这个最小时钟单位叫做,时钟节拍,(Time Tick)。,硬件定时器以时钟节拍为周期定时地产生中断,该中断的中断服务程序叫做OSTickISR()。中断服务程序通过调用函数OSTimeTick()来完成系统在每个时钟节拍时需要做的工作,。,void OSTickISR(void),保存CPU寄存器;,调用OSIntEnter();,/记录中断嵌套层数,if(OSIntNesting=1;,OSTCBCur-OSTCBStkPtr=SP;,/保存堆栈指针,调用OSTimeTick();,/节拍处理,清除中断;,开中断;,调用OSIntExit();,/中断嵌套层数减一,恢复CPU寄存器;,中断返回;,这是系统时钟中断服务程序,void OSTimeTick(void),OSTimeTickHook();,OSTime+;,/记录节拍数,if(OSRunning=TRUE),ptcb=OSTCBList;,while(ptcb-OSTCBPrio!=OS_IDLE_PRIO),OS_ENTER_CRITICAL();,if(ptcb-OSTCBDly!=0),if(-ptcb-OSTCBDly=0),/任务的延时时间减一,if(ptcb-OSTCBStat&OS_STAT_SUSPEND),=OS_STAT_RDY),OSRdyGrp|=ptcb-OSTCBBitY;,OSRdyTblptcb-OSTCBY,|=ptcb-OSTCBBitX;,else,ptcb-OSTCBDly=1;,ptcb=ptcb-OSTCBNext;,OS_EXIT_CRITICAL();,时钟节拍服务函数,函数OSTimeTick()的任务,就是,在每个时钟节拍了解每个任务的延时状态,使其中已经到了延时时限的非挂起任务进入就绪状态,。,56,任务的延时,由于嵌入式系统的任务是一个无限循环,并且,C/OS-II,还是一个抢占式内核,所以为了使高优先级别的任务不至于独占,CPU,,可以给其他任务优先级别较低的任务获得,CPU,使用权的机会,,C/OS-II,规定:,除了空闲任务之外的所有任务必须在任务中合适的位置调用系统提供的函数OSTimeDly(),使当前任务的运行延时(暂停)一段时间并进行一次任务调度,以让出CPU的使用权。,void OSTimeDly(INT16U ticks),#if OS_CRITICAL_METHOD=3,OS_CPU_SR cpu_sr;,#endif,if(ticks 0),OS_ENTER_CRITICAL();,if(OSRdyTblOSTCBCur-OSTCBY,&=OSTCBCur-OSTCBBitX)=0),OSRdyGrp,/,取消当前任务的就绪状态,OSTCBCur-OSTCBDly=ticks;,/延时节拍数存入任务控制块,OS_EXIT_CRITICAL();,OS_Sched();,/,调用调度函数,这是系统提供的延时函数,57,其他用来管理时间的函数,INT8U,OSTimeDlyResume,(INT8U prio);,INT32U OSTimeGet(void);,void OSTimeSet(INT32U ticks);,取消任务延时函数,获得系统时间函数,设置系统时间函数,58,第4章,任务的同步与通信,系统中的多个任务在运行时,经常需要互相无冲突地访问同一个共享资源,或者需要互相支持和依赖,甚至有时还要互相加以必要的限制和制约,才保证任务的顺利运行。因此,操作系统必须具有对任务的运行进行协调的能力,从而使任务之间可以无冲突、流畅地同步运行,而不致导致灾难性的后果。,与人们依靠通信来互相沟通,从而使人际关系和谐、工作顺利的做法一样,计算机系统是依靠任务之间的良好通信来保证任务与任务的同步的。,例如,两个任务:任务A和任务B,它们需要通过访问同一个数据缓冲区合作完成一项工作,任务A负责向缓冲区写入数据,任务B负责从缓冲区读取该数据。显然,当任务A还未向缓冲区写入数据时(缓冲区为空时),任务B因不能从缓冲区得到有效数据而应该处于等待状态,只有等任务A向缓冲区写入了数据之后,才应该通知任务B去取数据。,例如,任务A和任务B共享一台打印机,如果系统已经把打印机分配给了任务A,则任务B因不能获得打印机的使用权而应该处于等待状态,只有当任务A把打印机释放后,系统才能唤醒任务B使其获得打印机的使用权。如果这两个任务不这样做,那么也会造成极大的混乱,。,总之,多个任务共享同一资源或有工作顺序要求时,在正式工作之前要互相打招呼,。,黄宏:别走啊!,宋丹丹:我自己的腿,我爱走就走,你管不着!,黄宏:腿是你自己的,但手是咱俩的呀!,59,事件,任务间的同步依赖于任务间的通信。在,C/OS-II中,是使用信号量、邮箱(消息邮箱)和消息队列这些被称作事件的中间环节来实现任务之间的通信的,。,宋丹丹,黄宏,60,一个简单的信号量,1/0,收信方,发信方,共享资源,61,事件控制块,为了把描述事件的数据结构统一起来,,C/OS-II使用叫做事件控制块ECB的数据结构来描述诸如信号量、邮箱(消息邮箱)和消息队列这些事件。事件控制块中包含包括等待任务表在内的所有有关事件的数据,typedef struct,INT8U OSEventType;/事件的类型,INT16U OSEventCnt;/信号量计数器,void*OSEventPtr;/消息或消息队列的
    展开阅读全文
    提示  咨信网温馨提示:
    1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
    2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
    3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
    4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
    5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
    6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

    开通VIP折扣优惠下载文档

    自信AI创作助手
    关于本文
    本文标题:ucOS-II入门经典教程PPT学习课件.ppt
    链接地址:https://www.zixin.com.cn/doc/11692582.html
    页脚通栏广告

    Copyright ©2010-2025   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork