嵌入式操作系统µCOS-II及应用编程

来源:互联网 发布:linux设置环境变量命令 编辑:程序博客网 时间:2024/06/03 15:12

点击打开链接


嵌入式操作系统µCOS-II及应用编程

µCOS-II是一个嵌入式实时操作系统,广泛的应用于控制系统中。µCOS-II有Micrium公司提供,是一个可移植、可固化的、可裁剪的、抢占式多任务实时内核,它适用于多种微处理器、控制器和数字处理芯片。同时,该系统源代码开放、整洁、一致,注释详尽,适合系统开发。下边我们将对µCOS-II系统的特点、系统结构、任务状态及其转换、编写常用的系统函数、µCOS-II的移植,以及µCOS-II的应用方法及其编写举例。

一、µCOS-II的主要特点

         1、源代码公开

         µCOS-II的源代码是开放的,可以到µCOS-II的官方网站http://www.ucos-ii.com/下载。µCOS-II对于教学和学习是免费的,但用于商业是需要付费的。

         2、可移植性

         在µCOS-II的源代码中,处理与微处理器相关的部分使用汇编语言编写的之外,其它部分都是用C语言编写的,因此,µCOS-II能够非常方便的移植到其它的微处理器。如80x86、8051、Power PC、TMS320 DPS、ARM系列,涵盖了从8位到64位的40多种微处理器都可以运行µCOS-II。

         3、可裁剪性

         µCOS-II可根据用户的实际需要、使用条件等,选择操作系统的内容,从而去掉多余的代码,减少对存储器不必要的占用。µCOS-II的足迹可以缩放(5 KB到24 KB的之间)只包含为特定应用所需的功能。

         4、可固化性

         µCOS-II是嵌入式操作系统,可以将其与应用程序一起进行编译,固化到存储器中运行。

         5、可剥夺性

         µCOS-II的任务是完全可剥夺的实时操作系统内核,始终运行的是就绪条件下优先级最高的任务。

         6、多任务

         µCOS-II可以管理64个任务,建议用户保留8个任务给操作系统,这样,用户实际最多能够使用56个任务。创建任务时,各个任务的优先级必须不同,因为µCOS-II不支持时间片轮转调度。

         7、时间确定性

         µCOS-II提供的大部分服务的执行时间是恒定;执行时间不依赖于在应用程序运行的任务数。在任何时候,用户都能知道µCOS-II的函数调用与服务的执行时间。

         8、任务栈

         µCOS-II中的每个任务都有自己单独的栈和栈空间,并且µCOS-II中有栈空间校验函数,能够确定各个任务需要的实际栈空间的大小。

         9、系统服务

         µCOS-II提供了很多系统服务,如:信号量、互斥信号量、消息邮箱、事件标志、数据队列,以及内存申请于释放、时间管理函数等。

         10、中断管理

         中断可以使正在执行的任务挂起,执行中断服务程序。如果优先级更高的任务被中断唤醒,则当中断服务执行结束后(包括所有嵌套的中断)会立即执行。中断嵌套层数可达255层。

         11、稳定可靠性

         µCOS-II自1992年以来已经有数百个商业应用。µCOS-II与µC/OS的内核是一样的,只是增加了更多的功能。2000年,µCOS-II在一个航空项目中得到了美国联邦航空管理局对于商用飞机的符合RTCA-178B标准的认证,可以说,µCOS-II的每一种功能、每一个函数集、每一行代码,都经过了考验和测试。由此表明,µCOS-II具有足够安全性、可靠性、稳定性。

12、是一小系统

         µCOS-II代码只有100多KB,使用时还可以裁剪,使其更小。由于µCOS-II实时性强、系统占用资源少、运行速度快,因此,µCOS-II主要应用于控制系统中。

二、µCOS-II系统结构

µCOS-II操作系统仅有14个文件:

INCLUDES.H                                                   //包含OS本身的头文件,且用户可添加引用程序中的

OS_CPU.H                                                       //包含了与CPU相关的常数、宏、数据类型,需移植

OS_CPU_A.ASM                                             //用汇编语言编写的与CPU有关的4个函数,需移植

OS_CPU_C.C                                                   //与CPU有关的10个函数,需移植

OS_CORE.C                                                     //内核结构

OS_FLAG.C                                                      //事件标志管理

OS_MBOX.C                                                    //消息邮箱管理

OS_MEM.C                                                     //存储器管理

OS_MUTEX.C                                                  //互斥型信号量管理

OS_Q.C                                                             //消息队列管理

OS_SEM.C                                                       //信号量管理

OS_TASK.C                                                      //任务管理

OS_TIME.C                                                      //存储器管理

OS_uCOS_II.C                                                 //内核结构

OS_uCOS_II.C                                                 //内核结构头文件

三、µCOS-II的任务状态

         所谓任务状态,实际上就是进程状态。在µCOS-II中,一个任务可以有5种状态:休眠态、就绪态、运行态、等待状态和中断服务态。

1、  休眠态

休眠态是指程序驻留在程序空间(ROM或RAM中),尚未创建成任务的程序,不能够被内核调度。

一个任务可以通过调用删除任务函数OSTaskDel()使自己或其它任务进入休眠态。

2、  就绪态

就绪态是指任务具备运行条件,等待调度执行

进入就绪态的原因:从运行态被更高优先级的任务剥夺、从等待状态等待时间结束或等待的事件出现、新创建的任务。

3、  等待态

等待状态是指任务不具备运行条件,需要等待某个条件的出现。

来自于运行态;进入等待状态可能是需要延时,或需要等待某种资源、某个消息等。

4、  运行态

运行态是指任务占用CPU,执行任务程序。

5、  被中断态

被中断态是指任务运行中出现了某个中断请求,CPU满足相应条件,暂停正在运行的任务,将其转入被中断态,CPU执行中断服务程序。

 

四、常用的uCOS_II函数

         uCOS_II初始化与启动函数

1、    OSInit ----------uCOS_II初始化函数           

函数原型:void OSInit(void)

所属文件:OS_CORE.C

功能:初始化µCOS-II。会创建两个任务,一个是空闲任务,另一个是统计任务。

2、  OSStart ---------uCOS_II启动函数

函数原型:void OSStart(void)

所属文件:OS_CORE.C

功能:启动µCOS-II

说明:在调用OSStart()之前必须先调用OSInit().在用户程序中,OSStart()只能被调用一次,第二次调用OSStart()将不进行任何操作。

         uCOS_II创建、删除、唤醒任务函数

1、  OSTaskCreate ----创建任务函数

函数原型:INT8U OSTaskCreate(void(*task)(void *pdata),void *pdata,OS_STK *ptos,INT8U prio)

所属文件:OS_TASK.C

功能:建立一个新任务。任务的建立可以在多任务环境启动之前,也可以在正在运行的任务中建立。中断处理程序中不能建立任务。一个任务必须为无限循环结构,且不能有返回点。

2、  OSTaskCreateExt -----创建任务函数

函数原型:INT8U OSTaskCreateExt(void(*task)(void *pdata),void *pdata,OS_STK *ptos,INT8U prio,INT16U id,OS_STK *pbos,INT32U stk_size,void *pext,INT16U opt)

所属文件:OS_TASK.C

功能:建立一个新任务,比OSTaskCreate允许用户设置更多的细节内容。

3、  OSTaskDel ---------删除任务函数

函数原型:INT8U OSTask(INT8U pio)

所属文件:OS_TASK.C

功能:删除一个指定优先级的任务。如果任务不知道自己的优先级,可以使用OS_PRIO_SELF.被删除的任务将回到休眠状态。

4、  STaskResume ---------唤醒任务函数

函数原型:INT8U OSTaskResume(INT8U prio)
所属文件:OS_TASK.C

功能:唤醒一个用OSTaskSuspend函数挂起的任务,是唯一能解除挂起任务的函数。

         uCOS_II延时函数

1、  OSTimeDly ------------以节拍为单位的延时函数

函数原型:void OSTimeDly(INT16U ticks)

所属文件:OS_TIMC.C

功能:将一个任务延时0到65535个时钟节拍。如果延时时间大于0,系统将立即进行任务调度。延时时间0表示

2、  OSTimeDlyHMSM -------以时间为单位的延时函数

函数原型:void OSTimeDlyHMSM(INT8U hours,INT8U minutes,INT8U seconds,INT8U milli)

所属文件:OS_TIMC.C

功能:将一个任务延时若干小时。延时的单位是小时、分、秒、毫秒。

3、  OSTimeDlyResume --------唤醒延时的任务函数

函数原型:void OSTimeDlyResume(INT8U prio)

所属文件:OS_TIMC.C

挂起任务等待事件函数

1、  OSMboxPend ------------等待邮箱消息函数

2、  OSQPend ---------------等待队列消息函数

3、  OSSemPend ----------等待信号量函数

4、  OSTaskSusPend --------------无条件挂起任务函数

发送消息函数

1、  OSMboxPost ----------------向邮箱发送消息函数

2、  OSQPost ----------------------向消息队列发送消息函数

3、  OSQPostFron ----------向消息队列发送消息函数

4、  OSSemPost ------------发送信号量函数

建立同步事件函数

1、  OSSemCreate ---------------------创建信号量函数

2、  OSMboxCreate -------------------------创建消息邮箱函数

3、  OSQCreate ----------------------创建消息队列函数

中断操作函数

1、  OS_ENTER_CRITICAL -------------关闭CPU中断

2、  OS_EXIT_CRITICAL ------------------------打开CPU中断

3、  OSIntEnter -----------------------------通知uCOS_II进入中断处理函数

4、  OSIntExit --------------------------通知uCOS_II退出了中断处理函数

五、uCOS_II的ARM移植

         1、uCOS_II的移植条件

         为了使uCOS_II可以正常工作,处理器必须满足如下几个方面:

1)、C编译器能产生可重入代码

    2)、在程序中可以打开或者关闭中断

    3)、处理器能产生定时中断

    4)、微处理器能产生定时中断

    5)、微处理器支持硬件堆栈

2、uCOS_II的移植步骤

 1)、移植头文件OS_CPU.H

头文件OS_CPU.H中是与处理器和编译器相关的代码,需要修改移植

1.1、    与编译器相关的数据类型

1.2、    中断屏蔽

1.3、    堆栈增长方向控制

2)、移植OS_CPU_A.ASM文件

2.1、调用优先级最高的就绪任务函数OSStartHightRdy()

2.2、任务级的任务切换函数OSCtxSw()

2.3、中断级的任务切换函数OSIntCtxSw()

2.4、时钟节拍中断服务函数OSTickISR

3)、移植OS_CPU_C.c中的部分函数

3.1、OSTaskCreateHook()函数

3.2、OSTaskDelHook()函数

3.3、OSTaskSwHook()函数

3.4、OSTaskStatHook()函数

3.5、OSTimeTickHook()函数

六、基于uCOS_II的应用编程

1、基于uCOS_II的应用程序结构

  主要有主函数、任务函数、中断服务函数、一般函数、以及全局变量和有关声明等部分构成。

2、主函数结构

  主要有操作系统uCOS_II初始化、创建任务、启动uCOS_II,以及局部变量定义等部分构成,其结构如下:

void main(void)

{

……                                                                    //定义变量

OSInit();                                                           //初始化uCOS_II

OSTaskCreate(Task1,void *pdata1,OS_STK *ptos1,prio1);               //创建任务1

……

OSTaskCreate(Taskn,void *pdatan,OS_STK *ptosn,prion);               //创建任务n

……

OSStart();

return 0;

}

3、任务结构

  任务也是函数,但其内部有一个无限循环体。一般结构如下。

void Taskx(void *pdata)

{

…… //定义变量

while(1)

{

                             ……                                       //用户代码

                             //可能会有如下某些调用系统服务的函数,用于挂起任务    

                             OSMboxPend();                 //等待邮箱消息

                             OSQPend();                        //等待队列消息

                             OSSemPend();          //等待信号量

                             OSTaskSuspend(OS_PRIO_SELF);    //挂起任务

                             OSTimeDly();                     //延时一定的节拍数

                             OSTimeDlyHMSM();        //延时一定的时间

                             ……

                             OSTaskDel(OS_PRIO_SELF);//可能会删除任务

}

}

对于不能够循环运行的功能函数,可以使用删除任务函数 "OSTaskDel"来终止任务,再次调用时可以重新创建任务。或者使用挂起任务函数"OSTaskSuspend",使其停止运行,需要再次运行时,使用使用唤醒(结束挂起)任务函数"OSTaskResume"启动运行。

4、中断的处理方法

   由于uCOS_II移植的不完全性以及中断管理的简单性,因此,在uCOS_II下的中断处理方法,与没有操作系统基本相似,直接对有关寄存器进行操作。

4.1、中断初始化

在主函数中需要对中断初始化,包括:

设置中断模式、中断屏蔽、外中断的触发方式等;

设置中断向量、开中断

4.2、编写中断服务程序

在中断服务程序中,不能够使用事件将其挂起。

5、                                 uCOS_II多任务应用编程

5.1、uCOS_II多任务屏幕显示程序

创建10个任务分别显示数字0~9,并且统计CPU运行的任务数、CPU的占用比例,以及任务切换率(每秒切换的次数)

(1)、主函数

void APP_VMain(void)

{

                     OSInit();

                     RandomSem = OSSemCreate(1);

                     OSTaskCreate(TaskStart,(void*)0,&TaskStartStk[TASK_STK_SIZE-1],4);

                     FRMWPK_vStartTicker(OS_TICKS_PER_SEC);          

}

对UCOS详细介绍

阅读全文
0 0
原创粉丝点击