第6章μCOSII程序设计基础.ppt
《第6章μCOSII程序设计基础.ppt》由会员分享,可在线阅读,更多相关《第6章μCOSII程序设计基础.ppt(138页珍藏版)》请在课桌文档上搜索。
1、C/OS-II程序设计基础,C/OS-II程序设计基础,绪论,本章重点介绍C/OS-II V2.52版本嵌入式实时操作系统常用函数的基本用法,其最大的特点不仅示例程序简洁明了,而且电路也非常简单(如下图),希望初学者一看就懂、一学就会,达到快速入门的目的。,注意:本章所有应用示例都全部默认采用这个图,主要是为了尽量简化示例程序,提高可读性,使用简单明了的语言和方法来解析复杂的理论知识,这是作者在多年的学习、工作和教学中一直倡导的风格和习惯性的行为,同时这也是写作本书的出发点。,目 录,任务设计,系统函数使用场合,系统函数概述,时间管理,事件的一般使用规则,系统管理,互斥信号量,信号量,事件标志
2、组,消息邮箱,动态内存管理,消息队列,C/OS-II程序设计基础,任务设计,任务的分类,任务的优先级,任务的划分,任务设计|C/OS-II程序设计基础,任务设计,在基于实时操作系统的应用程序设计中,任务设计是整个应用程序的基础,其它软件设计工作都是围绕任务设计来展开。,任务设计,应用程序,设计“任务函数”和相关的数据结构,其他软件工作,任务设计|C/OS-II程序设计基础,任务的分类,任务,按照执行方式分类,任务设计|C/OS-II程序设计基础,任务的分类,1.单次执行类任务,void MyTask(void*pdata)进行准备工作的代码;任务实体代码;调用任务删除函数;,任务设计|C/OS
3、-II程序设计基础,任务的分类,执行状态,等待状态,就绪状态,void MyTask(void*pdata)进行准备工作的代码;while(1)任务实体代码;调用系统延时函数;,延时时间到,2.周期执行类任务,任务优先级足够高,任务设计|C/OS-II程序设计基础,任务的分类,3.事件触发执行类任务,void MyTask(void*pdata)进行准备工作的代码;while(1)调用获取事件的函数;任务实体代码;,任务优先级足够高,任务设计|C/OS-II程序设计基础,任务的划分,1.任务划分的目标,在对一个具体的嵌入式应用系统进行任务划分时,可以有不同的任务划分方案。为了选择最佳划分方案,
4、就必须知道任务划分的目标。,高效率的系统,1.首要目标是满足“实时性”指标:即使在最坏的情况下,系统中所有对实时性有要求的功能都能够正常实现;,3.简化软件系统:一个任务要实现其功能,除了需要操作系统的调度功能支持外,还需要操作系统的其它服务功能支持,合理划分任务,可以减少对操作系统的服务要求,简化软件系统;,4.降低资源需求:合理划分任务,减少或简化任务之间的同步和通信需求,就可以减少相应数据结构的内存规模,从而降低对系统资源的需求。,2.任务数目合理:对于同一个应用系统,合理的合并一些任务,使任务数目适当少一些还是比较有利;,任务设计|C/OS-II程序设计基础,任务的划分,2.任务划分的
5、方法,任务的划分方法,请参考下一章“基于LPC2000的电脑自动打铃器设计与实现”。,传递性:信息传递的上游任务的优先级高于下游任务的优先级。如信号采集任务的优先级高于数据处理任务的优先级。,紧迫性:因为紧迫任务对响应时间有严格要求,在所有紧迫任务中,按响应时间要求排序,越紧迫的任务安排的优先级越高。紧迫任务通常与ISR关联;,关键性:任务越关键安排的优先级越高,以保障其执行机会;,中断关联性:与中断服务程序(ISR)有关联的任务应该安排尽可能高的优先级,以便及时处理异步事件,提高系统的实时性。如果优先级安排得比较低,CPU有可能被优先级比较高的任务长期占用,以致于在第二次中断发生时连第一次中
6、断还没有处理,产生信号丢失现象;,频繁性:对于周期性任务,执行越频繁,则周期越短,允许耽误的时间也越短,故应该安排的优先级也越高,以保障及时得到执行;,快捷性:在前面各项条件相近时,越快捷(耗时短)的任务安排的优先级越高,以使其它就绪任务的延时缩短;,任务设计|C/OS-II程序设计基础,任务的优先级,任务的优先级安排原则如下:,紧迫性,任务优先级,关键性,中断关联性,快捷性,频繁性,传递性,C/OS-II程序设计基础,系统函数概述,基本原则,系统函数的分类,系统函数概述|C/OS-II程序设计基础,基本原则,1.配对性原则,对于C/OS-II来说,大多数API都是成对的,而且一部分必须配对使
7、用。当然,查询状态的系统函数一般不需要配对使用,而且部分API如延时,也不需要配对使用。配对的函数见下表。,系统函数概述|C/OS-II程序设计基础,基本原则,2.中断服务程序调用函数的限制,中断服务程序不能调用可能会导致任务调度的函数,它们主要是一些等待事件的函数,这些函数及其替代函数见下表。,注意:未列入表中的函数OSTaskCreate()、OSTaskCreateExt()、OSTaskDel()、OSTaskResume()、OSTaskChangePrio()、OSTaskSuspend()、OSTimeDly()、OSTimeDlyHMSM()、OSTimeResume()都属于
8、在中断服务程序中禁止调用的函数。,系统函数概述|C/OS-II程序设计基础,基本原则,1.创建事件和删除事件的函数。,一些函数虽然没有明确地规定不能被中断服务程序调用,但因为中断服务程序的特性,一般不会使用。,2.与任务相关的函数OSTaskChangePrio()、OSTaskDelReq()、OSTaskStkChk()和OSTaskQuery()。至于函数OSSchedLock()和OSSchedUnlock(),在中断服务程序中使用没有任何意义。,系统函数概述|C/OS-II程序设计基础,基本原则,3.任务必须调用某个系统函数,因为C/OS-II是完全基于优先级的操作系统,所以在一定的
9、条件下必须出让CPU占有权以便比自己优先级更低的任务能够运行,这是通过调用部分系统函数来实现的,这些函数见下表。一般的任务必须调用表中至少一个函数,只有一种情况例外,就是单次执行的任务,因为任务删除后肯定出让CPU,所以可以不调用表中的函数。,一般的操作系统都提供时间管理的函数,最基本的就是延时函数,C/OS-II也不例外,C/OS-II所具有的时间管理函数见下表。,C/OS-II具有简单的动态内存管理能力。C/OS-II的动态内存管理函数见下表。,任务管理函数是操作与任务相关功能的函数,详见下表。,系统管理函数是一些与C/OS-II内核或功能相关的一些函数,详见下表。,C/OS-II的初始化
10、函数有2个:OSInit()和OSStart(),它们不能在任何任务和中断服务程序中使用,仅在main()函数中按照一定的规范被调用,其中OSInit()函数初始化C/OS-II内部变量,OSStart()函数启动多任务环境。,C/OS-II把信号量等都称为事件,管理它们的就是事件管理函数。C/OS-II V2.52具有的事件有普通信号量、互斥信号量、事件标志组、消息邮箱和消息队列,这些都是C/OS-II用于同步与通讯的工具,本章后述的内容将会详细介绍。,系统函数概述|C/OS-II程序设计基础,系统函数的分类,根据功能分类,C/OS-II程序设计基础,系统函数使用场合,时间管理,行为同步,资
11、源同步,系统函数使用场合|C/OS-II程序设计基础,时间管理,1.控制任务的执行周期,void MyTask(void*pdata)进行准备工作的代码;while(1)任务实体代码;调用系统延时函数;,注意:延时函数OSTimeDly()是以系统节拍数为参数,而延时函数OSTimeDlyHMSM()是以实际时间值为参数,但在执行过程中仍然转换为系统节拍数。如果实际时间不是系统节拍的整数倍,将进行四舍五入处理。设系统节拍为50毫秒,调用OSTimeDly(20)的效果是延时1秒钟,调用OSTimeDlyHMSM(0,1,27,620)的实际时间是延时1分27秒600毫秒。,在任务函数的代码中可
12、以通过插入延时函数来控制任务周期性运行,定时闲置CPU一段时间,供其它任务使用。,系统函数使用场合|C/OS-II程序设计基础,时间管理,2.控制任务的运行节奏,在任务函数的代码中也可以通过插入延时函数来控制任务的运行节奏。,void MyTask(void*pdata)进行准备工作的代码;while(1)调用获取事件的函数;第一部分操作代码;调用系统延时函数;第二部分操作代码;调用系统延时函数;第三部分操作代码;,各种时间顺序控制任务可以用这种结构的任务函数实现。,系统函数使用场合|C/OS-II程序设计基础,时间管理,3.状态查询,查询过程是一个无限循环过程,只有当希望的状态出现以后才能退
13、出这个无限循环,这种情况在实时操作系统管理下是不允许的,它将剥夺低优先级任务的运行机会。解决这个问题的办法是“用定时查询代替连续查询”。,void MyTask(void*pdata)进行准备工作的代码;while(1)while(查询的条件不成立)调用系统延时函数;其它处理代码;,系统函数使用场合|C/OS-II程序设计基础,资源同步,任务1,任务2,释放,释放,1.“资源同步”图解,1.使用关中断:通过调用禁止中断函数OS_ENTER_CRITICAL()和允许中断函数OS_EXIT_CRITICAL()实现的。,2.使用关调度:通过调用禁止任务调度函数OSSchedLock()和允许任务
14、调度函数OSSchedUnlock()实现的,因为禁止调度违背了多任务的初衷,所以不建议用户使用。,3.使用信号量与互斥信号量:通过等待信号量和发送信号量实现共享资源的独享。,系统函数使用场合|C/OS-II程序设计基础,资源同步,2.“资源同步”实现方式,系统函数使用场合|C/OS-II程序设计基础,行为同步,任务1,任务2,一个任务的运行过程需要和其它任务的运行配合,才能达到预定的效果,任务之间的这种动作配合和协调关系称为“行为同步”。,任务优先级足够高,1.行为同步,信号量,事件标志组,消息邮箱,消息队列,任务之间的通讯,同步,系统函数使用场合|C/OS-II程序设计基础,行为同步,2.
15、数据通信,注意:尽管指针可能是局部变量,但只要指针指向的变量是全局变量,操作指针指向的变量时也需要当作全局变量来处理。,C/OS-II程序设计基础,时间管理,系统延时函数OSTimeDly(),强制延时的任务结束延时OSTimeDlyResume(),系统延时函数OSTimeDlyHMSM(),获得系统时间OSTimeGet()和设置系统时间OSTimeSet(),时间管理|C/OS-II程序设计基础,概述,C/OS-II提供了若干个时间管理服务函数,可以满足任务在运行过程中对时间管理的需求。在使用时间管理服务函数时,必须十分清楚一个事实:时间管理服务函数是以系统节拍为处理单位的,实际的时间与
16、希望的时间是有误差的,最坏的情况下误差接近一个系统节拍。因此时间管理服务函数只能用在对时间精度要求不高的场合,或者时间间隔较长的场合。,时间管理|C/OS-II程序设计基础,OSTimeDly(),系统延时函数OSTimeDly()调用图解,当前任务优先级为就绪态中最高,延时时间到,延时的长短是由时钟节拍的数目来确定,时间管理|C/OS-II程序设计基础,OSTimeDly(),下面我们设计一个任务,让一个LED以50个时钟节拍为单位闪耀,说明OSTimeDly()函数的用途。由于篇幅关系,只给出任务主要处理代码。,void TaskLED(void*pdata)while(1)IO0CLR=
17、LED1;OSTimeDly(25);IO0SET=LED1;OSTimeDly(25);,注意:上面的设计是OSTimeDly()控制任务的周期性执行,还可以用它来控制任务的运行节拍。,时间管理|C/OS-II程序设计基础,OSTimeDlyHMSM(),C/OS-提供了OSTimeDlyHMSM()系统延时函数,这个函数是以小时(H)、分(M)、秒(S)和毫秒(m)四个参数来定义延时时间的,函数在内部把这些参数转换为时钟节拍,再通过单次或多次调用OSTimeDly()进行延时和任务调度,所以延时原理和调用延时函数OSTimeDly()是一样的。OSTimeDlyHMSM()详细见下表。,时
18、间管理|C/OS-II程序设计基础,OSTimeDlyHMSM(),为了说明OSTimeDlyHMSM()函数的使用方法,下面我们设计一个任务,让一个LED以2Hz的频率闪耀。下面给出任务主要处理代码。,void TaskLED(void*pdata)while(1)IO0CLR=LED1;OSTimeDlyHMSM(0,0,0,250);IO0SET=LED1;OSTimeDlyHMSM(0,0,0,250);,注意:上面的设计是OSTimeDlyHMSM()控制任务的周期性执行,还可以用它来控制任务的运行节拍。,时间管理|C/OS-II程序设计基础,OSTimeDlyResume(),当前
19、任务优先级为就绪态中最高,调用OSTimeDlyResume(),C/OS-允许用户结束正处于延时期的任务,延时的任务可以不等待延时期满,而是通过取消其它任务的延时来使自己处于就绪态,可以通过调用OSTimeDlyResume()和指定要恢复的任务的优先级来完成。,时间管理|C/OS-II程序设计基础,OSTimeDlyResume(),OSTimeDlyResume()的具体信息见下表。,时间管理|C/OS-II程序设计基础,OSTimeDlyResume(),为了说明OSTimeDlyResume()函数的使用方法,我们设计一个系统,假设TaskLED的任务优先级为2。让一个LED以0.5
20、Hz的频率闪耀,但每按键一次,LED状态翻转一次。下面是两个任务的处理流程。,时间管理|C/OS-II程序设计基础,OSTimeDlyResume(),TaskLED任务代码如下。,void TaskLED(void*pdata)while(1)IO0CLR=LED1;OSTimeDly(OS_TICKS_PER_SEC);IO0SET=LED1;OSTimeDly(OS_TICKS_PER_SEC);,时间管理|C/OS-II程序设计基础,OSTimeDlyResume(),TaskKEY任务的代码如下。,void TaskKEY(void*pdata)while(1)while(IO0PI
21、N,调用OSStart()时初始化计数器为0,计数器满时从0开始计数,时间管理|C/OS-II程序设计基础,OSTimeGet()、OSTimeSet(),无论时钟节拍何时发生,C/OS-都会将一个32位的计数器加1,这个计数器在用户调用OSStart()初始化多任务和4,294,967,295个节拍执行完一遍的时候从0开始计数。,发生时钟节拍,32位计数器,时间管理|C/OS-II程序设计基础,OSTimeGet()、OSTimeSet(),发生时钟节拍,32位计数器,用户可以通过调用OSTimeGet()来获得该计数器的当前值,OSTimeGet()的详细信息见下表。,ticks=n;,调
22、用OSTimeGet(),ticks=OSTimeGet();,return(n),时间管理|C/OS-II程序设计基础,OSTimeGet()、OSTimeSet(),发生时钟节拍,32位计数器,调用OSTimeSet(101),设置计数器值为101,用户可以通过调用OSTimeSet()来改变计数器的值,OSTimeSet()的详细信息见下表。,时间管理|C/OS-II程序设计基础,OSTimeGet()、OSTimeSet(),为了说明OSTimeGet()函数的使用方法,我们设计一个任务,计算两次按键的时间间隔放在全局变量ktime中。下面是任务的处理流程。,时间管理|C/OS-II程
23、序设计基础,OSTimeGet()、OSTimeSet(),TaskKEY任务代码如下。,void TaskKEY(void*pdata)while(1)while(IO0PIN,C/OS-II程序设计基础,系统管理,进入然后退出临界区,禁止然后允许调度,其他任何任务和中断都无法得到CPU,直到退出临界段。保证了临界段代码的运行完整性,系统管理|C/OS-II程序设计基础,进入然后退出临界区,进入然后退出临界段是“资源同步”的方法之一,能够在访问共享资源时保障信息的可靠性和完整性。,为了说明它在”资源同步”时的使用,我们设计一个系统,假设有两个任务,它们都对全局变量sum1和sum2操作。低优
24、先级任务让这两个变量始终相等,并不断在计数;高优先级任务不断的判断这两个变量是否相等,不相等则点亮LED,下面是两个任务的处理流程。,系统管理|C/OS-II程序设计基础,进入然后退出临界区,TaskLED任务代码如下。,void TaskLED(void*pdata)while(1)OS_ENTER_CRITICAL();if(sum1!=sum2)IO0CLR=LED1;OS_EXIT_CRITICAL();OSTimeDly(2);,系统管理|C/OS-II程序设计基础,进入然后退出临界区,TaskAdd任务代码如下。,void TaskAdd(void*pdata)while(1)OS
25、_ENTER_CRITICAL();sum1+;sum2+;OS_EXIT_CRITICAL();OSTimeDly(1);,系统管理|C/OS-II程序设计基础,进入然后退出临界区,3.调用OSSchedLock()以后,用户的应用程序不得使用任何能将现行任务挂起的系统调用,直到配对的OSSchedUnlock()调用为止。,1.OSSchedlock()和OSSchedUnlock()必须成对使用,也可以嵌套使用;,2.OSSchedlock()只是禁止了任务的调度,而没有禁止中断,此时如果允许中断,中断到来时还是会执行对应的中断服务程序;,系统管理|C/OS-II程序设计基础,禁止然后允
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- COSII 程序设计 基础

链接地址:https://www.desk33.com/p-748449.html