1.微内核

与Linux的首要区别是,它是一个微内核,内核所实现的功能非常简单,主要包括:

  1. 一些通用函数,如TaskCreate(),OSMutexPend(),OSQPost()等。
  2. 中断处理函数,且处理函数非常简单,一般仅是向相应的Task发消息,唤醒该Task来处理中断任务。
  3. 一个高效的调度器,这是OS的灵魂,实现多任务间的调度(包括调度点、调度算法、任务切换等)。

好像就这么点,呵呵。它不支持内存保护,即不像Linux那样分用户空间、内核空间。如一个Task运行时,可调用内核函数TaskCreate()创建另一个Task。

另外像一般操作系统中的内核模块(如设备驱动、网络、文件系统等)都是在Task中完成。如专门有个网络任务Net_Task,负责处理网络相关的内容,当其他Task需要向网络发数据时,就发消息给该Net_Task,当网卡接收到数据时,产生中断,中断程序一般也是发消息给该Net_Task,从而该任务被唤醒来处理。

而Linux中呢,这些module都被写在内核中,同时提供系统调用接口给用户层,用户层的多任务共享这些代码,就仿佛自身Task拥有这些功能(向内核借用功能)。其实说到底,原理是差不多的,都是去借用功能,但不同的设计策略,带来的是完全不同的代码结构、应用开发等。

uC/OS这种内核一般适于简单的嵌入式系统。

2.实时调度器

这是uC/OS的核心所在,如前所述,系统所有功能都是在多个Task中完成的,而多Task之外的代码仅是一些非常简单的中断处理函数。那么task调度就至关重要,必须分清楚轻重缓急的任务,确定某时刻应该执行哪个task。也就是说,不能寄希望于内核、中断程序会完成重要的工作,那是Linux。

因此uC/OS设计了实时调度器。不同于Linux中的基于时间片轮转的调度方法,uC/OS采用的是基于优先级的调度方法。其实也很简单,就是给每个task设定一个唯一的priority(现在的内核也支持多个相同优先级任务了),且每个task维护自己的状态(可运行,挂起等)。当task或者中断处理程序执行到调度点时(Linux中,中断处理程序也属于某个task的一部分,只不过是内核态而已,回忆回忆,呵呵,而uC/OS中他们是完全不同的执行体),查找所有可运行状态的task,选择priority最高的task执行,所以一般时间要求性高的任务,优先级会比较高。当然,在运行中可以动态改变优先级(都是在task体中完成的啊)。

调度点在哪呢?TaskCreate(),OSMutexPend(),OSQPost()这些函数都是哈,它们一般会修改相应task的状态(或唤醒、或挂起等等),然后开始调度。一个原则是系统任意时刻,要么运行在中断程序中,要么运行在priority最高的task体中,所以任何task的状态改变、或priority改变之后,都要进行调度。

调度函数虽然是内核提供的函数,但却可以由用户task不加保护地调用,这也是和Linux的区别。

3.开发

开发非常简单,基本不存在内核开发,因为功能都是task中做得嘛。Uc/OS的内核代码很少,也非常简单,主要包括Ucos_os、Ucos_cpu两部分,作移植只要修改后一部分即可。它们提供了通用的内核函数,调度器,以及几个task的执行体等。

系统启动时,和Linux差不多,是一个串行流程,执行一些初始化(如设置中断、分配一些全局变量等),然后调用TaskCreate()创建几个系统task(仅是因为它们是系统自动创建的,功能也比较特别,运行后与其他task是一样的哈),然后再创建一个MainTask,该task的执行体为函数main(),这是用户开发的起点。最后调用OSStart()启动多任务系统,首先选择一个优先级最高的可运行态任务运行,这以后就是多task、中断程序相互纠缠、配合运行了。

再回过头来看OS,其实它的执行流(我想不出什么好词)和一般的无os的前后台程序是一样的。怎么讲?比如我用uc/os设计一个3任务的系统,各个task间相互发消息(或通过中断)来切换。那么如果用前后台程序来设计,程序的主体有3段,每段中有很多goto语句来跳转到另一段。哈哈!如果你够牛逼,你可以绞尽脑汁来设计好这其中的跳转方法,那么你的程序里没有额外的系统开销,效率还可能高一些。但这显然没有用os开发来得方便,这也许就是os最初诞生的原因吧。

关于uC/OS的简单学习(转)的更多相关文章

  1. 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

    SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...

  2. 【原创】uC/OS II 任务切换原理

    今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引 ...

  3. 在STM32F401上移植uC/OS的一个小问题 [原创]

    STM32F401xx是意法半导体新推出的Cortex-M4内核的MCU,相较于已经非常流行的STM32F407xx和STM32F427xx等相同内核的MCU而言,其特点是功耗仅为128uA/MHz, ...

  4. 简单学习一下ibd数据文件解析

    来源:原创投稿 作者:花家舍 简介:数据库技术爱好者. GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 简单学习一下数据文件解析 这是尝试使用Golang语言简单解析My ...

  5. Log4j简单学习笔记

    log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...

  6. uC/OS II原理分析及源码阅读(一)

    uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...

  7. uc/os 任务删除

    问题描述:     uc/os 任务删除 问题解决: uc/os任务删除流程图 具体代码 注:     如上是关中断,以及取消优先级对应的就绪标志 关中断代码为: 取消就绪标志,实际上是将就绪表中指定 ...

  8. uc/os任务创建

    问题描述:      uc/os中任务创建 问题解决: 创建一个任务,任务从无到有.任务创建函数分两种, 一种是基本的创建函数OSTaskCreate, 另一种是扩展的任务创建函数OSTaskCrea ...

  9. uC/OS 的任务调度解析 (转)

    uC/OS 的任务调度解析 1.任务调度器启动之后(初始化,主要是TCB的初始化),就可以创建任务,开始任务调度了,实际上第一个任务准确的说不是进行任务切换,而是进行启动当前最高优先级任务.uC/OS ...

随机推荐

  1. Sicily 1129. ISBN

    题目地址:1129. ISBN 思路: 这道题比较简单,只要看懂题目就应该可以了.那就解释下题目好了,题目意思是按照权值计算这10个数字和,依据这个和计算还差多少可以对11整除,若还差10,那么在这个 ...

  2. 关于c语言不定参数的研究

    一. 学习过程 编写程序如下: 编译连接并用debug加载,观察main函数的内容: Showchar函数的内容: 观察发现,main函数要传递两个参数‘a’和2,在汇编代码中是先将2赋给ax,再将a ...

  3. LeetCode_Single Number II

    Given an array of integers, every element appears three times except for one. Find that single one. ...

  4. cf202-div 1-B - Apple Tree:搜索,数论,树的遍历

      http://codeforces.com/contest/348/problem/B   B. Apple Tree time limit per test 2 seconds memory l ...

  5. Storm流分组介绍

    Storm流分组介绍                流分组是拓扑定义的一部分,每个Bolt指定应该接收哪个流作为输入.流分组定义了流/元组如何在Bolt的任务之间进行分发.在设计拓扑的时候需要定义数据 ...

  6. Linux+eclipse+gdb调试postgresql源码

    pg内核源码解析课上用的vs调试pg源码, VS用起来确实方便,但是配置调试环境着实有点麻烦.首先得装个windows系统,最好是xp,win7稍微麻烦点:最好使用vs05,08和10也可以,但是比0 ...

  7. 关于java中是引用传递还是值传递的问题!!!经常在笔试中遇到,今天终于弄明白了!

    关于JAVA中参数传递问题有两种,一种是按值传递(如果是基本类型),另一种是按引用传递(如果是對象).首先以两个例子开始:1)public class Test2 { public static vo ...

  8. solr索引

    solr索引 当我们真正进入到Lucene源代码之中的时候,我们会发现: • Lucene的索引过程,就是按照全文检索的基本过程,将倒排表写成此文件格式的过程. • Lucene的搜索过程,就是按照此 ...

  9. JS截取字符串方法

    function textSubstr(str,sub_length){ str = str.trim(); var temp1 = str.replace(/[^\x00-\xff]/g," ...

  10. webpack之基础学习

    webpack工作原理: 通过一个入口文件,main.js开始找到你的项目的所有依赖文件,使用loaders处理它们,最后打包为一个浏览器可识别的JavaScript文件. Webpack的核心原理 ...