关于uC/OS的简单学习(转)
1.微内核
与Linux的首要区别是,它是一个微内核,内核所实现的功能非常简单,主要包括:
- 一些通用函数,如TaskCreate(),OSMutexPend(),OSQPost()等。
- 中断处理函数,且处理函数非常简单,一般仅是向相应的Task发消息,唤醒该Task来处理中断任务。
- 一个高效的调度器,这是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的简单学习(转)的更多相关文章
- 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II
SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...
- 【原创】uC/OS II 任务切换原理
今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引 ...
- 在STM32F401上移植uC/OS的一个小问题 [原创]
STM32F401xx是意法半导体新推出的Cortex-M4内核的MCU,相较于已经非常流行的STM32F407xx和STM32F427xx等相同内核的MCU而言,其特点是功耗仅为128uA/MHz, ...
- 简单学习一下ibd数据文件解析
来源:原创投稿 作者:花家舍 简介:数据库技术爱好者. GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 简单学习一下数据文件解析 这是尝试使用Golang语言简单解析My ...
- Log4j简单学习笔记
log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...
- uC/OS II原理分析及源码阅读(一)
uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...
- uc/os 任务删除
问题描述: uc/os 任务删除 问题解决: uc/os任务删除流程图 具体代码 注: 如上是关中断,以及取消优先级对应的就绪标志 关中断代码为: 取消就绪标志,实际上是将就绪表中指定 ...
- uc/os任务创建
问题描述: uc/os中任务创建 问题解决: 创建一个任务,任务从无到有.任务创建函数分两种, 一种是基本的创建函数OSTaskCreate, 另一种是扩展的任务创建函数OSTaskCrea ...
- uC/OS 的任务调度解析 (转)
uC/OS 的任务调度解析 1.任务调度器启动之后(初始化,主要是TCB的初始化),就可以创建任务,开始任务调度了,实际上第一个任务准确的说不是进行任务切换,而是进行启动当前最高优先级任务.uC/OS ...
随机推荐
- rsyslog 直接kill进程,在重新启动会全部发送日志
<pre name="code" class="html">jrhapt11:/root# ps -ef | grep rsyslog root 8 ...
- 【HDOJ】1494 跑跑卡丁车
DP,将能量映射为0~14,注意当选择这圈加速的时候,这圈就不能再储存能量,同时能量14可能转化为10. #include <cstdio> #include <cstring> ...
- 设计模式(八):Bridge桥接模式 -- 结构型模式
1. 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度 ...
- led驱动程序设计
LED的驱动程序很简单,按照张字符型设备驱动设计方法顺下来即可实现,这里主要讲几个注意事项. 一.在linux系统中,操作硬件不能够使用物理地址,一定要用虚拟地址.将物理地址转化为虚拟地址的函数如下: ...
- JavaScript……
退役了好伤心…… 这几天搞研究性学习写网页版贪吃蛇代码……太蛋疼了 要学javascript,就还要搞AJAX.JQuery.JSON…… 我感觉整个人都不好了
- DPDK2.1开发者手册3-4
环境抽象层EAL 环境抽象层的任务对访问底层资源例如硬件和内存提供入口.它提供了隐藏应用和库的特殊性性的通用接口.它的责任是初始化分配资源(内存,pci设备,定时器,控制台等等). EAL提供的典型服 ...
- Hadoop分布式文件系统HDFS详解
Hadoop分布式文件系统即Hadoop Distributed FileSystem. 当数据集的大小超过一台独立的物理计算机的存储能力时,就有必要对它进行分区(Partition)并 ...
- [置顶] 白话最小边覆盖总结--附加 hdu1151结题报告
刚开始看到这个题目的时候就觉得想法很明了,就是不知道如何去匹配... 去网上看了不少人的解题报告,但是对于刚接触“最小边覆盖”的我来说....还是很困难滴....于是自己又开始一如以往学习“最大独立集 ...
- JAVA 并发实现六(Volatile的使用)
Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量. 这两种机制的提出都是为了实现代码线程的安全性.其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低 ...
- MyBatis的事务处理
先来假设这样一个问题:如果数据库里面有一个用户表和一个作家表,那么当要添加一条数据到作家表中时,作家表的id必须是用户表中的其中一个id,因为作家一定也要是一个用户.这时就涉及到事务处理. 在上一篇博 ...