如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
嵌入式系统软件设计方法和代码实现第2-5:uC/OS-II实时操作系统第2-5:uC/OS-II实时操作系统本章所涉及的操作系统理论知识可参阅各种操作系统教科书,比如《现代操作系统》【美】AndrewS.Tanenbaum著陈向群等译机械工业出版社1999年11月目录:概述任务栈切换方法优先级别算法任务通信-使用邮箱任务通信-使用消息队列对共享资源的互斥访问控制与信号(semaphore)任务同步与信号(signal)内存分配方法缺陷与改进(1:任务调度问题,2:通信问题:任务通信模型与uC/OS-II通信机制的缺陷)附录1:uC/OS-II文件列表附录2:相关函数列表附录3:主要变量和数据类型列表概述技术指标uC/OS-II是一个占先式实时多任务操作系统内核,但不支持时间片调度,支持任务间通信,提供了多种对共享资源的访问控制,如禁止切换,调度上锁等。uC/OS-II的也是一个可剪裁的系统,可以根据需要保留或者删除某些功能,任务数最多可达64个。下表中给出了2种常用情况下的目标代码大小。序号目标码(程序+数据)任务数邮箱消息队列信号量任务栈大小18K+6K6255151225K+4K160101512注:该表数据是根据《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】:表格SEQ表格\*AR