电子IT行业博大精深,没有人能够用笔记本天天记录自己所学的知识,于是乎,撰写博客就成了每个“IT民工”的专长。再者,写一篇博客,其意义与不但记录了自己所需的知识,更提高了自己对知识的理解程度,而且还可以将自己的经验与别人分享。
进入了汽车行业,当然就不能用以前的老掉牙的写程序的思路了---跑裸机。目前自己尚且只熟悉UCOSII这个操作系统,于是就选择这个系统作为自己的代码组织框架系统(后面再去学习LINUX,目前再弄上位机)。
首先,我们对UCOS做一个简介。
进入了汽车行业,当然就不能用以前的老掉牙的写程序的思路了---跑裸机。目前自己尚且只熟悉UCOSII这个操作系统,于是就选择这个系统作为自己的代码组织框架系统(后面再去学习LINUX,目前再弄上位机)。
首先,我们对UCOS做一个简介。
UCOSII 的前身是 UCOS,最早出自于 1992 年美国嵌入式系统专家 Jean J.Labrosse 在《嵌
入式系统编程》杂志的 5 月和 6 月刊上刊登的文章连载,并把 UCOS 的源码发布在该杂志的
BBS 上。目前最新的版本: UCOSIII 已经出来,但是现在使用最为广的还是 UCOSII,本
我们主要针对 UCOSII 进行介绍。在学习本章之前, UOCS 相关的知识比较多,我们实验也知
识指点一下大家入门,详细了解建议大家先看看任哲老师的《嵌入式实时操作系统 ucosII 原理
及应用》,这本书的 Pdf 我们光盘有,大家可以翻阅一下。同时我们光盘还提供了一个北航老
师的 UCOS 简明讲义,大家也可以翻阅一下。
UCOSII 是专门为计算机的嵌入式应用设计的, 绝大部分代码是用 C 语言编写的。 CPU 硬件相关部分是用汇编语言编写的、总量约 200 行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的 CPU 上。用户只要有标准的 ANSI 的 C 交叉编译器,有汇编器、连接器等软件工具,就可以将 UCOSII 嵌人到开发的产品中。 UCOSII 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点, 最小内核可编译至 2KB 。 UCOSII 已经移植到了几乎所有知名的 CPU 上。UCOSII 构思巧妙。结构简洁精练,可读性强,同时又具备了实时操作系统的全部功能,虽然它只是一个内核,但非常适合初次接触嵌入式实时操作系统的友,可以说是麻雀虽小,五脏俱全。
其实,使用UCOS最重要的还是了解信号量,信号量集,邮箱,消息队列等的用法。在这里我主要以自己的理解来说明这个相关函数的用法。
1.信号量:用于从一个任务向另一个任务传递 一个开关量的BOOL信号。
创建信号量指针: OS_EVENT *OS SemFlag。
创建信号量函数: OS_EVENT *OSSemCreate (INT16U cnt)。
发送信号量函数: INT8U OSSemPost(OS_EVENT *pevent)。
请求信号量函数: void OSSemPend( OS_EVENT *pevent, INT16U timeout, INT8U *err);其中需要注意的是Timeout,这个参数为0的时候表示无限等待,大于0就为表示演示多少个时钟节拍。
删除信号量好函数: OS_EVENT *OSSemDel (OS_EVENT *pevent,INT8U opt, INT8U *err)。
2.邮箱 :用于从一个任务向另一个任务传递一个字节的数据。
创建邮箱指针:
OS_EVENT *OS
Mbox;
创建邮箱函数: OSMboxPost (OS_EVENT *pevent,void *msg)
请求邮箱 函数: void *OSMboxPend (OS_EVENT *pevent, INT16U timeout,INT8U *err) 其中需要注意的是Timeout,这个参数为0的时候表示无限等待,大于0就为表示演示多少个时钟节拍。
查询邮箱状态 函数 : OSMboxQuery(OS_EVENT *pevent,OS_MBOX_DATA *pdata) 。
删除邮箱
函数
:
OS_EVENT *OSMboxDel(OS_EVENT *pevent,INT8U opt,INT8U *err)。
3.信号量集:
用于
从一个任务向另一个任务传递
最多32个开关量的BOOL信号集。
创建信号量集指针:
OS_FLAG_GRP
*
OutEnableCfgFlag。
创建信号量 集 函数: OS_FLAG_GRP *OSFlagCreate (OS_FLAGS flags,INT8U *err )
创建信号量 集 函数: OS_FLAG_GRP *OSFlagCreate (OS_FLAGS flags,INT8U *err )
发送信号量
集
函数:
OS_FLAGS OSFlagPost (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U opt, INT8U *err)
请求信号量
集
函数:
OS_FLAGS OSFlagPend(OS_FLAG_GRP*pgrp, OS_FLAGS flags, INT8U wait_type, INT16U
timeout, INT8U *err)。
注意:为了防止请求失效,一般使用
OS_FLAGS
+OS_FLAG_CONSUME的组合。
查询信号量状态函数: OS_FLAG_GRP * OSFlagQuery( OS_FLAG_GRP *pgrp, INT8U *err ),我们可以使用这个函数来不断查询这个信号量集的状态来做一些开关量的控制。
查询信号量状态函数: OS_FLAG_GRP * OSFlagQuery( OS_FLAG_GRP *pgrp, INT8U *err ),我们可以使用这个函数来不断查询这个信号量集的状态来做一些开关量的控制。
删除信号量
集
函数:
OS_EVENT *OSFlagDel
(
OS_FLAG_GRP *pgrp,
INT8U *err
)
4.消息队列:用于从一个任务向另一个任务传递多个字节的数据。
创建消息队列指针: OS_EVENT * MainMenuUI;
创建消息队列存储数组:void * MsgGrp[16];
创建消息队列 函数: OS_EVENT *OSQCreate(void**start,INT16U size)
请求消息队列 函数: void*OSQPend(OS_EVENT*pevent,INT16U timeout,INT8U *err)
查询消息队列函数: INT8U OSQQuery( OS_EVENT*pevent,OS_Q_DATA *pdata ).
4.消息队列:用于从一个任务向另一个任务传递多个字节的数据。
创建消息队列指针: OS_EVENT * MainMenuUI;
创建消息队列存储数组:void * MsgGrp[16];
创建消息队列 函数: OS_EVENT *OSQCreate(void**start,INT16U size)
请求消息队列 函数: void*OSQPend(OS_EVENT*pevent,INT16U timeout,INT8U *err)
查询消息队列函数: INT8U OSQQuery( OS_EVENT*pevent,OS_Q_DATA *pdata ).
发送消息队列
函数
:
INT8U OSQPost(OS_EVENT
*pevent,void *msg)和 INT8U OSQPost(OS_EVENT*pevent,void*msg)。
清空消息队列函数: INT8U OSQFlush( OS_EVENT *pevent )。
清空消息队列函数: INT8U OSQFlush( OS_EVENT *pevent )。
删除消息队列
函数
:
OS_EVENT *OSQDel(
OS_EVENT
*pevent
)。
5.软件定时器:用于产生非硬件的定时器中断,可以用计时。创建软件定时器指针:OS_TMR * ADCheckTime;
创建软件定时器函数: OS_TMR *OSTmrCreateINT32U dly, INT32U period, INT8U opt, OS_TMR_CALLBACK callback,void
*callback_arg, INT8U *pname, INT8U *perr)。
打开软件定时器函数: BOOLEAN OSTmrStart (OS_TMR *ptmr, INT8U *perr)。
关闭软件定时器函数: BOOLEAN OSTmrStop (OS_TMR *ptmr,INT8U opt,void *callback_arg,INT8U *perr)。
于是,我们就可以利用这些UCOSII独有的功能来分配系统的任务了,如下图所示:
好了,今天Realy就记录到这里了。