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. [布局] bootstrap基本标签总结

    文件头: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <titl ...

  2. 涂抹Oracle—Flashback

    11.1  基于flashback查询过去的数据 a.基于时间的查询(as of timestamp) 构造表falsh_tbl,删除数据然后查询 SQL>select * from flash ...

  3. hdu 2079 选课时间(题目已修改,注意读题)

    http://acm.hdu.edu.cn/showproblem.php?pid=2079 背包 #include <cstdio> #include <cstring> # ...

  4. 使用SQLiteDatabase进行数据库操作的步骤

    1.获取SQLiteDatabase对象,它代表了与数据库的连接.2.调用SQLiteDatabase的方法来执行SQL语句.3.操作SQL语句的执行结果,比如用SimpleCursorAdapter ...

  5. 【转】C++读写二进制文件

    原文网址:http://blog.csdn.net/lightlater/article/details/6364931 摘要: 使用C++读写二进制文件,在开发中操作的比较频繁,今天有幸找到一篇文章 ...

  6. [北京周六见]10 家创业公司联合招 Partner-均融资 1 到 3 轮-薪酬股权可观-本周六举行欢迎来坐坐吃喝谈天 - V2EX

    [北京周六见]10 家创业公司联合招 Partner-均融资 1 到 3 轮-薪酬股权可观-本周六举行欢迎来坐坐吃喝谈天 - V2EX [北京周六见]10 家创业公司联合招 Partner-均融资 1 ...

  7. Qt的内存管理

    在QT的程序中经常会看到只有new而不delete的情况,其实是因为QT有一套回收内存的机制,主要的规则如下: 1.所有继承自QOBJECT类的类,如果在new的时候指定了父亲,那么它的清理时在父亲被 ...

  8. (各个公司面试原题)在线做了一套CC++综合測试题,也来測一下你的水平吧(二)

    刚才把最后的10道题又看了下.也发上来吧. 以下给出试题.和我对题目的一些理解 前10道题地址 (各个公司面试原题)在线做了一套CC++综合測试题.也来測一下你的水平吧(一) 11.设已经有A,B,C ...

  9. Redis起步

    Rdis和JQuery一样是纯粹为应用而产生的,这里记录的是在CentOS 5.7上学习入门文章: 1.Redis简介  Redis是一个key-value存储系统.和Memcached类似,但是解决 ...

  10. Android应用程序的安装位置

    Android应用程序的默认安装位置以及是否可移动取决于开发者在其AndroidManifest.xml中的设置:   <manifestxmlns:android="http://s ...