UCOSII 是一个可以基于 ROM 运行的、可裁减的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和很多商业操作系统性能相当的实时操作系统(RTOS)。为了提供最好的移植性能, UCOSII 最大程度上使用 ANSI C 语言进行开发,并且已经移植到近 40 多种处理器体系上,涵盖了从 8 位到 64 位各种 CPU(包括 DSP)。
    UCOSII 是专门为计算机的嵌入式应用设计的, 绝大部分代码是用 C 语言编写的。 CPU 硬件相关部分是用汇编语言编写的、总量约 200 行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的 CPU 上。用户只要有标准的 ANSI 的 C 交叉编译器,有汇编器、连接器等软件工具,就可以将 UCOSII 嵌人到开发的产品中。 UCOSII 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点, 最小内核可编译至 2KB 。 
    UCOS主要有:
  任务管理:
    建立任务OSTaskCreat()/OSTaskCreatExt();
    任务堆栈OS_STK()
    堆栈检验OSTaskStkChk()
    删除任务OSTaskDel()
    请求删除任务OSTaskDelReq()
    改变任务的优先级OSTaskChangePrio()
    挂起任务OSTaskSuspend()
    恢复任务OSTaskResume()
    获得任务的信息OSTaskQuery()
  时间管理:
    任务延迟函数OSTimeDly()
    按时,分,秒延时函数OSRimeDLyHMSM()
    恢复延时的任务OSTimeDlyResume()
    系统时间OSTimeGet()和OSTimeSet()
  内存管理:    
    Typedef  struct
    {
    void   *osmemaddr    ;指向内存分区起始地址的指针。
    Void   *osmemfreelist  ;指向下一个空余内存控制块或者下一个空余内存块的指针,
    Int32u  osmemblksize  ;内存分区中内存块的大小,是建立内存分区时定义的。
    Int32u osmemnblks     ;内存分区中总的内存块数量,也是建立该内存分区时定义的。
    Int32u  osmemnfree    ;内存分区块中当前获得的空余块数量。
    }os_mem;
    建立一个内存分区,OSMemCreate()
    分配一个内存块,OSMemGet()
    释放一个内存块,OSMemPut()
    查询一个内存分区的状态,OSQMemQuery()
  任务调度:
    任务控制块TCB(Task Control Block)
    最高级就绪任务的TCB 地址OSTCBHighRdy
    OS_TASK_SW()函数来进行任务切换
  任务间通信与同步:信号、邮箱、队列     
     使用UCOS最重要的还是了解信号量,信号量集,邮箱,消息队列等的用法。在这里我主要以自己的理解来说明这个相关函数的用法。
1.信号量:用于从一个任务向另一个任务传递一个开关量的BOOL信号。
    创建信号量指针:OS_EVENT *OSSemFlag。
    创建信号量函数: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 *OSMbox;
    创建邮箱函数: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_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, INT16Utimeout, INT8U *err)。注意:为了防止请求失效,一般使用OS_FLAGS+OS_FLAG_CONSUME的组合。
    查询信号量状态函数: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)
     发送消息队列函数:INT8U OSQPost(OS_EVENT*pevent,void *msg)和 INT8U OSQPost(OS_EVENT*pevent,void*msg)
     清空消息队列函数: 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)

UCOS明白解析的更多相关文章

  1. mybatis源码-解析配置文件(二)之解析的流程

    目录 1. 简介 2. 配置文件解析流程分析 2.1 调用 2.2 解析的目的 2.3 XML 解析流程 2.3.1 build(parser) 2.3.2 new XMLConfigBuilder( ...

  2. Unified Emoji表情for Android

    这个是我做Android以来碰到的最烦的东西,该死的emoji表情,恨之入骨..无奈这个问题分配给我了.我也只能硬着头皮做. 0.吐个槽先 首先,你要明白什么是emoji表情,不知道的google,不 ...

  3. java类到底是如何加载并初始化的?

    Java虚拟机如何把编译好的.class文件加载到虚拟机里面?加载之后如何初始化类?静态类变量和实例类变量的初始化过程是否相同,分别是如何初始化的呢?这篇文章就 是解决上面3个问题的. 若有不正之处, ...

  4. jvm003 类加载的过程

    类加载的过程 一.加载 在加载阶段虚拟机需要完成以下三件事: 通过一个类的全限定名称来获取此类的二进制字节流 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 在内存中生成一个代表这个类的 ...

  5. es6属性基础教学,30分钟包会

    ES6基础智商划重点在实际开发中,ES6已经非常普及了.掌握ES6的知识变成了一种必须.尽管我们在使用时仍然需要经过babel编译.ES6彻底改变了前端的编码风格,可以说对于前端的影响非常巨大.值得高 ...

  6. ES6 基础

    转载自:ES6 基础 一.新的变量声明方式 let/const 与var不同,新的变量声明方式带来了一些不一样的特性,其中最重要的两个特性就是提供了块级作用域与不再具备变量提升. 通过2个简单的例子来 ...

  7. 新手必看ES6基础

    ES6 基础 一.新的变量声明方式 let/const 与var不同,新的变量声明方式带来了一些不一样的特性,其中最重要的两个特性就是提供了块级作用域与不再具备变量提升. 通过2个简单的例子来说明这两 ...

  8. es6常用基础合集

    es6常用基础合集 在实际开发中,ES6已经非常普及了.掌握ES6的知识变成了一种必须.尽管我们在使用时仍然需要经过babel编译. ES6彻底改变了前端的编码风格,可以说对于前端的影响非常巨大.值得 ...

  9. (转)java类到底是如何加载并初始化的?

    Java虚拟机如何把编译好的.class文件加载到虚拟机里面?加载之后如何初始化类?静态类变量和实例类变量的初始化过程是否相同,分别是如何初始化的呢?这篇文章就 是解决上面3个问题的. 若有不正之处, ...

随机推荐

  1. docker安装mysql5.6镜像并进行主从配置

    docker安装mysql镜像并进行主从配置 1.去DaoCloud官网(dockerhub可能因为网速问题下载的慢)查找需要的mysql版本镜像 docker pull daocloud.io/li ...

  2. 如何在 NET 程序万种死法中有效的生成 Dump (下)

    一:背景 上一篇我们聊到了如何通过 procdump 抓取 cpu爆高 和 内存暴涨 两种情况,这一篇再聊聊如何去抓程序 挂死 和 意外退出. 二:程序挂死 1. 定义 程序挂死 简单的说就是程序没有 ...

  3. java面试一日一题:mysql中的自增主键

    问题:请讲下mysql中的自增主键 分析:该问题主要考察对mysql中自增主键的掌握,使用场景及如何设置 回答要点: 主要从以下几点去考虑 1.什么自增主键 2.使用场景是什么: 3.innodb_a ...

  4. 1.5.1- HTML之相对路径

    网页需要图片,首先需要找到它.实际工作中,通常新建一个文件夹专门用于存放图像文件,这时插入图像,就需要采用"路径"的方式来制定图像文件的位置.路径可以分为相对路径与绝对路径. 相对 ...

  5. 分布式任务调度系统:xxl-job

    任务调度,通俗来说实际上就是"定时任务",分布式任务调度系统,翻译一下就是"分布式环境下定时任务系统". xxl-job一个分布式任务调度平台,其核心设计目标是 ...

  6. hdu 1814 字典序最小的2sat(暴力深搜)

    题意:      题意就是最基础的2sat,关系只有矛盾关系,然后二选一,关键是这个题目是输出字典序最小的那组解. 思路:      输出字典序最小,用强连通那个实现不了(起码没看到有人实现),其实我 ...

  7. 解决Android加固多进程ptrace反调试的思路整理

    本文博客链接:http://blog.csdn.net/qq1084283172/article/details/53613481 一.Android多进程反调试的原理代码 当ptrace附加目标进程 ...

  8. hdu3870 基于最短路的最小割

    题意:      给你一个平面图,让你输出(1,1),(n ,n)的最小割.. 思路:       看完题想都没想直接最大流,结果TLE,想想也是 G<400*400,400*400*4> ...

  9. YII框架的自定义布局(嵌套式布局,版本是1.1.20)

    0x01 创建控制器 0x02 创建文件夹,之后创建视图文件 0x03 浏览器访问cxy/index控制器,验证 以上就是使用默认的布局,非常简单,那么如果我不想用YII框架默认的布局呢,我想用自定义 ...

  10. POJ1698 最大流或者匈牙利

    题意:       一个人他有n个任务,每个任务都有一些限制:  (1)只能在一个星期中指定的日子去做,比如周1 2 6啥的  (2)总工作量有几天,就是一共要工作几天  (3)必须在几周之内完成,就 ...