- 1、本文档共29页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ucosii2时操作系统介绍
第2-5:uC/OS-II 实时操作系统
目 录:
概述
任务栈切换方法
优先级别算法
任务通信-使用邮箱
任务通信-使用消息队列
对共享资源的互斥访问控制与信号(semaphore)
任务同步与信号(signal)
内存分配方法
缺陷与改进(1:任务调度问题,2:通信问题:任务通信模型与uC/OS-II通信机制的缺陷)
附录1:uC/OS-II文件列表
附录2:相关函数列表
附录3:主要变量和数据类型列表
概述
技术指标 uC/OS-II是一个占先式实时多任务操作系统内核,但不支持时间片调度,支持任务间通信,提供了多种对共享资源的访问控制,如禁止切换,调度上锁等。
uC/OS-II的也是一个可剪裁的系统,可以根据需要保留或者删除某些功能,任务数最多可达64个。下表中给出了2种常用情况下的目标代码大小。
序号 目标码(程序+数据) 任务数 邮箱 消息队列 信号量 任务栈大小 1 8K+6K 62 5 5 1 512 2 5K+4K 16 0 10 1 512 注:该表数据是根据《 uC/OS-II --源码公开的实时嵌入式操作系统》书中p229,p230 的表9.1和表9.2综合得到的. 通过改变OS_CFG.H文件中的各种配制,可以取消或者保留某些功能,并且改变某些数据结构的大小,在uC/OS-II中,影响内存大小的数据结构主要包括任务数量,事件控制块数量和任务堆栈大小。
uC/OS-II源代码 uC/OS-II的X86版本代码规模约为5000行,包括用于应用任务的例子代码和辅助代码,核心代码约3500行,分布在 17 个文件中【详见附录1】。
任务状态 uC/OS-II的任务一般会处于以下6状态之一,
运行态
就绪态
等待信号量
等待邮箱消息
等待消息队列消息
挂起
在某一时刻,系统中只会有一个任务处于“运行态”,处于其他各种状态的任务数量没有限制,“挂起态”的进入是任务主动进行的,其他状态一般由各种外部因素造成。只有处于“就绪态”的任务才可能成为下个要执行的任务。
任务切换过程和优先级别算法 uC/OS-II不支持时间片调度切换,而仅仅提供按任务优先级别的切换,提供了2种任务切换方式,主动切换和被动切换,前者是应用任务通过调用系统函数自动将自己挂起,后者是操作系统根据当前任务运行情况,将正在运行的任务强制挂起,从而切换到另一个任务执行。被动切换对于任务来说是不可预知的,因此可能发生在任意代码位置。
uC/OS-II的任务优先级别一般采用常量定义,实际上属于静态优先级别,即在任务运行过程中,系统不改变任务的优先级别,但提供了一个优先级别改变的接口函数,用户任务可以通过调用该函数来修改自身或者其他任务的优先级别。
由于uC/OS-II不支持时间片调度,因此如果一个任务函数代码中包含无限循环代码的话,其他低优先级别得任务将永远得不到调度。对于高优先级别任务,也可能得不到执行。
任务之间的数据传递 在uC/OS-II中,提供了邮箱和消息队列2种方式来满足任务之间的数据传递,在使用邮箱时,如果收信任务没有将数据取走,就无法传送下个消息,而一个消息队列方式实际上相当与多个邮箱,因此可以连续传送多条消息。
共享资源访问控制 uC/OS-II中可以使用禁止调度、设置信号量来保证共享资源访问的排它性。系统的信号量数量由事件控制块数量决定。
任务同步 如果一个任务需要立即切换到另外一个指定任务,可以通过设置信号量来实现。在uC/OS-II中,实现任务间同步运行需要较为较为负责的处理。
uC/OS-II的使用问题 uC/OS-II只是一个任务调度内核,没有用于某个特定硬件环境的I/O系统,例如TCP/IP协议栈、图形GUI等,需要另外开发。
此外,uC/OS-II上也不能使用磁盘或者flash存储器的文件系统,不支持中文显示和中文输入接口,在uC/OS-II上开发应用产品任然需要做大量工作。
调度过程:任务栈切换方法
任务栈的定义与赋初值 uC/OS-II是采用独立任务栈的切换方法,给每个任务分配一个任务栈数组,比如在例子1中ex1l.c文件中定义的“TaskStk[ ][ ]”变量, 在切换时将处理器的堆栈指针SP指向该数组,从而实现任务切换。任务栈数组(如“TaskStk[0][ ]”)在系统初始化时被赋予每个任务控制块(OS_TCB)的“OS_STK *OSTCBStkPtr”变量,?这个赋值过由函数:
TaskStart()- OSTaskCerat( ) -OSTaskStkInit()-OSTCBinit()
的依次执行完成,具体过程见【表1】:
表格 1:任务栈的初始化过程
步骤 文件 函数名 堆栈变量传递 : SP指针 说明 1 ex1l.c main( ) TaskStk[N_
文档评论(0)