第二章_uCOS-II程序设计基础.ppt
《第二章_uCOS-II程序设计基础.ppt》由会员分享,可在线阅读,更多相关《第二章_uCOS-II程序设计基础.ppt(138页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、C/OS-II程序设计基础September,C/OS-II程序设计基础程序设计基础绪论绪论 本章重点介绍C/OS-II V2.52版本嵌入式实时操作系统常用函数的基本用法,其最大的特点不仅示例程序简洁明了,而且电路也非常简单(如下图),希望初学者一看就懂、一学就会,达到快速入门的目的。注意:本章所有应用示例都全部默认采用这个图,主要是为了尽量简化示例程序,提高可读性,使用简单明了的语言和方法来解析复杂的理论知识,这是作者在多年的学习、工作和教学中一直倡导的风格和习惯性的行为,同时这也是写作本书的出发点。硬件去抖目 录任务设计任务设计系统函数使用场合系统函数使用场合系统函数概述系统函数概述时间
2、管理时间管理事件的一般使用规则事件的一般使用规则系统管理系统管理1互斥信号量互斥信号量信号量信号量事件标志组事件标志组消息邮箱消息邮箱动态内存管理动态内存管理消息队列消息队列23465789101211C/OS-II程序设计基础程序设计基础任务设计任务设计任务的任务的分类任务的优先级任务的优先级任务的划分任务的划分123任务设计任务设计|C/OS-II程序设计基础程序设计基础任务设计任务设计 在基于实时操作系统的应用程序设计中,任务设计是整个应用程序的基础,其它软件设计工作都是围绕任务设计来展开。任务设计应用程序设计“任务函数”和相关的数据结构其他软件工作任务设计任务设计|C/OS-II程序设
3、计基础程序设计基础任务的分类任务的分类任务任务单次执行单次执行单次执行单次执行类类类类事件触发事件触发事件触发事件触发类类类类 周期执行周期执行周期执行周期执行类类类类按照执行方式分类任务设计任务设计|C/OS-II程序设计基础程序设计基础任务的分类任务的分类1.单次执行类任务void MyTask(void*pdata)进行准备工作的代码;任务实体代码;调用任务删除函数;运行运行创建删除删除单次执行类任务定义和初始化变量及硬件设备 完成该任务的具体功能 将自己删除,操作系统将不再管理它 任务设计任务设计|C/OS-II程序设计基础程序设计基础任务的分类任务的分类执行状态等待状态就绪状态voi
4、d MyTask(void*pdata)进行准备工作的代码;while(1)任务实体代码;调用系统延时函数;延时时间到延时时间到2.周期执行类任务任任务务优优先先级级足足够够高高任务设计任务设计|C/OS-II程序设计基础程序设计基础任务的分类任务的分类3.事件触发执行类任务void MyTask(void*pdata)进行准备工作的代码;while(1)调用获取事件的函数;任务实体代码;等待信号量或消息运行状态运行状态等待状态等待状态运行状态运行状态就绪状态就绪状态 任务优先级足够高消息完成具体功能任务设计任务设计|C/OS-II程序设计基础程序设计基础任务的划分任务的划分1.任务划分的目标
5、 在对一个具体的嵌入式应用系统进行任务划分时,可以有不同的任务划分方案。为了选择最佳划分方案,就必须知道任务划分的目标。高效率的系统高效率的系统4 43 32 21 11.首首要要目目标标是是满满足足“实实时时性性”指指标标:即使在最坏的情况下,系统中所有对实时性有要求的功能都能够正常实现;3.简简化化软软件件系系统统:一个任务要实现其功能,除了需要操作系统的调度功能支持外,还需要操作系统的其它服务功能支持,合理划分任务,可以减少对操作系统的服务要求,简化软件系统;4.降降低低资资源源需需求求:合理划分任务,减少或简化任务之间的同步和通信需求,就可以减少相应数据结构的内存规模,从而降低对系统资
6、源的需求。2.任任务务数数目目合合理理:对于同一个应用系统,合理的合并一些任务,使任务数目适当少一些还是比较有利;任务设计任务设计|C/OS-II程序设计基础程序设计基础任务的划分任务的划分2.任务划分的方法 任务的划分方法,请参考下一章“基于LPC2000的电脑自动打铃器设计与实现”。传传递递性性:信息传递的上游任务的优先级高于下游任务的优先级。如信号采集任务的优先级高于数据处理任务的优先级。紧紧迫迫性性:因为紧迫任务对响应时间有严格要求,在所有紧迫任务中,按响应时间要求排序,越紧迫的任务安排的优先级越高。紧迫任务通常与ISR关联;关键性:关键性:任务越关键安排的优先级越高,以保障其执行机会
7、;中中断断关关联联性性:与中断服务程序(ISR)有关联的任务应该安排尽可能高的优先级,以便及时处理异步事件,提高系统的实时性。如果优先级安排得比较低,CPU有可能被优先级比较高的任务长期占用,以致于在第二次中断发生时连第一次中断还没有处理,产生信号丢失现象;频频繁繁性性:对于周期性任务,执行越频繁,则周期越短,允许耽误的时间也越短,故应该安排的优先级也越高,以保障及时得到执行;快快捷捷性性:在前面各项条件相近时,越快捷(耗时短)的任务安排的优先级越高,以使其它就绪任务的延时缩短;任务设计任务设计|C/OS-II程序设计基础程序设计基础任务的优先级任务的优先级 任务的优先级安排原则如下:紧迫性紧
8、迫性任务优先级 关键性关键性中断关联性中断关联性快捷性快捷性频繁性频繁性传递性传递性C/OS-II程序设计基础程序设计基础系统函数概述系统函数概述基本原则基本原则系统函数的分类系统函数的分类12系统函数概述系统函数概述|C/OS-II程序设计基础程序设计基础基本原则基本原则1.配对性原则 对于C/OS-II来说,大多数API都是成对的,而且一部分必须配对使用。当然,查询状态的系统函数一般不需要配对使用,而且部分API如延时,也不需要配对使用。配对的函数见下表。函数1功能函数2功能备注OSFlagPend()等待事件标志组的事件标志位OSFlagPost()置位或清0事件标志组中的标志不必须配对
9、使用,一般不在同一个任务中(用于资源同步时必须同一个任务中配对使用)OSMboxPend()等待消息邮箱中的消息OSMboxPost()或OSMboxPostOpt()以不同的方式向消息邮箱发送消息OSQPend()等待消息队列中的消息OSQPost()或OSQPostFront()或OSQPostOpt()以不同的方式向消息队列发送一条消息OSSemPend()等待一个信号量OSSemPost()发送一个信号量OSMutexPend()等待一个互斥信号量OSMutexPost()释放一个互斥信号量必须在同一个任务中配对使用函数1功能函数2功能备注OSTimeGet()获得系统时间OSTime
10、Set()设置系统时间不必配对使用OSIntEnter()进入中断处理OSIntExit()退出中断处理必须在中断服务程序中配对使用OSSchedLock()给调度器上锁OSSchedUnlock()给调度调度必须在一个任务中配对使用OS_ENTER_CRITICAL()进入临界区OS_EXIT_CRITICAL()退出临界区必须在一个任务或中断中配对使用函数1功能函数2功能备注OSMemGet()分配一个内存块OSMemPut()释放一个内存块必须配对使用OSTaskCreate()或OSTaskCreateExt()建立任务OSTaskDel()删除任务动态使用任务时必须配对使用OSTas
11、kSuspend()挂起任务OSTaskResume()恢复任务必须配对使用OSTimeDly()或OSTimeDlyHMSM()延时OSTimeDlyResume()恢复延时的任务不必配对使用。OSTimeDlyHMSM()可能需要多个OSTimeDlyResume()才能恢复函数1功能函数2功能备注OSFlagCreate()建立事件标志组OSFlagDel()删除事件标志组动态使用事件时必须配对使用OSMboxCreate()建立消息邮箱OSMboxDel()删除消息邮箱OSMutexCreate()建立互斥信号量OSMutexDel()删除互斥信号量OSQCreate()建立消息队列O
12、SQDel()删除消息队列OSSemCreate()建立信号量OSSemDel()删除信号量系统函数概述系统函数概述|C/OS-II程序设计基础程序设计基础基本原则基本原则2.中断服务程序调用函数的限制 中断服务程序不能调用可能会导致任务调度的函数,它们主要是一些等待事件的函数,这些函数及其替代函数见下表。注意:未列入表中的函数OSTaskCreate()、OSTaskCreateExt()、OSTaskDel()、OSTaskResume()、OSTaskChangePrio()、OSTaskSuspend()、OSTimeDly()、OSTimeDlyHMSM()、OSTimeResume
13、()都属于在中断服务程序中禁止调用的函数。禁止使用的函数替代函数功能备注OSFlagPend()OSFlagAccept()无等待获得事件标志组的事件标志位需要程序自己判断是否获得了相应的事件OSMboxPend()OSMboxAccept()无等待获得消息邮箱中的消息OSMutexPend()OSMutexAccept()无等待获得一个互斥信号量OSQPend()OSQAccept()无等待获得息队列中的消息OSSemPend()OSSemAccept()无等待获得一个信号量系统函数概述系统函数概述|C/OS-II程序设计基础程序设计基础基本原则基本原则1.创建事件和删除事件的函数。一些函数
14、虽然没有明确地规定不能被中断服务程序调用,但因为中断服务程序的特性,一般不会使用。2.与任务相关的函数OSTaskChangePrio()、OSTaskDelReq()、OSTaskStkChk()和OSTaskQuery()。至于函数OSSchedLock()和OSSchedUnlock(),在中断服务程序中使用没有任何意义。系统函数概述系统函数概述|C/OS-II程序设计基础程序设计基础基本原则基本原则3.任务必须调用某个系统函数 因为C/OS-II是完全基于优先级的操作系统,所以在一定的条件下必须出让CPU占有权以便比自己优先级更低的任务能够运行,这是通过调用部分系统函数来实现的,这些函
15、数见下表。一般的任务必须调用表中至少一个函数,只有一种情况例外,就是单次执行的任务,因为任务删除后肯定出让CPU,所以可以不调用表中的函数。函数名功能函数名功能OSFlagPend等待事件标志组的事件标志位OSMutexPend等待一个互斥信号量OSQPend等待消息队列中的消息OSQPend等待消息队列中的消息OSSemPend等待一个信号量OSTaskSuspend 挂起任务OSTimeDly延时OSTimeDlyHMSM延时一般的操作系统都提供时间管理的函数,最基本的就是延时函数,C/OS-II也不例外,C/OS-II所具有的时间管理函数见下表。C/OS-II具有简单的动态内存管理能力。
16、C/OS-II的动态内存管理函数见下表。任务管理函数是操作与任务相关功能的函数,详见下表。系统管理函数是一些与C/OS-II内核或功能相关的一些函数,详见下表。C/OS-II的初始化函数有2个:OSInit()和OSStart(),它们不能在任何任务和中断服务程序中使用,仅在main()函数中按照一定的规范被调用,其中OSInit()函数初始化C/OS-II内部变量,OSStart()函数启动多任务环境。C/OS-II把信号量等都称为事件,管理它们的就是事件管理函数。C/OS-II V2.52具有的事件有普通信号量、互斥信号量、事件标志组、消息邮箱和消息队列,这些都是C/OS-II用于同步与通
17、讯的工具,本章后述的内容将会详细介绍。系统函数概述系统函数概述|C/OS-II程序设计基础程序设计基础系统函数的分类系统函数的分类初始化初始化任务管理任务管理时间管理时间管理内存管理内存管理根据功能分类事件管理事件管理函数名功能备注OSStatInit()使能任务统计功能复位一次只能调用一次,并且必须在任务中调用,在调用时其它用户任务不能处于就绪状态OSIntEnter()进入中断处理必须由中断服务程序按照规范调用,使用本公司的模版就不需要调用它们OSIntExit()退出中断处理OSSchedLock()锁调度器必须配对使用,一般情况不需要使用。事实上,C/OS-II不推荐使用它们OSSch
18、edUnlock()解锁调度器OS_ENTER_CRITICAL()进入临界区必须配对使用,一般通过禁止中断和允许中断来实现的。对于一些移植代码来说,不能嵌套调用OS_EXIT_CRITICAL()退出临界区函数名功能函数名功能OSTaskChangePrio()改变任务优先级OSTaskSuspend()挂起任务OSTaskCreate()建立任务OSTaskResume()恢复任务OSTaskCreateExt()建立任务,比OSTaskCreate()控制任务属性更多OSTaskStkChk()检查堆栈OSTaskDel()删除任务OSTaskQuery()获得任务信息OSTaskDel
19、Req()请求删除任务,有特殊用途系统管理系统管理函数名功能备注OSTimeDly()以时钟节拍为单位延时OSTimeDlyHMSM()以钟时分秒毫秒为单位延时OSTimeDlyResume()恢复延时的任务OSTimeDlyHMSM()可能需要多次才能恢复OSTimeGet()获得系统时间以时钟节拍为单位OSTimeSet()设置系统时间以时钟节拍为单位OSTimeTick()时钟节拍处理函数由时钟节拍中断处理程序调用,用户很少使用函数名功能OSMemCreate()初始化一个堆OSMemGet()从指定堆中获得一个内存块OSMemPut()从指定堆中释放一个内存块OSMemQuery()查
20、询指定堆的状态C/OS-II程序设计基础程序设计基础系统函数使用场合系统函数使用场合时间管理时间管理行为同步行为同步资源同步资源同步123系统函数使用场合系统函数使用场合|C/OS-II程序设计基础程序设计基础时间管理时间管理1.控制任务的执行周期 void MyTask(void*pdata)进行准备工作的代码;while(1)任务实体代码;调用系统延时函数;调用OSTimeDly()或OSTimeDlyHMSM()无限循坏注意:延时函数OSTimeDly()是以系统节拍数为参数,而延时函数OSTimeDlyHMSM()是以实际时间值为参数,但在执行过程中仍然转换为系统节拍数。如果实际时间不
21、是系统节拍的整数倍,将进行四舍五入处理。设系统节拍为50毫 秒,调 用 OSTimeDly(20)的 效 果 是 延 时 1秒 钟,调 用OSTimeDlyHMSM(0,1,27,620)的实际时间是延时1分27秒600毫秒。在任务函数的代码中可以通过插入延时函数来控制任务周期性运行,定时闲置CPU一段时间,供其它任务使用。系统函数使用场合系统函数使用场合|C/OS-II程序设计基础程序设计基础时间管理时间管理2.控制任务的运行节奏 在任务函数的代码中也可以通过插入延时函数来控制任务的运行节奏。void MyTask(void*pdata)进行准备工作的代码;while(1)调用获取事件的函数
22、;第一部分操作代码;调用系统延时函数;第二部分操作代码;调用系统延时函数;第三部分操作代码;各种时间顺序控制任务可以用这种结构的任务函数实现。调用OSTimeDly()或OSTimeDlyHMSM()调用OSTimeDly()或OSTimeDlyHMSM()等待信号量、消息其他任务代码无限循环系统函数使用场合系统函数使用场合|C/OS-II程序设计基础程序设计基础时间管理时间管理3.状态查询 查询过程是一个无限循环过程,只有当希望的状态出现以后才能退出这个无限循环,这种情况在实时操作系统管理下是不允许的,它将剥夺低优先级任务的运行机会。解决这个问题的办法是“用定时查询代替连续查询”。void
23、MyTask(void*pdata)进行准备工作的代码;while(1)while(查询的条件不成立)调用系统延时函数;其它处理代码;不成立,延时再查询,同时让出cpu占有权,供低优先级任务使用查询条件成立,运行后续代码定时查询条件是否成立无限循环系统函数使用场合系统函数使用场合|C/OS-II程序设计基础程序设计基础资源同步资源同步共享资源共享资源临界区访问共享资源临界区访问共享资源等待共享资源申请共享资源.申请共享资源.任务1任务2释放临界区互斥,保证共享资源的完整性和可靠性释放1.“资源同步”图解1.使使用用关关中中断断:通过调用禁止中断函数OS_ENTER_CRITICAL()和允许中
24、断函数OS_EXIT_CRITICAL()实现的。2.使使用用关关调调度度:通过调用禁止任务调度函数OSSchedLock()和允许任务调度函数OSSchedUnlock()实现的,因为禁止调度违背了多任务的初衷,所以不建议用户使用。3.使使用用信信号号量量与与互互斥斥信信号号量量:通过等待信号量和发送信号量实现共享资源的独享。系统函数使用场合系统函数使用场合|C/OS-II程序设计基础程序设计基础资源同步资源同步2.“资源同步”实现方式 3 32 21 1系统函数使用场合系统函数使用场合|C/OS-II程序设计基础程序设计基础行为同步行为同步消息消息收到消息.等待消息.任务1任务2发送消息
25、一个任务的运行过程需要和其它任务的运行配合,才能达到预定的效果,任务之间的这种动作配合和协调关系称为“行为同步”。任务优先级足够高1.行为同步 信号量 事件标志组 消息邮箱 消息队列 任务之间的通讯同步系统函数使用场合系统函数使用场合|C/OS-II程序设计基础程序设计基础行为同步行为同步2.数据通信 数据通讯时是否需要遵守“资源同步”规则 数据通讯的同时是否具有“行为同步”功能消息邮箱消息邮箱不需要有消息队列消息队列 不需要有全局变量全局变量需要无注意:尽管指针可能是局部变量,但只要指针指向的变量是全局变量,操作指针指向的变量时也需要当作全局变量来处理。C/OS-II程序设计基础程序设计基础
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二 _uCOS II 程序设计 基础
限制150内