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. 更改Altium中PCB大小/精确确定板子尺寸

    使用原理图生成PCB后,Altium Designer会根据原理图大小自动生成一块黑色区域,还有一个在禁止布线层的方框,还有两段标注板子大小的线.下面说一下如何更改黑色区域的大小,还有如何精确确定板子 ...

  2. 深入理解JavaScript Hijacking原理

    最近在整理关于JavaScript代码安全方面的资料,在查关于JavaScript Hijacking的资料时,发现关于它的中文资料很少,故特意整理一下. 一.JavaScript Hijacking ...

  3. LibCurl编程手册以及代码实例

    1. LibCurl编程流程 在基于LibCurl的程序里,主要采用callback function (回调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时libcu ...

  4. HDOJ 1326 Box of Bricks(简单题)

    Problem Description Little Bob likes playing with his box of bricks. He puts the bricks one upon ano ...

  5. HDU5141--LIS again (LIS变形)

    题意一个序列的LIS为MAX, 求连续子序列的LIS为MAX的个数. 先求出LIS,记录以a[i]结尾的LIS的长度,以及LIS起始位置(靠右的起始位置). 然后线性扫一遍,,线段树与树状数组的差距还 ...

  6. Makefile如何通过宏开关进行条件编译

    在开发中经常会遇到需要条件编译一段代码,即: #ifdef DEBUG { 如果定义了DUBUG,则执行此段代码!} #else {否则执行此段代码!} 这就需要通过宏开关来进行条件编译,也就是常说的 ...

  7. ESB 企业服务总线

    整理的OSChina 第 38 期高手问答 —— ESB 企业服务总线,嘉宾为@肖俊_David . @肖俊_David 恒拓开源架构师,热衷于JAVA开发,有多年的企业级开发经验.曾参和设计和开发基 ...

  8. hdu4111 Alice and Bob

    Alice and Bob Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. (转)Maven实战(二)构建简单Maven项目

    上一节讲了maven的安装和配置,这一节我们来学习一下创建一个简单的Maven项目 1. 用Maven 命令创建一个简单的Maven项目 在cmd中运行如下命令: mvn archetype:gene ...

  10. Mysql数据库的mysql Schema 究竟有哪些东西& 手工注入的基础要领

    #查看数据库版本号 mysql> select @@version; +------------+ | @@version  | +------------+ | 5.5.16-log | +- ...