第七章 uSOSII及应用开发_第1页
第七章 uSOSII及应用开发_第2页
第七章 uSOSII及应用开发_第3页
第七章 uSOSII及应用开发_第4页
第七章 uSOSII及应用开发_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.1C/OS-C/OS-介绍介绍.2C/OS-C/OS-在在S3C44B0XS3C44B0X上的移植上的移植第七章第七章 uC/OS-IIuC/OS-II及应用开发及应用开发27.1.1C/OS-介绍v简介简介 v C/OS-C/OS-的特点的特点 v C/OS-C/OS-的内核的内核 v C/OS-C/OS-的文件体系的文件体系 主要内容3一、C/OS-简介C/OS-读作“micro controller OS 2”,意为“微控制器操作系统版本2”。特点之一是:结构小巧。包含全部功能的核心部分代码只占用8.3K字节,同时由于C/OS-是可裁剪的,所以用户系统

2、中实际的代码最少可达2.7K字节。4一、C/OS-简介特点之二:是一个真正的实时操作系统。实时操作系统一般定义为“一个能够在指定的或者确定的时间内,完成系统功能和对外部或内部、同步或异步事件做出响应的系统”。实时操作系统在实现时通常采用的是基于优先级的任务调度策略。也就是说系统根据各个任务的优先级,动态地切换各个任务,来保证实时性。通常基于优先级的操作系统有两种:可剥夺型的和不可剥夺型的。只有基于优先级的可剥夺型的操作系统才是真正的实时操作系统。5在可剥夺型内核中,当有更高优先级的任务就绪时,总能得到CPU的控制权。也就是说可剥夺型内核总是让就绪态的高优先级的任务先运行。C/OS-以及绝大多数

3、商业实时内核都是可剥夺型内核。一、C/OS-简介6 特点之三是:C/OS-实际上是一个实时操作系统内核,只包含了任务调度、任务管理、时间管理、内存管理和任务间的通信与同步等基本功能。没有提供输入输出管理、文件系统、网络之类的额外服务。但是由于C/OS-的可移植性和开源性,用户可以自己添加所需的各种服务。目前,已经出现了专门为C/OS-开发文件系统、TCP/IP协议栈、用户显示接口等的第三方商家。7二、C/OS-的特点 1. 有源代码 C/OS-源代码是开放的,用户可以登陆C/OS-的网站(www.ucos-)下载针对不同微处理器的移植代码。如Intel公司的80 x86、8051、80196等

4、,另外,同时,嵌入式实时操作系统嵌入式实时操作系统C/OS-一书的附带光盘中有C/OS- V2.52版本的所有源代码。该源代码清晰易懂,且结构协调。作为C/OS-的最初发布者,本书的作者Jean J.Labrosse还介绍了这些代码的工作原理以及这一段的代码是如何拼在一起的。这是一本学习C/OS-的不错的参考书。8二、C/OS-的特点 2. 可移植性(portable)C/OS-的源代码中,除了与微处理器硬件相关的部分是使用汇编语言编写的,其绝大部分是使用移植性很强的ANSI C编写的。9二、C/OS-的特点3. 可固化(ROMable) C/OS-是为嵌入式应用而设计的操作系统,只要具备合适

5、的软硬件工具,就可以将C/OS-嵌入到产品中成为产品的一部分。10 4. 可剪裁(scalable) 用户可根据应用的需要来剪裁系统功能。最小内核可编译至2k(这样的内核没有太大实用性)。 5. 可剥夺型(preemptive) C/OS-是完全可剥夺型的实时内核。它总是运行就绪条件下优先级最高的任务。二、C/OS-的特点116. 多任务 C/OS-可以管理64个任务,在目前的版本中,系统保留了最高的4个优先级和最低的4优先级任务,所以用户实际上最多可以拥有56个任务。注意:系统赋给每个任务的优先级必须不同。7. 任务栈 C/OS-的每个任务都有自己单独的栈和栈空间。 二、C/OS-的特点12

6、 8. 系统服务 C/OS-提供了很多系统服务,例如信号量、互斥信号量、消息邮箱、事件标志、数据队列、内存块的申请与释放及时间管理函数等。二、C/OS-的特点139. 中断管理 中断可以使正在执行的任务暂时挂起。如果优先级更高的任务被中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行。中断嵌套层数可达255层。10. 稳定性与可靠性C/OSII自1992年以来已经有数千个商业应用,可以说C/OS-的每一种功能、每一个函数及每一行代码都已经经过了考验与测试。二、C/OS-的特点14何时使用实时操作系统何时使用实时操作系统 完全取决于软件的复杂程度完全取决于软件的复杂程度 嵌入式实时多任务操作

7、系统的主要特征:一个是多任务,二是实时,三是基于优先级控制,所以用户需不需要使用实时多任务操作系统,也主要是考虑对这三个方面的需求。 如果一个软件项目并行的功能模块比较多,定时处理的功能比较多,程序的执行需要判断很多条件参数和资源,这时候我们可以考虑利用RTOS的多任务能力 同样,如果我们经常需要考虑某些代码之间执行的优先顺序,那么可以利用RTOS的基于优先级的控制能力15三、C/OS-的内核 C/OS-其实只有一个内核,提供任务管理、内存管理、时间管理和任务间的通信与同步等基本功能。虽然目前已经出现针对C/OS-应用的第三方软件如网络管理、输入输出管理、TCP/IP协议栈等。但这些功能的实现

8、都是基于C/OS-的内核管理功能实现的。16三、C/OS-的内核1 1、任务管理、任务管理2 2、内存管理、内存管理3 3、时间管理、时间管理4 4、任务间的通信与同步、任务间的通信与同步171. 任务管理任务管理(1)编写形式 每一个任务必须被写成一个无限循环的函无限循环的函数数。一个任务就像其他C函数一样,有返回值类型和参数,但因为任务函数是一个无限循环,所以它绝不会返回任何的数据,故返回类型应该定义为void。18void task ( void* pdata )INT8U err; InitTimer();(); / 可选可选For( ; ) /应用程序代码应用程序代码OSTimeDl

9、y(1);); / 可选可选以下是一种推荐的结构:以下是一种推荐的结构:19 (2) 任务数C/OS-最多可以管理最多可以管理64个任务个任务,在目前的版本中,作者保留了最高的4个优先级和最低的4优先级任务,所以用户实际上最多可以拥有56个任务。20 (3) 任务调度 C/OS-是一个基于优先级的可剥夺型实时多任务内核,因此优先级最高的任务一旦准备就绪,则就拥有cpu的所有权并开始投入运行。任务调度是由函数ossched(void)调用OSCtxSw()实现的。其作用就是:从就绪队列中查找最高优先级的任务并进行上下文切换。注意:C/OS-中任务的优先级数越高,优先级别越低,因此0优先级的任务具

10、有最高的优先级别。21(4) 任务控制块TCB 系统对任务的管理是通过一个称为任务控制块TCB(task control blocks)的数据结构进行的。每个任务在被创建的时候,TCB将被赋值。当任务的CPU使用权被剥夺时,C/OS-用任务控制块来保存该任务的状态。 C/OS-提供了任务管理的各种函数,包括创建任务、删除任务、改变任务的优先级、挂起和恢复任务等。22OSTaskCreate()建立任务OSTaskDel()删除任务OSTaskDelReq()请求删除任务OSTaskChangePrio()改变任务的优先级OSTaskSuspend()挂起任务OSTaskResume()恢复任务

11、OSTaskStkChk()堆栈检验OSTaskQuery()获得有关任务的信息uC/OS-II提供如下任务管理的函数23系统初始化时会自动产生两个任务系统初始化时会自动产生两个任务:一是空闲任务空闲任务OSTaskIdle()(),它的优先级最低为OS_LOWEST_PRIO,该任务只是不停地给一个32位的整型变量加1;另一个是统计任务OSTaskStat(),它的优先级为OS_LOWEST_PRIO-1,该任务每秒运行一次,负责计算当前CPU的利用率。24void OSTaskIdle ( )for (;) OS_ENTER_CRITICAL(); OSIdleCtr+; OS_EXIT_

12、CRITICAL(); 空闲任务252. 内存管理内存管理 ANSI C中,一般采用malloc()和()和free()()这两个函数动态地分配和释放内存。这样,随着内存空间的不断分配与释放,就会把原来很大的一块连续内存区域逐渐地分割成许多非常小的但彼此之间又不相邻的内存块,也就是产生内存碎片问题内存碎片问题。为了消除这因多次分配与释放内存所引起的内存碎片问题,C/OS-采取了这样一种内存管理机制。将连续的大块内存内存管理机制。将连续的大块内存分成若干分区,每个分区再分块。每个分区中分成若干分区,每个分区再分块。每个分区中都包含整数个大小都包含整数个大小26 相同的内存块,但不同分区之间内存块

13、相同的内存块,但不同分区之间内存块的大小可以不同。的大小可以不同。用户需要动态分配内存时,可选择一个适当的分区,按块来可选择一个适当的分区,按块来进行内存分配进行内存分配。释放内存时将该块放回它以前所属的分区,这样就能有效解决内存碎片问题。同时同时每次调用malloc()和free()分配和释放的都是整数倍的固定内存块长,这样执行时间就是确定执行时间就是确定的了的了。27 系统对内存的管理是通过内存控制块(memory control blocks)数据结构来进行的,每个分区都有属于自己的内存控制块。28(1)OSMemCreate (),用于建立一个内存分区。(2)OSMemGet(),用于

14、分配一个内存块。(3)OSMemPut (),释放一个内存块。(4)OSMemQuery (),用于查询一个特定内存分区的状态。 C/OS-2提供了对内存进行管理的函数29 C/OS-提供一个时钟节拍,它是一种特殊的中断,操作系统的心脏。首先32位的整数OSTime加一。对任务列表进行扫描,判断是否有延时任务处于准备就绪状态,最后进行上下文切换。3. 时间管理时间管理30 在多任务操作系统中多任务操作系统中,多个任务并发执行,这时可能会出现某个任务的执行结果是另一任务的执行条件,因而任务之间需互发信号,以使得各任务按一定的速度执行。这里的信号(signal)被看成是事件(event),如信号量

15、、邮箱、消息队列等。C/OS-系统中提供了数据结构事件控制块来实现信号量、邮箱、消息队列的管理。 4. 任务间的通信与同步任务间的通信与同步31 由两部分组成: 一个是信号量的计数值,它是一个16位的无符号整数(0到65,535之间); 一个是由等待该信号量的任务组成的等待任务表。 信号量的意义据系统不同可以有多种:如表示可用资源数。当表示资源数时,举个例子来说明信号量321) OSSemCreate()函数,用于建立信号量,并对信号量赋0到65535之间的一个数为其初值。2) OSSemDel()函数,用于删除一个信号量。3) OSSemPend()函数,用于等待即申请一个信号量,对信号量进

16、行减1操作。4) OSSemPost()函数,用于发送一个信号量,对信号量进行加1操作。若加1后的信号量等于0,则说明有任务在等待该信号量。故OSSemPost()还需要唤醒一个处于等待该信号的其它任务。 系统提供的信号量管理的基本函数如下33四、C/OS-的文件体系C/OS-的文件体系结构如下图所示,包括 以 下 三 个 部 分 , 应 用 软 件 层 是 基 于C/OS-的代码。应用软件核心代码(处理器无关)OS_CORE . COS_MBOX . COS_MEM . COS_Q . COS_SEM . COS_TASK . COS_TIME . CuCOS_II . H设置代码(应用相关

17、)OS_CFG . HINCLUDES . H 核心代码 消息队列 存储管理 消息管理 信号量 任务调度 定时管理OS_CPU . H OS_CPU_A . ASM OS_CPU_C . C341) 核心代码部分,包括事件的管理,消息队列的管理,存储管理,消息管理,信号量处理,任务调度和定时管理35 2)设置代码部分,包括两个头文件,用户在设置代码中可以配置事件控制块的数目以及是否包含消息管理相关的代码等等。 3)处理器相关的移植代码部分,这部分包括一个头文件,一个汇编文件和一个C代码文件,在随后的C/OS-的移植过程中,用户所需要关注的就是这部分文件。367.1.2C/OS-在在S3C44B

18、0XS3C44B0X上的移植上的移植一、移植条件一、移植条件 二、移植内容二、移植内容 三、移植及测试三、移植及测试 主要内容371、处理器的C编译器能产生可重入代码 2、用C语言就可以打开和关闭中断 3、处理器支持中断并且能产生定时中断 4、处理器支持容纳一定量数据的硬件堆栈 5、处理器有将堆栈指针和其他CPU寄存 器读出和存储到堆栈或内存中的指令一、移植的条件38(1)处理器的C编译器能产生可重入代码可重入代码指的是可以被多个任务同时调用,但不会破坏数据的一段代码,或者说代码具有在执行过程中打断后再次被调用的能力。C/OS-是多任务内核,函数可能会被多个任务调用。所以要完成多任务,代码的可

19、重入性是基础。 下面列举了两个函数例子,它们的区别在于变量temp保存的位置不同,左边temp作为全局变量存在,右边函数中temp作为函数的局部变量存在,因此左边的函数是不可重入的,而右边的函数是可以重入的。39int temp;void swap (int *x,int*y)temp=*x;*x=*y;*y=temp;void swap (int *x,int*y)int temp;temp=*x;*x=*y;*y=temp;40 由此可见,在函数中应尽量避免使用全局变量。 此外,除了在C程序中要使用局部变量以外,还需要C编译器的支持,使用ADS,Embest IDE,ADT等集成开发环境,

20、可以生成可重入的代码。41(2)用C语言就可以打开和关闭中断uCOS-II在C语言代码中通过使用以下两个宏OS_ENTER_CRITICAL ( ) OS_EXIT_CRITICAL( )打开和关闭中断,从而保护临界代码#define OS_ENTER_CRITICAL() ARMDisableInt()ARMDisableInt: mrs r12, CPSR /* 获取模式寄存器获取模式寄存器 */orr r12, r12, #I_BIT /* 设置禁止中断位设置禁止中断位 */msr CPSR_c, r12 /* 设置模式寄存器设置模式寄存器 */ bxlr42(3)处理器支持中断并且能产

21、生定时中断。(4)处理器能支持并容纳一定量数据的硬件堆栈。(5)处理器有将堆栈指针和其他CPU寄存器读出和存储到堆栈或内存中的指令。ARM处理器中汇编指令stmfd可以将所有寄存器压栈,对应也有一个出栈的指令ldmfd。43二、二、uC/OS-IIuC/OS-II移植内容及步骤移植内容及步骤移植第一步基本的配置和定义移植第二步移植与处理器相关的OS_CPU_A.ASM汇编代码文件移植第三步移植与处理器相关的OS_CPU_C.C标准C代码文件44一、定义编译器相关的数据类型四、定义四、定义OS_TASK_SW()OS_TASK_SW()宏宏三、定义栈的增长方向三、定义栈的增长方向 二、定义允许和

22、禁止中断宏typedef unsigned chartypedef unsigned char BOOLEAN; BOOLEAN;typedef unsigned chartypedef unsigned char INT8U; INT8U;typedef signed chartypedef signed char INT8S; INT8S;typedef unsigned shorttypedef unsigned short INT16U; INT16U;typedef signed shorttypedef signed short INT16S; INT16S;typedef unsigned longtypedef unsigned long INT32U; INT32U;typedef signed longtypedef signed long INT32S; INT32S;typedef floattypedef float FP32; FP32; typedef doubletypedef double FP64; FP64;define OS_STK_GROWTH define OS_STK_GROWTH 0 0 / /* *从下往上从下往上* */ /define OS_STK_GROWTH def

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论