zoukankan      html  css  js  c++  java
  • 嵌入式操作系统µCOSII及应用编程

    嵌入式操作系统µ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);          

    }

  • 相关阅读:
    Eclipse 导入项目乱码问题(中文乱码)
    sql中视图视图的作用
    Java基础-super关键字与this关键字
    Android LayoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot)的参数理解
    Android View和ViewGroup
    工厂方法模式(java 设计模式)
    设计模式(java) 单例模式 单例类
    eclipse乱码解决方法
    No resource found that matches the given name 'Theme.AppCompat.Light 的完美解决方案
    【转】使用 Eclipse 调试 Java 程序的 10 个技巧
  • 原文地址:https://www.cnblogs.com/flyfly/p/2268832.html
Copyright © 2011-2022 走看看