关于uC/OS的简单学习(转)

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最初诞生的原因吧。

时间: 2025-01-17 05:19:17

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

uC/OS II 任务切换原理

今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引发一次中断,自动将CS.IP寄存器压入堆栈,再利用中断返回,将新任务的任务断点指针弹出到CPU的CS.IP寄存器中,实现任务切换.虽然明白个大概,但是其中的细节却有点模糊,为什么调用IRET中断返回指令后,弹入CPU的CS.IP寄存器的断点指针是新任务的断点指针,而不是当前任务的,UCOS II是如

$.fn.extend简单学习

(function($){ /** 1. $.fn是指jquery的命名空间,加上fn上的方法及属性,会对jquery实例每一个有效. 如扩展$.fn.abc(),即$.fn.abc()是对jquery扩展了一个abc方法, 那么后面你的每一个jquery实例都可以引用这个方法了.  那么你可以这样子:$("#div").abc();  2.   jQuery为开发插件提拱了两个方法,分别是:  jQuery.extend(object);为扩展jQuery类本身.为类添加新的方法.→

varnish简单学习

操作系统:redhat5.5 前端服务器:varnish cache 2.1.5 监听端口8080 后端服务器:tengine 1.4.6 监听端口80 接着,建立varnish用户以及用户组,并且创建Varnish缓存目录和日志目录:[[email protected] ~]#useradd  -s /sbin/nologin varnish[[email protected] ~]#mkdir /data/varnish/cache[[email protected] ~]#mkdir /d

spring4.0.6最新稳定版新特性学习,简单学习教程(一)

Spring Framework 4.0 学习整理. Spring框架的核心部分就是Ioc容器,而Ioc控制的就是各种Bean,一个Spring项目的水平往往从其XML配置文件内容就能略知一二,很多项目,往往是外包公司的项目,配置文件往往是乱七八糟,抱着能跑就行,不报错就行的态度去写,然后在项目中后期发现各种缺失又去一通乱补,其结果就是,整个文档可读性极差,毫无章法.这也不能怪写这个XML的人,拿着苦逼程序员的工资干着架构师的工作必然是这个结果.为了程序员的幸福,我认为有必要来一套简单快速的官方

JAVA学习Swing章节按钮组件JButton的简单学习

package com.swing; import java.awt.Container; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.URL; import javax.swing.Icon; import javax.swing.ImageIcon;

Settings app简单学习记录

Settings是android系统设置的入口.主界面由Settings.java以及settings_headers.xml构成. Settings类继承自PreferenceActivity,而PreferenceActivity又继承自ListActivity,ListActivity拥有ListView和ListAdapter类型的成员变量. 1,如何使用PreferenceActivity构建页面 使用addPreferencesFromIntent或者addPreferencesFr

高内聚低耦合简单学习

起因:模块独立性指每个模块只完成系统要求的独立子功能,并且与其他模块的联系最少且接口简单, 两个定性的度量标准――耦合性和内聚性. 耦合性也称块间联系.指软件系统结构中各模块间相互联系紧密程度的一种度量.模块之间联系越 紧密,其耦合性就越强,模块的独立性则越差.模块间耦合高低取决于模块间接口的复杂性.调用的方 式及传递的信息.   耦合性分类(低――高): 无直接耦合;数据耦合;标记耦合;控制耦合;公共耦合;内容耦合; 1 无直接耦合: 2 数据耦合: 指两个模块之间有调用关系,传递的是简单的数

队列的简单学习

/**  * 1.在Java5中新增加了java.util.Queue接口,用以支持队列的常见操作.该接口扩展了java.util.Collection接口.  *   * Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取  * 或移除的元素.他们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常.  * 如果要使用前端而不移除该元素,使用element()或者pe

mysql 存储过程简单学习

转载自:http://blog.chinaunix.net/uid-23302288-id-3785111.html ■存储过程Stored Procedure 存储过程就是保存一系列SQL命令的集合,将这些sql命令有组织的形成一个小程序,这样会实现很复杂的处理 SQL基本是一个命令一个命令执行,虽然可以通过连接.子查询等实现些高级的处理,但局限性是显而易见的 ■存储过程的优势 1.提高执行性能(存储过程事先完成了解析.编译的处理,执行时能减轻数据库负担) 2.可减轻网络负担(比起多次传递SQ