1、39.139.239.439.539.3 9.1.1 嵌入式操作系统一般结构嵌入式操作系统一般结构3(1)代码固化存储,执行效率高(2)可裁剪性(3)实时性(4)强稳定性(5)硬件适应性,可移值性(1)按实时性分类分为硬实时操作系统和软实时操作系统。(2)按商业模式分类按照商业模式,可以把EOS分为商用型EOS和免费型EOS。C/OS-是抢占式多任务实时嵌入式操作系统。C/OS-具有足够的稳定性和安全性。目前最新版本为C/OS-。4(1)公开源码的高质量实时内核)公开源码的高质量实时内核(2)可移植性)可移植性C/OS-可被移植到多种微处理器上。可被移植到多种微处理器上。(3)可裁剪、可固化)
2、可裁剪、可固化(4)时间确定性)时间确定性绝大多数绝大多数C/OS-的函数调用与服务的执行时间都是确定的,其服务的执行时间与的函数调用与服务的执行时间都是确定的,其服务的执行时间与系统中运行的任务个数无关。系统中运行的任务个数无关。(5)多任务)多任务C/OS-可以管理可以管理64个任务(版本个任务(版本2.82以后扩充至以后扩充至255个任务)不支持时间片轮转(个任务)不支持时间片轮转(round-robin)调度机制。)调度机制。(6)抢占式内核)抢占式内核C/OS-是抢占式实时内核,在任意时刻都可能发生任务调度。因此,是抢占式实时内核,在任意时刻都可能发生任务调度。因此,C/OS-可可以
3、支持强实时应用。以支持强实时应用。(7)多种系统服务)多种系统服务C/OS-提供很多实时内核所需的系统服务,例如任务管理、时间管理、信号量、提供很多实时内核所需的系统服务,例如任务管理、时间管理、信号量、事件标志组、互斥信号量、消息队列、内存分区管理等。事件标志组、互斥信号量、消息队列、内存分区管理等。5 C/OS内核大致可以划分为任务调度、任务管理、时间内核大致可以划分为任务调度、任务管理、时间管理、任务间同步与通信以及内存管理、系统管理等模块。管理、任务间同步与通信以及内存管理、系统管理等模块。6数据类型名称数据类型数据宽度BOOLEAN布尔型8位INT8U8位无符号整数8位INT8S8位
4、带符号整数8位INT16U16位无符号整数16位INT16S16位带符号整数16位INT32U32位无符号整数32位INT32S32位带符号整数32位FP32单精度浮点数32位FP64双精度浮点数64位7C/OS-的任务由三部分构成:的任务由三部分构成:(1)程序代码)程序代码(2)任务堆栈)任务堆栈(3)任务控制块)任务控制块8函数函数OSTaskCreate()和和OSTaskCreateExt()都可以创建任务。都可以创建任务。OSTaskCreateExt()函数提供了一些附加的功能,但会增加额外的开销。函数提供了一些附加的功能,但会增加额外的开销。创建任务函数创建任务函数OSTask
5、Create()原型如下:原型如下:INT8U OSTaskCreate(void(*task)(void*pd),/*指向任务代码的的指针指向任务代码的的指针*/void*pdata,/*任务开始执行时传递给任务的参数的指针任务开始执行时传递给任务的参数的指针*/OS_STK*ptos,/*任务堆栈栈顶的指针任务堆栈栈顶的指针*/INT8U prio);/*分配给任务的优先级分配给任务的优先级*/如:如:static OS_STK AppTask1Stk64;/任务任务1堆栈堆栈OSTaskCreate(/任务创建任务任务创建任务1AppTask1,/任务代码指针任务代码指针(void*)0
6、,/传递给任务的参数指针传递给任务的参数指针(OS_STK*)&AppTask1Stk64-1,/任务的堆栈指针任务的堆栈指针4);/任务任务1任务优先级为任务优先级为49原型为:void OSTimeDly(INT16U ticks);参数ticks为要延时的时钟节拍数原型为:INT8U OSTimeDlyHMSM(INT8U hours,/时INT8U minutes,/分INT8U seconds,/秒INT16U milli);/毫秒实际的延时时间是时钟节拍的整数倍。如延时1小时18分26秒,则调用 如下:OSTimeDlyHMSM(1,18,26,0);1011Void OSSemP
7、end(OS_EVNNT*pevent,INT16U timeout,int8u*err);void OSMutexPend(OS_EVENT*pevent,INT16U timeout,INT8U*err);void*OSMboxPend(OS_EVENT*pevent,INT32U timeout,INT8U*perr);void*OSQPend(OS_EVENT*pevent,INT32U timeout,INT8U*perr);12移植移植 C/OS-IIC/OS-II只需修改只需修改OS_CPU.HOS_CPU.H,OS_CPU_A.ASMOS_CPU_A.ASM,OS_CPU_C.
8、COS_CPU_C.C这三这三个文件的相关函数。个文件的相关函数。要使要使C/OS-IIC/OS-II正常运行,微控制器必须满足以下正常运行,微控制器必须满足以下要求:要求:微控制器的微控制器的C C编译器能产生可重入代码;编译器能产生可重入代码;微控制器支持中断,并且能产生定时中断;微控制器支持中断,并且能产生定时中断;C C语言可以开语言可以开/关中断;关中断;微控制器支持一定数量的数据存储硬件堆栈;微控制器支持一定数量的数据存储硬件堆栈;微控制器有将堆栈和其他微控制器有将堆栈和其他CPUCPU寄存器读出和存寄存器读出和存储到堆栈或内存的指令。储到堆栈或内存的指令。13应用软件核心代码(处
9、理器无关)OS_CORE.COS_MBOX.COS_MEM.COS_Q.COS_SEM.COS_TASK.COS_TIME.C设置代码(应用相关)OS_CFG .HINCLUDES.H 核心代码 消息队列 存储管理 消息管理 信号量 任务调度 定时管理OS_CPU.H 移植时需要修改OS_CPU_A.ASM移植时需要修改OS_CPU_C.C移植时需要修改CPU定时器软件硬件14嵌入式操作系统内核是针对多种处理嵌入式操作系统内核是针对多种处理器而设计的,对于一种处理器,某个器而设计的,对于一种处理器,某个应用场合,有些代码是多余的,则需应用场合,有些代码是多余的,则需要对代码进行适当的裁剪以满足
10、够用要对代码进行适当的裁剪以满足够用就好的设计原则。就好的设计原则。裁剪的目标裁剪的目标就是去掉多余的代码,以就是去掉多余的代码,以减少不必要的内存空间。更适应嵌入减少不必要的内存空间。更适应嵌入式系统量体裁衣的要求。式系统量体裁衣的要求。15void main()HW_config();/*硬件配置与初始化,包括时钟和使用的外设硬件配置与初始化,包括时钟和使用的外设*/OSInit();/*初始化初始化C/OS-内核内核*/OSTaskCreate(Task1,);/*创建用户任务创建用户任务1*/OSTaskCreate(Task2,);/*创建用户任务创建用户任务2*/.OSTaskCr
11、eate(Taski,);/*创建用户任务创建用户任务i*/OSStart();/*启动多任务调度启动多任务调度*/16单次执行的任务通常执行三步操作:单次执行的任务通常执行三步操作:任务准备工作;任务实体;自我删除函数调用。任务准备工作;任务实体;自我删除函数调用。void Task(void*pdata)任务初始化的准备工作任务初始化的准备工作;/*初始化硬件设备初始化硬件设备*/任务实体任务实体;/*完成该任务的具体功能完成该任务的具体功能*/OSTaskDel(OS_PRIO_SELF);/*任务完成后删除任务完成后删除*/17周期执行的任务一般采用循环结构,并在每次完成具体功能周期执
12、行的任务一般采用循环结构,并在每次完成具体功能后调用系统延时函数后调用系统延时函数OSTimeDly()或或OSTimeDlyHMSM()等待等待下一个执行周期,并将处理器时间让给其他任务。下一个执行周期,并将处理器时间让给其他任务。void Task(void*pdata)任务初始化准备工作;/*初始化硬件设备*/for(;)/*无限的循环 或while(1)*/任务实体;/*完成该任务的具体功能*/OSTimeDly(n);/*调用系统延时函数等待下一个周期*/18这类任务的实体代码只有在某种事件发生后才执行。在相关这类任务的实体代码只有在某种事件发生后才执行。在相关事件发生之前,任务被挂
13、起。事件触发执行的任务一般也采事件发生之前,任务被挂起。事件触发执行的任务一般也采用循环结构,相关事件发生一次,任务实体代码执行一次。用循环结构,相关事件发生一次,任务实体代码执行一次。void Task(void*pdata)任务初始化的准备工作任务初始化的准备工作;/*初始化初始化*/for(;)/*无限的循环或无限的循环或while(1)*/调用获取事件的函数调用获取事件的函数;/*等待信号量或消息等等待信号量或消息等*/任务实体任务实体;/*完成该任务的具体功能完成该任务的具体功能*/19按照执行周期性任务的程序结构创建四个任务:按照执行周期性任务的程序结构创建四个任务:任务任务1每隔
14、每隔100ms 采集电位器电压采集电位器电压任务任务2 每隔每隔200ms判断电压值并控制蜂鸣器报警判断电压值并控制蜂鸣器报警任务任务3 每隔每隔300ms输出与电压相应的输出与电压相应的PWM波形控制电机波形控制电机任务任务4 每隔每隔500ms在在TFT LCD屏显示电压值屏显示电压值 打开实验例程中的任务调度应用实验,对照打开实验例程中的任务调度应用实验,对照MDK-ARM工程讲工程讲解示例。解示例。(1)硬件初始化)硬件初始化 (2)操作系统初始化)操作系统初始化(3)创建任务并编写任务程序)创建任务并编写任务程序(4)启动任务调度)启动任务调度202010年,拉伯罗斯于推出了年,拉伯
15、罗斯于推出了C/OS-,他认为,他认为C/OS-并不是并不是C/OS-的的升级版本,而是一个全新的升级版本,而是一个全新的RTOS内核。内核。C/OS-是定位于是定位于8位和位和16位以及低端位以及低端32位处理器的位处理器的RTOS内核内核C/OS-尽尽管在管在16位甚至位甚至8位处理器上可以运行良好,但其初衷则是主要针对高端位处理器上可以运行良好,但其初衷则是主要针对高端32位位处理器,这类处理器带有支持优先级调度的指令,且内存资源更丰富。处理器,这类处理器带有支持优先级调度的指令,且内存资源更丰富。C/OS-增加的主要特性包括:增加的主要特性包括:(1)时间片轮转调度)时间片轮转调度(2)内核对象的数量无限制)内核对象的数量无限制(3)任务消息和任务信号)任务消息和任务信号(4)任务级的时钟节拍处理)任务级的时钟节拍处理(5)可针对处理器体系结构进行优化)可针对处理器体系结构进行优化(6)时间戳)时间戳(7)增强的内置性能测试功能)增强的内置性能测试功能