当前位置:首页 > 单片机 > 单片机
[导读] 一、闲扯之前看完了sdcc man和datasheet之后,用sdcc写了几个小程序。大部分时间都在干一些调式代码的事,就趁这段时间把UCOS复习一下吧。由于这是UCOS的第一篇,就来扯点闲话吧。对于UCOSii,我其实没

一、闲扯

之前看完了sdcc man和datasheet之后,用sdcc写了几个小程序。大部分时间都在干一些调式代码的事,就趁这段时间把UCOS复习一下吧。由于这是UCOS的第一篇,就来扯点闲话吧。

对于UCOSii,我其实没有在实际的项目中用到过。只是记得在以前看过一本UCOS作者自己写的书,书名已经忘记了。这种语言或者系统架构的设计者写的书往往看起来很有意思,因为作者不仅会给你解释代码,还会告诉你他为什么要这么做。这比生硬得给出流程图和注释的参考类书要更有趣味,不得不说国内的一些书看起来就像是使用说明,在网络日益发达的今天这些书的作用越来越小。比如我想知道一个基类的具体功能,搜索要比翻书快上许多。

UCOS的本名是μ/cOS,用希腊字母μ表示它的轻量级。其实它并不是一个免费的RTOS,只有当被用作教育用途时(往往被用来供大家学习操作系统),才可以有免费的授权。但是在目前的环境下,大家用μ/cOS来进行开发应该还是不要紧的。据我所知,我还没有听说过有使用未授权μ/cOS被起诉的。又由于μ/cOS的相关文档以及结构性代码库还算比较完善,因此也算是个在嵌入式设备上较为流行的操作系统。

二、如何取得UCOS

UCOS的官网上有很多移植好的工程,还有一些相应的APP和Drive,这可以给大家节省不少时间。

UCOS下载中心:

http://micrium.com/downloadcenter/

三、系统初始化3.1 UCOS的任务

作为一个可移植的嵌入式实时操作系统,μ/cOS的任务应该仅仅被限定为用户进程管理。它应该将硬件层尽量抽象掉,所以在main入口以前的芯片初始化(初始化系统时钟、初始化Flash读取,初始化芯片工作模式等等)、板卡初始化以及C环境的初始化都交于用户自己来进行。这个部分,通俗的做法是载入芯片厂商提供一些已经标准化的库函数,许多编译器也会在编译工程时自动链接一些startup_函数以引导C环境的运行。

3.3 时钟节拍

要进行任务调度,内核的优先级必然要在各用户进程之上。它定期的打断各个任务运行,使自己突然占用CPU,并进行各种针对进程的操作。

这很自然让我们联想到中断,的确在Ucos中,常常用时钟中断来完成进程的管理工作。如果你不想在时钟中断里做太多的事,那么可以在中断产生时启动一个被注册为最高优先级的进程,由该进程来做调度工作。

3.4 UCOS的初始化流程

对UCOS内核来说,所有的进程都是一个对象,所以要有描述进程属性的数据结构,以供内核控制进程。内核还要创建另外一些数据结构来作为标记各种自身需要记录和调用的属性,还有一些数据结构被创建用以算法辅助。

UCOS运行的第一步,就是初始化这些数据结构。

给这些数据结构分配空间以及设初值之后,用户可以注册几个最开始的用户进程。紧接着内核对刚注册的这几个进程进行初始化,系统就进入了一个多任务运行的常态。

UCOSii初始化的伪代码:

int main (void)

{ /* 关闭系统中断,防止在初始化时去跑中断服务程序而造成难以预料的问题。OS_ENTER_CRITICAL()宏*/


/* 初始化内核的数据结构 OSInit()函数 */


/* 注册用户进程 OSTaskCreate()函数*/


/* 系统启动 OSStart()函数 */}12345678910


3.3 OSInit初始化的数据结构

OSInit会初始化内核用到的数据结构,了解这些数据结构对理解UCOS是必须的,这些数据结构这里只做个简要的描述,在之后的文章里再详细解释。

普通全局变量

用于描述一些内核的属性。一些计数器(比如计算一共进行了几次中断),状态器(比如是否已经进入多任务环境)。

OSPrioCur
OSPrioHighRdy
OSTCBCur
OSTCBHighRdy
OSTime
OSIntNesting
OSLockNesting
OSCtxSwCtr
OSTaskCtr
OSRunning
OSCPUUsage
OSIdleCtrMax
OSIdleCtrRun
OSIdleCtr
OSStatRdy
OSIntExitY

数组

就绪队列,用于调度算法。

链表

这个描述进程属性的数据结构一般叫做PCB(Process control block),UCOS里叫作TCB(Task control block)。所有的操作系统都会定义这样一个数据结构。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭