嵌入式操作系统µ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);
}
- 嵌入式操作系统µCOS-II及应用编程
- 嵌入式实时操作系统uc/os-ii 原理及应用 读书笔记
- 嵌入式实时操作系统的基本概念——μ/COS-II读书笔记
- 《嵌入式实时操作系统μC/OS-II原理及应用(第2版)》目录
- 读书笔记之《嵌入式实时操作系统uCOS-II原理及应用》(持续更新)
- uCOS创建任务实例---code from《嵌入式实时操作系统uCos-II原理及应用》
- [uC/OS-II原理及应用]嵌入式实时操作系统的基本概念
- 嵌入式实时操作系统μC/OS-II原理及应用(1)
- 嵌入式XPE操作系统的构建及应用
- 嵌入式操作系统VxWorks简介及编程方法
- 嵌入式实时操作系统μC/OS-II及其应用
- 嵌入式实时操作系统ucos/ii 原理与应用(一)
- 嵌入式实时操作系统ucos/ii 原理与应用(二)
- 嵌入式实时操作系统ucos/ii 原理与应用(三)
- 嵌入式实时操作系统ucos/ii 原理与应用(四)
- 嵌入式实时操作系统ucos/ii 原理与应用(五)
- 嵌入式实时操作系统ucos/ii 原理与应用(六)
- 嵌入式实时操作系统ucos/ii 原理与应用(七)
- MySQL 开发实践
- 使用later实现定时任务操作
- ubuntu ceph OSD 删除命令操作
- phpexcel导入excel处理大数据
- ubuntu gedit中文乱码
- 嵌入式操作系统µCOS-II及应用编程
- spring boot 集成测试
- 线程组
- android retrofit 示例(二)
- Swift*UINavigationBar动态颜色/透明度/隐藏
- day\\\
- 前端小练习——九宫格布局
- Python logging模块详解
- HDU 2087 剪花布条(KMP查找不交叉区间的模式串个数)