嵌入式μC/OS

2024-06-19

嵌入式μC/OS(共10篇)

嵌入式μC/OS 篇1

1 嵌入式系统概述

嵌入式系统具有很高的先进性, 它综合了多种高新技术, 包括计算机技术和电子技术以及半导体技术等, 是多种技术结合的产物。日常生活的点滴都渗透了嵌入式系统, 大大方便了人们的生活、丰富了人们的精神世界。它的应用领域非常广阔, 大到工业、服务业, 小到人们的日常娱乐活动, 并且随着经济的发展, 嵌入式系统的应用范围更加扩大。从专业的角度我们定义嵌入式系统为把计算机作为基础技术, 将应用作为中心, 可裁减软硬件的, 具备应用系统要求的功能、功耗、成本等要求的专用计算机系统。嵌入式系统有三个主要的特征, 分别是较强的专用性、精简的系统和具有较小的内核。嵌入式系统对软件的要求很高, 符合要求的软件必须具有很高的高实时性, 另外软件必须具备高质量和可靠性。我们需要专门的工具和环境对嵌入式系统进行开发[1]。

嵌入式μC/OS的体系结构比较简单, 所以大部分使用的是C语言进行编程, 大部分的友好界面的编译器都能够生成编译的目标代码, 友好的编译器有Borland C、Keil等。嵌入式μC/OS的体系的内核可以很小, 小到几十KB的都有, 所以它在移植时支持体系结构多种多样的微处理器。这样留给用户的工作就很少了, 由于源代码是开放的这就方便了学习。μC/OS-II有几大组成部分, 分别是:核心部分 (OSCore.c) , 这是操作系统的处理核心, 它又包括了多个组成部分, 主要有操作系统初始化、中断进出的前导、任务调度等。任务处理部分 (OSTask.c) 的操作是用来完成任务的, 它又包括了建立任务、删除任务、挂起任务、恢复任务等。时钟部分 (OSTime.c) 主要用来完成延时任务等。

嵌入式系统包括两大部分, 分别是硬件部分和软件部分。嵌入式系统的主要特性如下:

1) 其系统采用的是公开的源代码, 这也是它最大的特点, 在这一点上超越了其它的商业实时内核。源代码开放的好处是为在不同硬件平台上移植操作系统提供了很大的便利。

2) 嵌入式系统的可移植性能非常好, μC OS的嵌入式系统源代码大量采用了ANSI C进行编写, 所以具有很强的可移植性, 另外采用汇编语言编写了和微处理硬件有关的部分, 这样的目的是方面了μC/OS的嵌入式系统的移植, 可以适应8、16、32位等。

3) 嵌入式应用和μC/OS的联系十分紧密, 因为后者是适应前者而设计的, 所以可固化。开发者需要拥有一些固化手段, 包括编译、下载等就可以使μC/OS嵌入到产品中。

4) 可以进行裁减, 对于μC/OS的嵌入式系统中不被需要的东西可以进行裁减, 只选取有用的应用程序, 这样一来μC/OS所需的存储空间就会得到释放。

5) μC/OS的嵌入式系统的另一个特色就是占先式和多任务。级最高的任务在μC/OS的嵌入式系统中是被优先运行的, 不过轮转法的任务调度还是不被支持的, 实时内核是完全占先式的[2]。

6) 其它特性, 包括系统服务、稳定性、可确定性等都是μC/OS的嵌入式系统具有很大吸引力的原因, 对于安全要求很高的系统来说μC/OS的嵌入式系统是一个不错的选择。另外值得一提的是μC/OS中每个任务有独立的栈, 对于任务的独立栈空间是允许的[3]。

2 基于μC/OS的嵌入式系统的平台构建

在嵌入式系统的开发之前我们需要构建一个平台进行开发, μC/OS系统并不提供开发平台, 它提供的只是调度任务的内核。内核的作用是提供软件系统的基础, 如果想开发一个实用完整的操作系统需要首先进行μC/OS的移植, 将其移植到微处理器上之后扩展操作系统, 然后得到一个符合标准的操作系统之后才能对应用程序进行开发。

2.1 μC/OS的移植

微处理器上移植有μC/OS是内核正常运转的前提, 只有内核正常运行起来才能进一步扩展。μC/OS进行移植的例子不少了, 所以可修改现有的这些移植代码, 这需要结合自己选择的微处理器。微处理器需要满足一定条件才能够进行μC/OS的移植, 例如C编译器可产生重入编码、允许打开和中断C编译器等。

本文中的例子是S a m s u n g公司的ARM7TDMI, 通过它来进行μC/OS的移植, 其中移植主要是对OS-CPU.H.OS、OS-CPU-A.ASM和OS-CPU-C.C这三个文件的数据和参数进行改写, 目的就是进行移植。

2.1.1 对OS-CPU-C.C进行修改

所有和移植有关联的C函数都在OS-CPU-C.C中, 和操作系统相关的6个函数编写语言为C语言。这6个函数分别是5个钩子函数和一个堆栈初始化, 后者是必要的函数, 剩下的5个函数需要声明, 不过任何代码可以省略。

2.1.2 对OS-CPU-A.ASM的修改

OS-CPU-A.ASM中的4个关联处理器的函数由汇编语言编写, 这4个函数是OSStart High Rdy () 、OSCtx Sw () 、OSTick ISR () 、OSInit Ctx Sw () 。这4个函数各有分工, 例如可以运行优先级别的最高级的任务的函数是OSStart High Rdy () ;当前任务TCB的地址可以由LDRr4.addr-OSTCBCur.获得;LDRsp[r5]可以切换到新堆栈。再编写几个相关函数就完成了OS-CPU-A.ASM的移植工作。

2.1.3 修改OS-CPU.H

设置OS-CPU.H代码和ARM具有相关性, 并设置数据类型和编译器保持相关性。

对ARM中的数据类型进行定义:

#defi ne unsigned char BOOLEAN;

#defi ne unsigned char INT8U/*8位无符号整数*

#defi ne signed char INT8S/*8位有符号整数*/

#defi ne unsigned char INT16U/*16位无符号整数*/

#defi ne signed int INT8S/*16位有符号整数*/

#defi ne unsigned long INT32U/*32位无符号整数*/

#defi ne signed long INT32S/*32位有符号整数*/

#defi ne fl oat FP32/*单精度浮点数*/

#defi ne double FP64/*双精度浮点数*/

定义16位的ARM的数据类型为typed unsigned int OS-STK。

μC/OS只有完成了以上三个方面的移植才能够在ARM的微处理器上运行正常。完成移植工作后需要划分系统任务、配置存储的空间和实现任务的调度[4]。

2.2 扩展μC/OS

μC/OS是一个内核, 它可以执行实时多任务, 但是仅仅有μC/OS还是不够的, 不能实现完整的嵌入式系统, 如果想拥有完整实用的操作系统还需要进行除了移植以外的扩展工作。扩展指的是文件系统的建立和建立外部设备驱动、对有关的API函数进行规范化、GUI函数的创建等等。

μC/OS系统是没有文件系统的, 而嵌入式系统是需要使用文件系统的, 这就意味着我们要建立一个文件系统。文件系统的建立过程是首先对文件系统进行初始化, 接下来打开一个系统的指定文件, 然后对文件进行读取和写入, 最后关闭文件, 将缓冲释放, 这就是实现文件系统的过程。实现文件系统的过程中必须要首先用int OSFile () 函数来对系统文件进行初始化, 这样做的目的是分配合理的文件结构空间。系统的文件打开采用Open OSFile () 来打开, 对打开模式进行指定然后进行FILE结构的创建, 分配文件读取的缓冲区。文件的缓冲区数据由Read OSFile () 来直接进行读取, 如果数据为空那么就对FAT进行访问, 在文件缓冲区进行下一个簇的读取。Write OSFile () 负责在指定的文件中写入缓冲区[5]。

3 结束语

μC/OS是目前流行的、十分优秀的嵌入式操作系统, 它有众多的优点, 比如实时性好并且内存的需求很小、具有较好的移植性等。这些优点都能够使开发的周期减少, 对于开发嵌入式系统的应用程序是十分有利的。在新世纪嵌入式系统的发展尤为迅速, 随着嵌入式系统的快速发展μC/OS的应用前景也会越来越广阔[6]。

参考文献

[1]陈渝, 李明, 杨晔.源码开放的嵌入式系统软件分析与实践—基于SkyEye和ARM开发平台[M].中国电力出版社.2004.

[2]Bruce Powel Douglass, 柳翔.嵌入式与实时系统开发[M].中国电力出版社.2005.

[3]毛德操, 胡希明.嵌入式系统—采用公开源代码和StrongARM/Xscale处理器[M].清华大学出版社, 2003.

[4]王田苗.嵌入式系统设计与实例开发[M].清华大学出版社, 2002.

[5]杨柳, 卢清萍.嵌入式系统与Nios[J].安徽工程科技学院学报 (自然科学版) ;2005, (02) .

[6]白智国, 王芳, 冯丹.嵌入式系统移植问题的研究[J].计算机工程与科学.2005, (06) .

嵌入式μC/OS 篇2

摘要:针对某些嵌入式系统中处理数据量大和速度要求高的特点,提出一种应用于嵌入式系统中的大容量内存文件系统的实现方案。该方案通过在内存中建立文件系统,将临时数据有效组织于内存中,既提高访问速度又节省外存空间,因而能满足要求;通过将其移植到μC/OS系统下,便可进行性能测试和分析。结果表明,本内存文件系统具有较高的查找效率和内存利用率。

关键词:嵌入式系统 内存文件系统 大容量存储μC/OS

引言

嵌入式系统凭借其特有的功能和资源占用量少的特点,在各个领域得到了越来越多的应用。根据成本和设计的需要,一般的嵌入式系统都配置很少的外部存储空间甚至不带外部磁盘。但随着用户需求和功能复杂度的增加,越来越多的`嵌入式系统需要处理大容量的数据,或者在运行过程中会产生大量的临时数据。一方面这些数据处理完后不能立即删除;另一方面这些临时文件不需要长期保存。例如,用来上网冲浪的机顶盒设备在用户浏览过程中不断从互联网上接收数据,因此用户访问后的页面很可能再次浏览,所不能将浏览后的网页立即清除,当然,系统不需要也不可能将所有浏览过的页面保存于硬盘中。所以,处理数据量的增大给嵌入式系统的设计提供了新的要求。

一般来说,嵌入式系统处理大容量临时数据的有效方法是设计一个内存文件系统存储这些数据。内存文件系统MFS(Memory File System)是一个在内存中对文件实行按名存取的底层软件。和普通磁盘文件系统相比,内存文件系统具有存取速度快、可动态改变文件系统大小和数据掉电即丢失的优点,因此它适用于高速的临时数据处理。Linux下的Tmpfs、Proc文件系统以及Freebsd下的MFS都是一种内存文件系统。但是,这些通用操作系统上的内存文件系统不能够直接运用于到嵌入式系统中:其一,它们都是为资源丰富的通用PC平台设计的,不适用于资源有限的嵌入式系统;其二,这些通用内存文件系统的设计方案一般是利用内存来模拟磁盘文件系统,在内存中会建立文件系统缓冲区。这就是说除了文件系统本身占据了内存之外,磁盘缓冲区又会占所一些内存,这些就会导致内存的浪费和利用率的下降。根据上述考虑,本文设计了一适合于嵌放式大容量数据处理的嵌入式内存文件系统EMFS(Fmbedded Momory File System)。文中首先阐述了EMFS嵌入式系统的设计要点,随后讨论了如果将其移植到μC/OS系统,最后对其性能进行了分析和测试。

1 EMFS的设计

从前面分析得知,本文设计的EMFS不采用通用文件系统的磁盘设计方法,如Linux系统的Ext2节点结构和Windows的FAT结构。EMFS对文件的主要管理方式为:

①文件的各个属性单独存储在文件信息表(file status table)中;

②文件数据块用链表来分配和

[1] [2] [3]

★ GPS定位数据压缩算法的设计与实现

★ IEEE1588高精度同步算法的研究和实现

★ 靶场弹道跟踪实时数据平滑算法及实现

★ 受学生喜欢的老师 实现最大价值

★ 规划设计联系函格式范文

★ 认识容量和升说课稿

★ 限行通知

★ 建筑规划与设计个人简历

★ 学叠被子作文

嵌入式μC/OS 篇3

在语音控制技术中,语音识别是技术的核心,而语音识别具有大的运算量,需要较大的存储空间,对硬件平台的要求较高。目前,嵌入式应用中,对于语音识别技术的硬件实现平台,DSP较为常见。DSP具有运算速度快,结构独特等特点,可以对一些信号如语音、视频、音乐等进行最优化实时检测、处理和产生,可实现复杂的算法。DSP是运算型处理器,控制功能并不强,特别是针对多传感器信号输入时,CPU对各信号的处理也会增加诸多开销及等待时间。

基于此,本文研究设计将μC/OS-II实时内核植入DSP,通过操作系统管理与配置DSP的内存,决定系统资源供需的优先次序,对语音信号采集、语音识别、识别结果输出、控制算法运算、控制命令输出、显示等多任务进行有效调理,使DSP的所有资源最大限度地发挥作用。另外,DSP因为操作系统的植入,可增加系统的控制功能,一些开发成熟的算法也将很容易地运用于DSP中,大大地减少软件系统的开发难度。

一、系统硬件设计

μC/OS-II是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。其绝大部分代码是用C语言编写的,CPU 硬件相关部分则用汇编语言编写的,总量约200行的汇编语言部分被压缩到最低限度,可方便地移植到各种CPU 上。μC/OS-II其最小内核可编译至2kB,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点。

本文选用TI公司的TMS320F28335作为核心处理器,将μC/OS-II移植到TMS320F28335的片内FLASH中,通过μC/OS-II管理TMS320F28335的CPU、内存、通信接口等硬件资源。

TMS320F28335是TI公司推出的高于F2812的一款浮点型DSP,具有16通道的ADC输入,12位的AD转换器,线性度可以达到1.5%,片内FLASH 大小为256k,具有诸如SPI、SCI、CAN等多种通信接口。此芯片最高运行主频为150MHz,硬件资源丰富,选用此芯片作为处理器,将μC/OS-II植入其中,可以满足语音信号采集、语音识别、水温调节、水流量控制、信息显示等多任务的实时性要求。

硬件电路设计中,电路主要包括传感器驱动及信号调理电路、TMS320F28335电路、复位电路、时钟电路、LED显示电路、信号输出驱动电路和电源电路。系统的电路原理如图1所示。

图1 系统电路原理框图

图1中,信号调理电路包括传感器驱动电路和信号滤波放大电路两部分。传感器驱动电路主要为前端电容式声音传感器提供12V恒压驱动,为流量传感器和温度传感器转接电源;信号滤波放大电路则为前端传感器感应输出的信号进行滤波、放大及极性转换,从而输出适合DSP采集的模拟信号,信号电压范围为0~3V,滤波范围为300~3400Hz的抗混叠滤波。电源变换电路将交流电220V转换为直流24V,将24V电压再转换为5V,同时,将5V转换为3.3V和1.9V供F28335的IO和内核使用。另外,24V电源还将输入至信号调理模块与信号输出驱动模块。信号输出驱动电路将DSP输出的数字信号转换为模拟信号(4~20mA),再将转换的模拟信号输出至执行机构(电磁阀),电磁阀根据信号输入值调节阀门开度。

二、系统软件设计

系统的语音控制分为两个阶段,阶段1为淋浴前的水预加热;阶段2为淋浴时的出水量及液位控制。系统根据语音传感器输入的声音信号诸如“我要洗澡了,烧水”,“水太冷,调高到某度”,“水太热,降到某度”,“水太小,加大”等进行语音识别,识别时,对话语中的关键字进行提取识别,并且使用者话语与系统中存储的话语相似率达80%以上时,系统执行相应的控制操作。

系统软件部分的设计主要包括四部分:μC/OS-II的移植,信号采集,语音识别程序、显示及控制输出。软件系统结构图如图2所示。

1.μC/OS-II的移植

本文中μC/OS-II使用了V2.76版本,编译环境为DSP的开发环境CCS3.3。

μC/OS-II移植到其他微处理器,仅需修改OS_CPU.H、OS_CPU_C.C和OS_CPU_A.ASM与处理器特性相关的部分。移植到F28335中主要有以下工作:

(1)设置与处理器相关的常量、宏及类型,以形成OS_CPU.H文件。TMS320F28335的堆栈入口宽度为16位,堆栈的声明为Typedef INT16U OS-STK。因TMS320F28335堆栈的增长方向是递增的,故定义堆栈增长方向是从下向上,即

#defineOS_STK_GROWTH0

(2)根据F28335的主要堆栈结构,定义堆栈初始函数OSTaskInit()的主要代码。OSTaskInit()为OS_CPU_C.C文件中的必要函数。

(3)编写OS_CPU_A.ASM文件中的四个汇编语言函数:OSStartHighRdy(),OSCtxSw(),OSIntCtxSw(),OSTickISR()。这四个汇编言函数都涉及对寄存器的处理,需要实现使就绪态中最高优先级的任务运行、任务级任务切换、中断级任务切换和时钟节拍中断ISR。

2.信号采集

系统信号采集分为语音信号采集、水温度采集、水的输入输出流量采集。此三种信号的采集通过F28335的片内ADC实现。三种信号实时采集,各信号采样率的设置均在初始化程序中完成。语音信号的采样率设为10K。信号采集程序的流程如图3所示。

图3信号采集程序流程图

3.语音识别

淋浴系统的使用者非特定,本文选用采用HMM方法实现语音识别。系统语音识别的流程如图4所示。

如图4所示,系统语音识别分为模型训练阶段与系统应用阶段,通过训练HMM模型,得到使用阶段的语音识别参考模板,从而进行辨别决策,输出对应的语音控制操作命令。

(1)端点检测

对量化后的语音信号进行分帧和加窗。选取帧长为512点,帧移160,采用512点Hamming窗对信号加权,综合利用短时平均幅度和短时平均过零率对语音命令进行端点检测。

(2)特征参数提取

本文选择12阶的Mel频率倒谱系数(MFCC)与其一阶差分构成24维MFCC特征参数。根据式(1)、式(2),由N点的语音数据得出美尔频域滤波器组成Hm、DCT系数矩阵Dk,即12阶MFCC参数。最后将静态MFCC与其一阶差分合并得到24MFCC特征参数。

(1)

(2)

式中,M为滤波器个数;Wm为窗函数。

(3)连续隐马尔可夫模型

本文采用连续隐马尔可夫模型作为语音模型,选用包含3个混合高斯元的多元高斯概率密度函数作为B参数,可通过计算高斯概率密度函数计算出语音特征向量相对于连续HMM的概率输出。选取概率最大的作为识别结果。

采用Baum-Welch算法训练得到优化的模型参数。该算法利用新旧HMM模型参数之间的函数关系反复迭代运算,直至模型参数不再明显变化。迭代运算中使用的重估公式由式(3)~式(5)给出:

(3)(4)(5)

4.显示及控制输出

系统中,显示部分主要显示温度、加热、液位等信息,通过LED实现。

控制部分包括液位控制、加热控制、出水流量温度控制。液位控制主要为水箱监控,防干烧。加热控制为开关量控制,即将实时加热水箱的水,当温度达到指定值时,停止加热。

淋浴系统的出水分为冷水和热水,出水温度的控制根据冷水与热水的流量进行比例控制。DSP根据识别结果查找存储器中的与该结果对应的温度、流量值。DSP再根据该值输出驱动冷水阀门和热水阀门开度的数字信号。最后,电磁阀调节阀门开度,实现出水流量与温度的控制。出水流量控制采用逐步增减的方式,当系统收到加大水流量的命令后,按照固定水量等间距增加或减小,收到命令一次,加水一次。

三、集成与实验

以上各节为系统的硬件和软件设计,下面对系统进行集成,为各子程序设立在μC/OS-II的任务优先级,根据控制系统的要求,优先级分配如下:

采集任务优先级为4,语音识别任务优先级为5,加热任务优先级为3,液位控制任务优先级为2,出水流量温度控制任务优先级为6,显示任务优先级为7,硬件系统参数初始化任务Init Task优先级为8。

各程序任务优先级分配完毕,则对程序进行编译连接和下载。TI代码产生工具所产生的目标文件是一种模块化文件格式——COFF格式,即.out文件。程序中的代码和数据在COFF格式文件中以段形式形成,不同的段存放不同类型的内容。因此,编写连接器命令文件(.cmd)将本系统中各程序段正确地分配到DSP的地址空间,DSP集成开发环境CCS经编译链接之后,生成.out文件和.map文件,而后可通过仿真器将程序烧写到DSP的片内Flash中。另外,程序要实现上电自举,在程序中添加自引导程序,使系统上电自起动。

本文利用在线仿真,进行系统语音识别实验,在程序中设置断点,观察识别结果和处理时间。将计算机训练好的HMM模型,应用于系统中。

通过采集20人(10男10女)的语音信号进行识别,语音命令为:a—“我要洗澡了,烧水”,b—“水太冷,调高到55度”,c—“水太热,降到45度”,d—“水太小,加大”。读取的“水太小,加大”的语音信号及频谱图,如图5所示。各识别结果及识别平均响应时间如表1所示。

图5 语音命令d的波形图及频谱图

通过表1所示数据可知,4个命令中,各命令的处理时间均在300~450ms,完全可以满足系统的实时性要求。对于系统的识别率,选取的20人中,每一种命令至少有一人无法识别,识别率较高,但因样本容量较少,因此,应该加大测试样本,进一步测试系统的识别率。但就结果表明,该系统可应用于家用淋浴系统。

嵌入式μC/OS 篇4

嵌入式操作系统通常分为商用和源码公开两种。前者的主要代表有VXWORKS,PSOS等,特点是性能优良,使用方便但价格十分昂贵。后者由于代码是公开的,具有性能和价格两方面的优势。其中μC/OS-II是一个不错的选择。

μC/OS-II是由Labrosse编写的一个源码公开的嵌入式操作系统,这一点对于用户来说可谓利弊各半:好处在于,它是免费的,而且用户可以根据自己的需要对它进行修改;缺点在于,它缺乏必要的支持。它没有功能强大的软件包,用户通常需要编写自己的驱动程序,有时甚至还必须编写相关的移植程序。

1 μC/OS-II实时操作系统及性能

1.1 μC/OS-II系统的特点

(1)μC/OS-II是一个占先式的内核,即已经准备就绪的高优先级任务可以剥夺正在运行的低优先级任务的CPU使用权。这个特点使得它的实时性比非占先式的内核要好。通常都是在中断服务程序中使高优先级任务进入就绪态(例如使用发送信号的方法),退出中断服务程序后,将进行任务切换,高优先级任务被执行。

(2)μC/OS-II和大家所熟知的Linux等分时操作系统不同,它不支持时间片轮转法。它是一个基于优先级的实时操作系统。每一个任务必须具有不同的优先级(分析它的源码会发现μC/OS-II把任务的优先级当作任务的标识来使用,如果优先级相同,任务将无法区分)。进入就绪态的优先级最高的任务首先得到CPU的使用权,只有等它交出CPU的使用权后,其他任务才可以被执行。所以只能说它是多任务,不能说是多进程,至少不是人们所熟悉的那种多进程。

(3)μC/OS-II对共享资源提供了保护机制。μC/OS-II是一个支持多任务的操作系统。一个完整的程序可以划分成几个任务,不同的任务执行不同的功能。这样,一个任务就相当于模块化设计中的一个子模块。在任务中添加代码时,只要不是共享资源就不必担心互相之间有影响。对于共享资源(例如串口)。μC/OS-II也提供了很好的解决办法。一般情况下使用的是信号量的方法。简单地说,先创建一个信号量并对它进行初始化。当一个任务需要使用一个共享资源时,它必须先申请得到这个信号量。而一旦它得到了此信号量,那就只有等它使用完了该资源,信号量才会被释放。在这个过程中即使有优先权更高的任务进入了就绪态,因为无法得到此信号量,也不能使用该资源。这个特点的好处显而易见,当显示屏正在显示信息的时候,外部产生了一个中断,而在中断服务程序中需要显示屏显示其他信息。这样,退出中断服务程序后,原有的信息就可能被破坏了。而在μC/OS-II中采用信号量的方法时,只有显示屏把原有信息显示完毕后才可以显示新信息,从而可以避免这个问题。不过,采用这种方法是以牺牲系统的实时性为代价的。如果显示原有信息需要耗费大量时间,系统只好等待。从结果上看,等于延长了中断响应时间,这对于未显示信息是报警信息的情况,无疑是致命的。发生这种情况,在μC/OS-II中称为优先级反转。简单地说,就是高优先级任务必须等待低优先级任务的完成。在上述情况下,在两个任务之间发生优先级反转是无法避免的。所以使用μC/OS-II时,必须对所开发的系统了解清楚,才能选择对某种共享资源是否使用信号量。

1.2 μC/OS-II性能特点

μC/OS-II是源代码公开的实时嵌入式操作系统,在第1版的基础上做了重大的改进与升级,它的主要特点如下:

(1)公开源代码

源代码公开,并且可以从有关出版物上找到详细的源代码讲解和注释,这样使得系统变得透明,很容易就能把操作系统移植到各个不同的硬件平台上。

(2)可移植性(Portable)

μC/OS-II绝大部分源代码是用C语言写的,而与微处理器硬件相关的那部分是用汇编语言写的,使得μC/OS-II便于移植到其他微处理器上。

(3)可固化(ROMable)

μC/OS-II是为嵌入式应用而设计的,这就意味着,只要开发者有固化手段(即:C编译,连接,下载和固化),μC/OS-II可以嵌入到开发者的系统中。

(4)可裁剪性(Scalable)

开发者可以有选择的使用μC/OS-II中应用程序需要的哪些系统服务,这样可以减少μC/OS-II所需的存储空间。

(5)占先式(Preemptive)

μC/OS-II完全是占先式的实时内核,即总是运行就绪条件下优先级最高的任务。

(6)多任务(Mult-Task)

μC/OS-II可以管理64个任务,但目前的版本保留了8个给系统,应用程序最多有56个任务,赋予每个任务的优先级必须是不同的。μC/OS-II不支持时间片轮转调度法(Roand-roblin Scheduling)。

(7)可确定性(Affirmable)

全部μC/OS-II的函数调用与服务的执行时间具有其可确定性,即μC/OS-II系统服务的执行时间不依赖于应用程序任务的多少。

(8)实用性和可靠性

μC/OS-II自1992年以来,已经被移植到几乎所有嵌入式应用类CPU上,移植范例的源代码可以从因特网上下载。许多行业都有成功应用该实时内核的实例,这些应用的实践是该内核实用性和可靠性的最好证据。

2 嵌入式操作系统μC/OS-II的移植探讨

2.1 移植中的问题

所谓移植,就是使一个实时内核能在其他的微处理器(MPU)或微控制器(MCU)上运行。整个嵌入式系统分为两大层:硬件层和软件层。在移植时,这两个层都要考虑。硬件层主要是处理器,对μC/OS-II进行移植到不同处理器平台时,需要解决的主要问题有:

(1)数据类型的重定义。

对于一个操作系统来说,基于其上进行开发的应用系统一般都使用高级语言,高级语言都有自己的数据类型。但对于不同的处理器由于字长不相同,造成同一数据类型在不同处理器中会有不同的解释,所以对不同的处理器应该重新进行数据类型的定义。

(2)堆栈结构的设计。

当同一个操作系统应用于不同处理器或同一处理器的不同应用系统时,由于各应用系统所追求的性能各有特点,就会要求与性能有很大关系的堆栈结构尽可能与本系统所追求的性能一致。

(3)任务切换时的状态保存与恢复。

这是多任务操作系统最主要的工作,也是最频繁的工作。所以任务切换在实现时的正确与否是操作系统运行时的基本保证,同时它的简洁与否决定操作系统的效率。

2.2 移植μC/OS-II的条件

硬件层主要是处理器,移植μC/OS-II对目标处理器有一定要求,要求如下:

处理器的C编译器能产生可重入代码;处理器支持中断,并且能产生定时中断;用C语言能开、关中断;能支持一定数量的数据存储硬件堆栈;处理器有将堆栈指针以及其他CPU寄存器的内容读出、并存储到堆栈或其他内存中去的指令。

软件层主要分为四个部分:实时操作系统内核,与处理器相关部分,与应用相关部分,用户的应用系统。下面针对移植问题简述这四个部分:

(1)实时操作系统内核

实时操作系统对系统资源进行管理。主要包括任务分配和调度、系统时钟服务、内存管理、消息机制、异常处理等。μC/OS-II所有系统服务均由内核提供,内核将应用系统和底层硬件结合成一个完整的实时系统。

移植的时候内核是不变的,开发者根据自己应用系统的需要来选择实时操作系统内核,开发者不能对内核随意访问,只能使用内核提供的功能服务来开发自己的应用系统。内核确定,那么所提供的系统管理能力,系统服务也就被限定。开发者只能在规定的范围内对系统作些改动。

(2)与处理器相关的代码

这是移植中最关键的部分。内核将应用系统和底层硬件有机结合成一个实时系统。要使同一个内核能适用于不同的硬件体系,就要在内核和硬件之间有一个中间层,这就是与处理器相关的代码。处理器不同,这部分代码也不同。

包括了用#define定义的与处理器相关的常量、宏和类型定义。具体来讲有系统数据类型定义、栈增长方向定义、关中断和开中断定义、系统软中断的定义等。

这部分需要对处理器的寄存器进行操作,所以必须用汇编语言来编写。它包括四个子函数:

μC/OS-II中共定义了6个函数在该文件中。但是最重要的是OSTask Stk Init(),其他都是对系统内核的扩展时用的。

OSTask Stk Init()是在用户建立任务时系统内部自己调用的,对用户任务的堆栈进行初始化。使建立好的进入就绪态任务的堆栈与系统发生中断并将环境变量保存完毕时的栈结构一致。这样就可以用中断返回指令使就绪的任务运行起来。具体的入栈方式要根据不同处理器而定。

(3)与应用相关的代码

这一部分是用户根据自己的应用系统来定制合适的内核服务功能,包括两个文件:O S_C F G.H,INCLUDES.H。

OS_CFG.H来配置内核,用户根据需要对内核进行定制,留下需要的部分,去掉不需要的部分,设置系统的基本情况。比如系统可提供的最大任务数量,是否定制邮箱服务,是否需要系统提供任务挂起

功能,是否提供任务优先级动态改变功能等。

INCLUDES.H系统头文件,整个实时系统程序所需要的文件,包括了内核和用户的头文件。

(4)用户应用系统

这是整个实时系统的最高层,用户可通过利用实时操作系统提供的服务来开发自己的具体应用程序。

3 结束语

在嵌入式应用中,使用实时操作系统(RTOS)是当前嵌入式应用的一个特点,一种时尚,尤其在工业控制系统中,像μC/OS-II这样短小精湛的实时内核,更有用武之地。另外,μC/OS-II开放的、免费嵌入式实时操作系统的应用与推广,不仅缩短开发周期,而且会研发出质量更高,性能更好,更容易维护的应用软件。

从以上的分析中不难看出,对于实时性、可靠性要求较强的项目,特别是大型项目,最好使用μC/OS-II。而对于一些简单的、成本要求低的项目来说,就没必要这么麻烦了。需要指出的是,μC/OS-II的特点远不止这些,应用开发中需要注意的问题也很多,需要用户自己不断地探索和研究。μC/OS-II的移植很具有实际意义,是在嵌入应用系统开始开发之前必须要做的工作。

参考文献

[1][美]Jean J Labrosse.嵌入式实时操作系统μC/OS-II[M].北京:北京航空航天大学出版社,2003.

[2]邵贝贝.译μC/OS-II源码公开的实时嵌入式操作系统.中国电力出版社.

嵌入式μC/OS 篇5

摘要:介绍实时操作系统μC/OS-II的特点和内核结构,给出μC/OS-II在Samsung嵌入式S3C44BOX ARM7微处理器上的移植的步骤及详细相关代码,同时阐述μC/OS-II在应用中应注意的问题。

关键词:μC/OS-II S3C44BOX 移植 实时操作系统

μC/OS-II功能强大,支持56个用户任务,其内核为占先式,支持信号量、邮箱、消息队列等多种常用的进程间通信机制,现已成功应用到众多商业嵌入式系统中,是一个成熟稳定的实时内核。与大多商用RTOS不同的是,μC/OS-II公开所有的源代码,90%的代码使用标准的ANSI C语言书写,程序可读性强、移植性好;同时它可免费获得,即使商业应用也只收取少量的许可费用。因此,对μC/OS-II实时操作系统的学习研究、开发、应用具有重要意义。

Samsung S3C44B0X微处理器是三星公司专为手持设备和其它嵌入式应用提供的高性价比的微控制器解决方案。它使用ARM公司的16位/32位RISC结构,内核是ARM7TDMI,工作在66MHz,片上集成了以下部件:8K Cache、外部存储器控制器、LCD控制器、4个DMA通道、2个UART、1个多主I2C总线控制器、1个I2C总线控制器,以及5通道PWM定时器和1个内部定时器、8通道12位ADC等,能够与常用的外围设备实现无缝连接,功能强大。目前,国内应用较为广泛。

(本网网收集整理)

1 μC/OS-II实时操作系统结构

图1说明了μC/OS-II的软硬件体系结构。应用程序处于整个系统的顶层,每个任务都可以认为自已独占了CPU,因而可以设计成为一个无限循环。μC/OS-II处理器无关的代码提供了μC/OS-II的系统服务,应用程序可以使用这些API函数进行内存管理、任务间通信及创建、删除任务等。

大部分的μC/OS-II代码是使用ANSI C语言书写的,因此μC/OS-II的可移植性好,然而仍需要使用C和汇编语言写一些处理器相关代码。μC/OS-II的移植需要满足以下要求:

①处理器的C编译器可以产生可重入代码;

②可以使用C调用进入和退出临界区代码;

③处理器必须支持硬件中断,并且需要一个定时中断源;

④ 处理器需要能够容纳一定数据的硬件堆栈;

⑤处理器需要有能够在CPU寄存器与内核和堆栈交换数据的指令。

S3C44B0X处理器完全满足上述要求。

2 实时内核μC/OS-II在S3C44B0X上的移植

我们使用ARM SDT编译器,移植μC/OS-II主要包括以下几个步骤。

(1)设置OS_CPU.H中与处理器和编译器相关的代码

*************************************************

与编译器相关的数据类型

*************************************************

typedef unsigned char BOOLEAN;

typedef unsigned char INT8U; /*8位无符号整数*/

typedef signed char INT8S; /*8位有符号整数*/

typedef unsigned short INT16U; /*16位有符号整数*/

typedef signed short INT16S; /*16位无符号整数*/

typedef unsigned long INT32U; /*32位无符号整数*/

typedef signed long INT32S; /*32位有符号整数*/

typedef float FP32; /*单精度浮点数*/

typedef double FP64; /*双精度浮点数*/

typedef unsigned int OS_STK;/*堆栈入口宽度为16位*/与ARM处理器相关的.代码:

#define OS_ENTER_CRITICAL ARMEnableInt() /*开启中断*/

#define OS_STK_GROWTH 1 /*堆栈由高地址向低地址增长*/

(2)用C语言编写6个操作系统相关的函数(OS_CPU_C.C)

void OSTaskStkInit(void(task)(void *pd),void *pdata,void *ptos,INT16U opt)

{ unsigned int *stk;

opt =opt; /*因“opt”变量没有用到,防止编译器产生警告*/

stk =(unsigned int *)ptos; /*装载堆栈指针*/

/*为新任务创建上下文*/

*--stk=(unsigned int)task; /*lr*/

*--stk=(unsigned int)task /*pc*/

*--stk=0; /*r12*/

*--stk=0; /*r11*/

*--stk=0; /*r10*/

*--stk=0; /*r9*/

*--stk=0; /*r8*/

*--stk=0; /*r7*/

*--stk=0; /*r6*/

*--stk=0;

/*r5*/

*--stk=0; /*r4*/

*--stk=0; /*r3*/

*--stk=0; /*r2*/

*--stk=0; /*r1*/

*--stk=(unsigned int)pdata; /*r0*/

*--stk=(SVC32MODE|0x0|); /*cpsr IRQ,

*--stk=(SVC32MODE|0x0); /*spsr IRQ,关闭FIQ*/

return((void*)stk);

}

后5个函数是钩子函数,可以不加代码:

void OSTaskCreateHook(OS_TCB *ptcb)

void OSTaksDelHool (OS_TCB *ptcb)

void OSTaskSwHook(void)

void OSTaskStatHook(void)

(3)用汇编语言编写4个与处理器相关的函数(OS_CPU.ASM)

OSStartHighRdy() ;运行优先级最高的就绪任务

LDR r4,addr_OSTCBCur ;得到当前任务的TCB地址

LDR r5,addr_OSTCBHighRdy ;得到高优先级任务的TCB地址

LDR r5,addr_OSTCBHighRdy ;得到高优先级任务的TCB地址

LDR r5,[r5] ;得到堆栈指针

LDR sp,[r5] ;切换到新的堆栈

STR r5,[r4] ;设置新的当前任务的TCB地址

LDMFD sp!,{r4}

MSR CPSR_cxsf,r4

LDMFD sp!,{r0-r12,lr,pc} ;开始新的任务

END

OSCtxsw() 任务级的任务切换函数

STMFD sp!,{lr} ;保存PC指针

STMFD sp!,{lr} ;保存lr指针

STMFD sp!,{r0-r12} ;保存寄存器文件和返回地址

MRS r4,CPSR

STMFD sp!,{r4} ;保存当前PSR

MRS r4,SPSR

STMFD sp!,{r4}

;OSPrioCur=OSPrioHighRdy

LDR r4,addr_OSPrioCur

LDR r5,addr_OSPrioHighRdy

LDRB r6,[r5]

STRB r6,[r4]

;得到当前任务的TCB地址

LDR r4,addr_OSTCBCur

LDR r5,[r4]

STR sp,[r5] ;保存栈指针在占先任务的TCB上

;取得高优先级任务的TCB地址

LDR r6,addr_OSTCBHighRdy

LDR r6,[r6]

LDR sp,[r6] ;得到新任务的堆栈指针

;OSTCBCur=OSTCBHighRdy

STR r6,[r4]

;得到当前新任务的TCB地址

LDMFD sp!,{r4}

MSR SPSR_cxsf,r4

LDMFD sp!,{r4}

MSR SPSR_cxsf,r4

LDMFD sp!,{r0-r12,lr pc}

OSIntCtxSw() ;中断级的任务切换函数

LDMIA sp!,{al-vl,lr}

SUBS pc,lr,#4

SUB lr,lr,#4

MOV r12,lr

MRS lr,SPSR

AND lr,lr,#0XFFFFFE0

ORR lr,lr,#0XD3

MSR CPSR_CXSF,lr

OSTickISR() ;中断服务函数

STMDB sp!,{r0-r11,lr}

MRS r0,CPSR

ORR r0,r0,#0x80; ;设置中断禁止标志

MSR CPSR_cxsf,r0 ;中断结束

LDR r0,I_ISPC

LDR r1,=BIT_TIMER0

STR r1,{r0}

BL IrqStart

BL osTimeTick

BL IrqFinish

LDR r0,=need_to_swap_context

LDR R2,[R0]

CMP r2,#1

LDREQ pc,=_CON_SW

完成上述工作后,μC/OS-II就可以运行在ARM处理器上了。

3 使用μC/OS-II系统应注意的问题

①μC/OS-II和Linux等分时操作系统不同,不支持时间片轮转法。它是一个基于优先级的实时操作系统。每一个任务的优先级必须不同(分析它的源码会发现,μC/OS-II把任务的优先级当作任务在标识来使用,如果优先级相同,任务将无法区分)。进入就绪态的优先级最高的任务首先得到CPU的使用权,只有等它交出CPU的使用权后,其它任务才可以被执行。所以,它只能就是多任务,不能就是多进程,至少不是我们所熟悉的那种多进程。

②μC/OS-II对共享资源提供了保护的机制。μC/OS-II是一个支持多任务的操作系统。我们可以把一个完整的程序划分成几个任务,不同的任务执行不同的功能。对于共享资源(比如串口),μC/OS-II也提供了很好的解决办法,一般情况下使用的是信号量方法。我们创建一个信号量并对它进行初始化,当一个任务需要使用一个共享资源时,它必须先申请得到这个信号量。在这个过程中即使有优先权更高的任务进入了就绪态,因为无法得到信号量,也不能使用该资源。在μC/OS-II中称为优先级反转。简单地说,就是高优先级任务必须等待低优先级任务的完成。在上述情况下,在两个任务之间发生优先级后转是无法避免的。所以不在使用μC/OS-II时,必须对所开发的系统了解清楚才能选择对于某种共享资源是否使用信号量。

③μC/OS-II内存管理不够完善。在分析许多μC/OS-II的应用实例中发现,任务栈空间和内存分区的创建采用了定义全局数组的方法,这样实现起来固然简单,但不够灵活有效。

编译器会将全局数组作为未初始化的全局变量,放到应用程序映像的数据段。数组的大小是固定的,生成映像后不可能在使用中动态地改变。对于任务栈空间来说,数组定义大了会造成内存浪费;定义小了任务栈溢出,会造成系统崩溃。对于内存分区,在不知道系统初始化后给用户留下了多少自由内存空间的情况下,很难定义内存分区所使用数组的大小。此外,现在μC/OS-II只支持固定大小的内存分区,容易造成内存浪费。μC/OS-II将来应该被改进以支持可变大小的内存分区。因此,系统初始化后能清楚地掌握自由内存空间的情况是很重要的。所以,应避免使用全局数组分配内存空间,关键是要知道整个应用程序在编译、链接后代码段和数据段的大小,在目标板内存中是如何定位,以及目标板内存的大小。

总之,随着各种智能嵌入式系统的复杂化和系统实时性需求的提高,伴随应用软件朝着系统化发展的加速,功能强大的实时操作系统μC/OS-II

嵌入式μC/OS 篇6

关键词:车载免提,蓝牙,μC/OS-Ⅱ,ARM

引言

随着汽车技术的发展, 汽车的安全性和便捷性越来越受到关注, 而蓝牙技术的不断进步使这两方面得以实现, 从而使蓝牙免提系统在汽车领域得到了广泛的应用。目前车载蓝牙免提系统已经成为安全驾驶的重要部分, 传统的车载免提是跟用户的手机配套的, 即一款手机对应一款车载免提, 如果换手机就需重新安装车载免提系统, 蓝牙技术成功的解决了这一问题, 蓝牙的初衷在于电缆的替代, 它可以使不同接口通过统一的无线连接方式方便的通信。只要汽车制造商留出统一的接口, 就可以直接安装蓝牙免提, 并且使用蓝牙技术, 手机和免提可以同时工作。

基于蓝牙免提系统的高稳定性和实时性的要求, 基于NXP公司的ARM7[1]系列芯片, 设计了嵌入式车载蓝牙免提系统, 着重介绍系统在嵌入μC/OS-II[2]实时操作系统下的软件设计, 该设计方案对嵌入式蓝牙系统的设计具有借鉴意义。

1 系统实现的功能介绍

该嵌入式车载蓝牙免提系统作为一个终端设备, 具有完备的功能。系统的主要功能是:自动辨识移动电话, 不需要电缆或电话托架便可与手机联机;使用者不需要触碰手机, 直接通过蓝牙免提系统上的按键便可控制手机, 从而实现接听或拨打电话等系统的功能;使用者可以通过车上的音响进行通话, 当有来电或拨打电话时, 车上音响会自动静音, 通过音响的扬声器和免提系统上的麦克来进行话音的传输;该系统还可以实时的播报来电人的姓名和手机接收到的短消息的内容, 从而实现了车载蓝牙免提系统的自然、安全和便捷的人机交互。

2 系统总体硬件设计

这里所介绍的基于语音合成技术和蓝牙技术的车载免提系统是以微处理器LPC2138为核心, 采用闻强GOC-MD-102[3]蓝牙模块作为通信模块, 采用XF-S3011芯片作为语音合成单元, 采用专用的语音处理芯片ATH3101作为免提语音处理单元, 使用XC6209E系列电源芯片构成高效稳定的电源系统, 其总体系统框图如图1所示:

该系统的蓝牙模块负责与音频网关 (蓝牙手机) 之间进行无线通信, 并将语音信号传入免提语音单元进行降噪、消除回音、消除侧音处理, TTS语音合成单元负责文本到语音数据的转换, 由基于ARM7内核的主控MCU芯片LPC2138来协调整个系统各部分之间的运转情况:与蓝牙模块和TTS语音合成单元进行串口通信, 与蓝牙免提语音单元进行IIC通信, 最后通过按键来响应执行各个功能。

3 系统总体软件设计和任务规划

该系统采用的微处理器为LPC2138芯片, 通过嵌入μC/OS-II操作系统来把程序分成多个任务, 根据不同的优先级来对各个任务进行调度, 使得高优先级的任务得以运行, 从而提高了系统的实时性。μC/OS-II具有免费、公开源代码、使用简单、可靠性高、实时性好、可移植性强等优点。

该系统将程序分成七个任务, 分别是初始化任务、按键扫描任务、按键处理任务、蓝牙发送任务、蓝牙接收任务、语音发送任务和语音接收任务。系统的任务接口框图如图2所示。

结束语

该系统针对目前车载蓝牙免提系统的稳定性和实时性, 提出了嵌入式车载蓝牙免提系统的软件设计方案, 在主控芯片LPC2138上嵌入μC/OS-II操作系统, 把程序分成多个任务, 根据不同的优先级来对各个任务进行调度, 使得高优先级的任务得以运行, 从而提高了系统的实时性。实践证明, 系统不仅功耗小、成本低、操作方便, 而且稳定可靠, 实时性强。

基于μC/OS-II的嵌入式车载蓝牙免提系统还可广泛应用于导航系统、车载调度和车载监控等应用领域。

参考文献

[1]David Sea1.ARM Architecture Reference Manua1.EditionPears0n Education Limited (Ad-dison-Wesley) , 2006.

[2]Jean J.Labrosse.μC/OS-II The Real-Time Kernel Second Edition.CMP Books, USA, 2003.

嵌入式μC/OS 篇7

随着工业4.0 的提出和工业以太网的普及, 越来越多的工业设备急需接入Internet。目前, 工业设备间的通信都通过现场总线来实现, 而要实现接入Internet需要网络协议的支持。在工业设备上可以通过嵌入式系统实现网络协议, 继而实现接入以太网。但是嵌入式系统自身资源有限, 处理能力不如台式机, 且台式机的TCP/IP协议的复杂性, 使得处理通信协议成为嵌入式系统接入Internet的关键[1]。瑞士计算机科学院的Adam Dunkels等开发了嵌入式TCP/IP协议栈Lw IP,这是一套既可以移植到操作系统上, 也可以独立运行的轻型TCP/IP协议栈, 在保持TCP协议的主要功能的基础上减少了对ARM的占用[2], 它只需十几KB的RAM和40K左右的ROM就可以运行, 这使Lw IP协议栈适合在低端的嵌入式系统中使用。

本文以STM32F407 处理器为硬件平台, 以嵌入式操作系统 μC/OS-III为软件平台, 利用Lw IP协议栈构建嵌入式web服务器, 对工业设备进行远程监控, 为工业控制与Internet互联提供解决方案。

2 Lw IP在操作系统 μC/OS-III中移植

μC/OS-III是由美国Micrium公司推出, 是一款开放源码、移植性良好、支持多任务、可剥夺型的实时操作系统。相比μC/OS-II,μC/OS-III做了很多改进,比如支持任意数目的任务、允许用户在程序运行中动态配置内核资源、允许嵌套挂起可深达250 层的任务、改进了时钟节拍管理机制、增加了中断处理任务、允许向任务直接发信号或消息、增加了时间戳功能、支持内核觉察式调试等[3]。

本文选取 μC/OS-III作为底层操作系统平台, 将Lw IP移植到 μC/OS-III嵌入式实时操作系统, 而其移植的过程就是完成Lw IP协议栈的初始化、时间管理、内存管理和任务同步的功能, 需要对Lw IP协议栈中的相关文件进行修改, 修改的主要内容如下表1 所示。

2.1 相关头文件修改

为了增加协议栈可移植性, 避免使用int、long等数据类型, 在CC.H文件下自主定义数据类型, 包括u8_t,s8_t,u16_t,s16_t,u32_t,s32_t,em_ptr_t,sys_prot_t等,即增加了代码的可读性, 又消除了处理器的字长差异引起的协议栈移植问题。同时CC.H文件下定义PACK_STRUCT_X宏, 让编译器放弃结构体的字节对齐, 避免C语言结构体4 字节对齐引起的数据读取异常等问题。

在CPU.H文件中定义字节排放顺序#define BYTE_ORDER LITTLE_ENDIAN为小端模式, 即将高位数据保存在高地址中。

在SYS_ARCH.H文件中定义操作系统模拟层所需要的主要数据结构, 以及Lw IP线程的主要参数定义,主要包括sys_sem_t(信号量)、sys_mbox_t(邮箱)等。

2.2 同步与通讯

Lw IP中使用信号量和消息队列进行同步和通讯。嵌入式操作系统 μC/OS-III也有类似的机制, 为了要实现Lw IP到嵌入式操作系统 μC/OS-III的移植, 需要用 μC/OS-III中的函数对Lw IP的对应函数进行重新封装。在实现sys_sem_new()、sys_sem_free()、sys_xbox_new()、sys_mbox_free() 函数时, 需加入临界段代码保护以确保OSSem Create()、OSSem Del()、OSQCreate()、OSQDel() 在执行时不被打断, 可避免出现系统资源管理错误[4]。

(1)sys_sem_t( 信号量)

在sys_arch.h实现了结构体sys_sem_t的相关定义, 在sys_arch.c中实现相关的信号量处理函数, 用于完成对信号量的建立、发送、等待和释放等功能。如下表2 所示。

(2)sys_mbox_t( 邮箱)

Lw IP使用邮箱来缓冲消息队列、传递数据报文,与信号量类似, 移植过程也是对 μC/OS-III的相关函数进行封装, 但不同的是sys_mbox_t类型指向的结构体包含 μC/OS-III操作系统的消息队列和指向消息的指针数组, 所以还需要用 μC/OS-III的内存管理模块进行的消息的分配、回收。移植的时候在sys_arch.h实现了结构体sys_mbox_t的相关定义, 在sys_arch.c中实现相关的消息队列处理函数, 用于完成对消息队列的创建、释放、发送和获取等功能。如下表3 所示。

2.3 定时处理

在Lw IP中, 每个与外界网络连接的线程都有自己的等待超时timeouts属性。这使得每一个线程都有对应的一个由sys_timeout结构组成timeouts链表, 而sys_timeouts结构则保存了指向这个链表的指针。线程在超时等待时间之后会调用sys_arch_timeouts() 函数, 主要实现的功能是返回对应于当前任务的指向定时事件链表的起始指针。

2.4 创建Lw IP线程

Lw IP支持单线程运行和多线程运行, 为了提高传输效率需要创建新的线程来实现多线程。对于 μC/OS-III来说, 没有线程的概念, 但可理解为任务, 创建新线程即创建新任务。因此, 创建Lw IP线程的sys_thread_new() 函数的实现只需调用 μC/OS-III提供的新建任务的函数OSTask Create() 就行了, 同时还需要指定线程的优先级, 这是 μC/OS-III中所必须的。

2.5 网络接口驱动实现

网络接口驱动主要实现对网卡的驱动。根据软硬件环境的不同, 实现网卡驱动的方式很对,Lw IP没有提供完整的网络接口驱动, 而是提供了一个驱动的模板,网络接口驱动的实现主要就是完善模板中的设备驱动程序, 一是底层硬件设备的初始化, 二是网络连接的初始化, 具体主要实现网卡初始化、接收和发送网络数据以及网络中断处理函数等功能。

底层硬件设备的初始化可以调用设备供应商提供的底层设备配置接口函数来实现底层硬件的初始化, 配置接口函数在ST32F4X7_eth.c文件中。

网络连接的初始化主要是完成底层设备与Lw IP之间的接口, 具体实现Lw IP内存区初始化以及MAC地址等设置, 同时实现网络驱动与Lw IP的对接, 告诉Lw IP如何接收来自底层网络的数据和如何将数据信息发送出去[5]。主要实现的函数主要有Lw IP_Init()。

Lw IP_Init() 主要负责Lw IP的初始化工作, 一部分是利用mem_init()、memp_init()、Set_MAC_Address()、IP4_ADDR() 的函数对操作系统模拟层、动态内存堆、动态内存池、pruf、ip模块、tcp模块等进行初始化, 另一部分是利用netif_init()、netif_add() 等函数进行网络接口的初始化, 包括初始化缺省网络接口和网络接口链表、网络接口注册、网络接口的通信使能等。Lw IP定义了netif结构体, 这是Lw IP实现网络功能的唯一网络接口。其中netif_add() 函数调用ethemetif_init() 函数进行网络接口初始化工作, 其主要负责完成对netif结构体的初始化, 即对网络底层硬件设备的描述, 调用low_level_output() 实现网络接口的发送函数, 调用low_level_init() 实现对硬件设备的初始化, 建立稳定的接收线程。

3 嵌入式web服务器远程监控的实现

为了实现嵌入式web服务器的远程监控, 需要实现Lw IP协议栈的应用层, 即超文本传输协议http、通用网关接口CGI等编写的应用程序。应用程序与Lw IP交互有两种方式: 一是直接调用协议栈各个模块函数, 二是调用Lw IP提供的API函数。直接调用协议栈的各个模块, 需要将TCP/IP协议放在一个单独的线程里面,作为同一个任务运行, 而采用调用API函数, 可以将TCP/IP协议和应用层协议放在不同的任务里面, 编写相应的应用层代码[6]。

主要步骤如下:

(1)初始化。具体步骤和调用函数如图1所示。

(2)处理应答

首先, 由netconn_recv() 返回首个数据段指针,把netbuf_data() 函数获得的数据存放至数据变量repuest[], 直到数据存储完毕。其次解释数组request[]存储的请求消息, 依据请求的差异分别处理静态与动态网页的数据信息。再次通过netconn_write() 函数将网页传递给互联网, 最后调用netconn_colse() 函数关闭连接。

(3) 处理动态网页

嵌入式web服务器使用CGI( 通用网关接口) 技术,实现服务器的动态交互操作。通常用C语言编写CGI脚本,printf函数输出html代码[7]。动态交互的具体过程为:web页面中输入控制数据, 点击提交向web服务器发送请求, 向CGI程序传递数据,CGI程序进行数据处理然后返回给WEB服务器,WEB服务器将CGI程序的处理结果返回给客户端并在浏览器中显示出来, 从而完成客户端与WEB服务器的数据交互。

4 测试结果

Lw IP协议栈移植完成后, 对其进行测试。本文选择了STM32F407cpu作为核心, 该cpu具有ARM 32位带FPU浮点Cortex-M4 内核, 提供了更快的通讯接口, 更高的采样率, 强大的运算处理能力。本文通过keil软件, 使用J-LINK仿真器烧写cpu内部flash, 在STM32407 上设置了一个嵌入式web服务器, 最后通过PC机作为客户端对其访问, 测试Lw IP的通信功能。

测试时, 设置嵌入式web服务器的IP地址为192.168.1.12, 子网掩码为255.255.255.0, 网管为192.168.1.1,PC主机IP地址为192.168.1.9, 下图为PC客户端对服务器ping通信的结果, 结果显示通信良好, 丢包率为0。

打开PC主机浏览器, 在地址栏中输入192.168.1.12, 即可访问到web服务器默认页面, 如图所示。网页中显示了LED灯等的状态和设置LED灯状态的按钮。选中需要点亮的LED灯, 提交后即可实现LED灯亮和状态的改变。测试结果表明,Lw IP在 μC/OS-III中可以成功的移植,web服务器能很好地控制LED灯。

5 结束语

本文着重研究了基于 μC/OS-III的Lw IP的远程监控的实现, 详细介绍了Lw IP协议栈在 μC/OS-III上的移植过程, 搭建嵌入式web服务器, 实现了对远程设备的管理和监控, 并以网页的形式图形界面为用户提供嵌入式设备的状态、参数等信息。Lw IP是一款专为嵌入式系统设计的以太网协议栈, 具有占用资源小、基本功能完备和便于移植等特点。μC/OS-III是可运行时配置的实时操作系统,将Lw IP移植到 μC/OS-III中, 使得嵌入式设备接入以太网, 符合当今物理信息融合的概念, 在智能家具、工业控制等领域具有很广泛的研究价值和广阔的市场空间。

参考文献

[1]周一兵,刘宪鹏.Lw IP在嵌入式系统中的应用[J].科技视界,2013,(6):40-40.

[2]高罗卿,庄源昌.基于LWIP协议的嵌入式远程监控终端的研发与实现[J].电气自动化,2015,37(1):49-51.

[3]宫辉,龚光华,黄土琛.从μC/OS-Ⅱ到μC/OS-Ⅲ的各种改进[J].单片机与嵌入式系统应用,2012,12(10):79-81.

[4]HAN D,YANG Q,WANG Z,et al.Implementation of Lw IP porting based onμC/OS-Ⅲ[J].Application of Electronic Technique,2013.

[5]王祖云,杨思国,王建伟等.嵌入式Lw IP协议栈的移植与测试研究[J].计算机与数字工程,2014,42(2):272-275.

[6]杨俊,吕建平,徐峰柳.基于μC/OS-Ⅱ和L IP的嵌入式Web服务器实现[J].电气自动化,2011,33(3):62-64.

嵌入式μC/OS 篇8

随着嵌入式系统和单片机技术的发展,嵌入式以太网的设计越来越受关注。美国贝尔实验室总裁Arun Netravali等一批科学家曾经作出了预测:未来"将会产生比PC 时代多出成百上千倍的瘦服务器和超级嵌入式瘦服务器,这些瘦服务器将与我们这个世界你能想象到的各种物理信息、生物信息相连接,通过Internet 自动地、实时地、方便地、简单地提供给需要这些信息的对象" [1]。 因此,研究和设计嵌入式网络通信将具有十分重要的价值。本文以LPC1768、DP83848CVVP芯片搭建硬件平台,构建以μC/OS-Ⅱ、LwIP为基础的软件系统,在此基础上实现web服务,从而达到通过浏览器对其进行访问的目的。

1 μC/OS-Ⅱ系统分析及移植

μC/OS-Ⅱ是由美国人Jean J.Labrosse编写的一个公开源代码的微内核嵌入式实时操作系统,其实时性能和内核的健壮性早已经在大量的实际应用中得到了证实。具有如下特点:①公开源代码,②移植性好,③可裁剪,④稳定性和可靠性高。

1.1 μC/OS-Ⅱ系统分析

μC/OS-Ⅱ是多任务系统,内核负责管理各个任务,每个任务都有其优先级,μC/OS-Ⅱ最多可以管理64个任务,其每个任务都拥有自己独立的堆栈。μC/OS-Ⅱ提供了非常丰富的系统服务功能,比如信号量、消息邮箱、消息队列、事件标志、内存管理和时间管理等,这些功能可以帮助用户实现非常复杂的应用。

1.2 μC/OS-Ⅱ移植

μC/OS-Ⅱ作为操作系统,全部源代码大约是6 000~7 000行,文件结构如图1所示,移植主要是处理与处理器相关的源文件,即os_cpu_c.c,os_cpu_a.s,os_cpu.h。其中os_cpu.h主要包含编译器相关的数据类型的定义、堆栈类型的定义以及几个宏定义和函数说明,为了便于移植,须重新定义数据类型,因为不同的编译器所提供的同一数据类型的数据长度并不相同。os_cpu_c.c文件中主要实现任务堆栈的初始化函数OSTaskStkInit(),任务创建函数通过调用函数OSTaskStkInit()初始化任务堆栈结构。在os_cpu_a.s文件中需要根据具体的硬件处理器实现几个汇编函数OSstartHighRdy()、OSCtxSw()、OSIntetxsw以及临界处理函数OS_CPU_SR_Save,OS_CPU_SR_Restore。尤其需要注意的是,由于LPC1768是cortex-m3内核,故OSCtxSw()、OSIntetxsw函数都是通过触发pendsv(可挂起中断服务)来完成,它负责μC/OS-II的全部上下文切换。

2 LPC1768的网络接口设计

由于LPC1768的以太网控制器只集成了介质访问控制器(MAC),缺少物理层(PHY),故本系统选用的PHY芯片为DP83848CVV芯片,由National Semiconductor公司生产,RJ45接口选用HanRun公司生产的HR911105A接口。DP83848CVV、HR911105A与LPC1768的硬件连接示意图如图2所示。1768的以太网模块使用RMII(简化的媒体独立接口)协议和片上MIIM(媒体独立接口管理)串行总线、MDIO(管理数据输入/输出)来实现与片外PHY之间的连接,MIMM接口可对PHY寄存器进行访问。RMII对应的引脚为ENET_TX_EN、ENET_TXD[1:0]、ENET_RXD_[1:0]、ENET_RX_ER、ENET_CRS、ENET_REF_CLK,接口MIMM对应的引脚为ENET_MDC、ENET_MDIO。需要注意的是使用DP83848CVV芯片的RMII模式必须外接50MHz的有源晶振。

3 LwIP介绍

LwIP是瑞士计算机科学院(Swedish Institute of Computer Science)Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。

3.1 LwIP协议栈的体系结构

LwIP的体系结构如图3所示,由图可知:LwIP由一些相对独立的模块组成,除TCP/IP协议的实现模块(IP、ICMP、UDP、TCP)外,还包括许多相关的支持模块,这些支持模块包括操作系统模拟层、缓冲与内存管理模块、网络接口函数以及一组Intemct校验和计算函数、API接口函数。

3.2 LwIP移植:实现操作系统模拟层

LwIP的操作系统模拟层(sys_arch)是底层操作系统和LwIP之间的一个接口,为LwIP提供信号量和邮箱2种进程间通信方式。当用户移植LwIP时,只需修改这个接口即可。主要实现以下几种类型的函数,分别是信号量操作函数、邮箱操作函数、临界保护函数、sys_thread_new()函数、sys_arch_timeouts()函数。由于μC/OS-II提供了创建任务函数、临界保护函数以及丰富的信号量和邮箱操作函数,所以只需对这些函数稍加修改,便可实现LwIP操作系统模拟层的函数。

3.3 LwIP协议栈的TCP通信流程

TCP属于传输层协议,它为应用层提供可靠的字节流服务,建立在TCP协议之上的应用层协议有HTTP等。本文采用的是HTTP协议。基本的TCP处理过程被分割为6个功能函数来实现:tcp_input()、tcp_process()、tcp_receive()、tcp_write、tcp_enqueue、tcp_output。实现框图如图4所示。

3.4 LwIP主线程tcpip_thread

主线程tcpip_thread是一个主控循环,底层接口函数通过tcpip_thread和lwip的内部函数进行通信,比如在进行tcp传输时,底层接口函数通过传递邮箱mbox的方式进入到tcpip_thread,然后在该函数中,进入tcp层的tcpip_input函数中,实现tcp层的传输。

3.5 LwIP API

LwIP API专为LwIP设计,所以它可以充分利用LwIP的内部结构以实现其设计目标,不需要在应用程序和协议栈之间复制数据,因此应用程序可以巧妙地直接处理内部缓冲区。LwIP API使用2种数据类型,分别为:①、netbuf,描述网络缓存的数据类型,对应的函数为netbuf_new()、netbuf_delete()、netbuf_alloc()等;②、netconn,描述网络连接的数据类型,对应的函数为netconn_new,netconn_delete()、netconn_bind,netconn_connect()、netconn_accept()等。LwIP的上层应用程序是基于LwIP API编写的。

4 HTTP协议

超文本传送协议(HTTP)是实现www的应用层协议,HTTP负责web服务器与web客户(浏览器)之间的实际超文本文档的传送。

4.1 HTML语言

网页就是一个HTML语法格式的纯文本文档,HTML是网络所基于的标准的格式化语言。HTML文档与网页在浏览器的显示并不相同,浏览器显示的是对HTML文档的解释。

4.2 HTTP报文格式

一个HTTP事物包含一个HTTP请求和一个HTTP应答报文,这两种报文都遵循一个通用结构,被称为HTTP报文格式,如图5所示。由图可知,请求行是HTTP请求报文的起始行,用于指示命令或客户要求服务器执行的动作、方法、要引用的资源以及客户使用的HTTP版本。该行格式如下: ,其中方法(method)告知服务器要执行的动作。方法的种类有"get"、"post"、"HEAD"等。本系统实现的是利用"get"请求向服务器提取网页。

5 系统实现

本系统的实现是通过在μC/OS-Ⅱ下建立的4个任务完成,分别是:① 起始任务task_start(),优先级为0,用于创建其他3个任务并进行LwIP、EMAC的初始化,执行之后被挂起,永不再执行;② 底层硬件接收任务ethernetif_input(),优先级为4;③ tcpip_thread()任务,优先级为1;④ http_server任务,优先级为10。任务②、③、④依靠μC/OS-Ⅱ下的信号量sem和邮箱mbox进入就绪态,否则被挂起。如图6所示:

当本系统上电时,由于此时浏览器并没有发送数据,网络接口没有数据,故没用中断发生,sem和mbox无法投递,所以此时这3个任务完全由μC/OS-II内核的系统定时器中断依据优先级而发生切换,程序流程如图7。tcpip_thread的优先级最高,tcpip_thread首先被运行,但由于没有邮箱被投递,故该任务随之被挂起,在内核调度的作用下,ethernetif_input()任务开始运行,同理,sem也没有投递,随之挂起,然后进入到http_server任务,随之也被挂起,此时系统进入空闲任务,等待中断的发生,即等待浏览器的访问。

web服务器的实现:

http_server任务是基于lwip API编程的,程序流程如图8所示,由图可以看出,在进入到netconn_accept函数时,等待邮箱accept_mbox的到来,否则被挂起。accept_mbox邮箱是在浏览器和服务器三次握手之后由accept_function()投递,此时程序进入netconn_recv()函数,等待recv_mbox的到来。recv_mbox的投递发生在数据被传至tcp层时,由recv_tcp函数投递的。一旦recv_mbox被post,则进入到netbuf_data()函数,用于获得接收数据指针,这个指针指向netbuf的第一个数据片段且这个片段包含HTTP请求,若是"get"请求,则发送网页,若不是则关闭连接,等待下一个连接到来。

6 结束语

本文详细介绍了利用LPC1768以太网控制模块,在μC/OS-II操作系统的基础上,移植LwIP协议栈,搭建嵌入式web服务器的过程。由于搭建的web服务器具有网页数据动态显示功能,可以满足一般的嵌入式设备进行远程监控,所以本系统实现对嵌入式设备的远程检测和控制具有很好的借鉴意义。

参考文献

[1]李纪栓.嵌入式INTERNET接入模块的设计[J].机械管理开发,2006,5.

[2]焦海波,刘健康.嵌入式网络系统设计-基于Atmel ARM7系列[M].北京:北京航空航天大学出版社,2008.4.

[3](美)JEAN J.LABROSSE.嵌入式实时操作系统μC/OS-II(第2版)[M].邵贝贝译.北京:北京航空航天大学出版社,2003.5.

[4]郑巨明,张和生,贾利民等.基于μC/OS II和LwIP的嵌入式以太网接口设计[J].计算机测量与控制,2009,17(11).

[5]熊海泉.μC/OS II下LwIP协议的移植实现[J].科技广场,2005.2.

嵌入式μC/OS 篇9

嵌入式系统是在原来简单的单片机系统上发展起来的, 以应用为中心, 软、硬件可剪裁的专用计算机系统, 适用于对功能、可靠性、成本、体积、功耗要求严格的场合。嵌入式系统具有系统精简、实时性强、专用性强等特点, 特别适合具有实时性能要求的机电控制系统。

传统的基于单片机的简易机械润滑控制系统, 虽然造价低, 但功能不足, 而基于专用控制系统机械润滑控制系统等性能较好, 但造价太高。因此采用高性能嵌入式微处理器和实时操作系统的嵌入式系统设计, 将克服以上不足, 具有很高的性价比, 是未来机械润滑控制系统的发展方向。

2 系统硬件设计

2.1 微处理器及其硬件资源分配

本设计采用三星公司S3C44B0X, 是一款专为手持设备和一般应用提供的高性价比、高性能的16/32位RISC型嵌入式微处理器。集成了ARM7TDMI核, 并在ARM7TDMI核基本功能的基础上集成了8KB Cache (数据或指令) 、内部SRAM、外部存储器控制器、LCD控制器、4个DMA通道、带自动握手的2通道UART、1个多主I2C总线控制器、1个I2S总线控制器、5通道PWM定时器、1个看门狗定时器、71个通用I/O口、8个外部中断源、具有日历功能的实时RTC、8通道10位A/D转换器、1个SIO接口以及PLL (锁相环) 时钟发生器等丰富的外围功能模块。

机械润滑控制系统输入输出及其分配见表1:

2.2 存储器的扩展

根据系统需要, 必须扩展程序存储器和S D R A M数据存储器。

程序存储器采用一片SST39VF160, 其存储容量为2MB, 并将其配置为存储器的Bank0, 其地址范围是0x00000000~0x001FFFFF。

SDRAM数据存储器使用HY57V651620B构建16位SDRAM存储器系统, 配置为存储器的B A N K 6, 其存储容量为4组×1 6 M位 (8MB) , 其地址范围是0x0C000000~0x0C7FFFFF。

2.3 键盘与显示电路

系统用于参数设置和控制的键盘采用矩阵式键盘, 并选用中断扫描工作方式。

系统需要显示的基本信息包括加油速度、加油量、润滑油温及其他参数、工作状态指示 (加润滑油、正常润滑、润滑故障灯) 和控制方式指示 (自动、半自动、调校) 等, 以及其他为了操作和控制的方便, 显示的其他有关的操作信息和控制界面。本系统选用LCD液晶显示器进行显示。

2.4 电机驱动控制模块电路

润滑控制系统需要执行电机进行润滑驱动, 系统选用交流伺服电机, 润滑油控制采用交流伺服电机的位置控制。系统中采用S3C44B0X所具有的脉冲宽度调制PWM方式的输出进行控制, 可对润滑加载速度和总量进行精确控制。

2.5 通信模块电路

主要是R S-2 3 2 C接口、U S B接口以及J T A G接口。其中R S-223322CC接接口口用用于于直直接接从从PPCC机机接接收收有有关关信信息息数数据据, , UUSSBB接接口用于接收U盘等USB移动设备存储的有关信息数据, JTAG接口则供系统交叉调试使用。需要注意的是S3C44B0X中只集成了JTAG信号, 因此其他接口都需要外部扩展。

2.6 温度检测模块电路

采用简单可靠的PT100传感器来获取温度信息, 将获取的信息放大后传给处理器进行A D处理。

篇幅所限, 完整硬件电路略去。

3 系统软件设计

3.1 μC/OS-Ⅱ操作系统的移植

所谓μC/OS-Ⅱ的移植, 实际上就是对μC/OS-Ⅱ中与处理器有关的代码进行重写或修改。

移植μC/O S-Ⅱ内核主要步骤:

(1) 用#define设置一个常量的值;

(2) 用#define分别声明3个宏和10个与编译器相关的数据类型 (在OS_CPU.H中) ;

(3) 用C语言编写6个与操作系统相关的函数 (在OS_CPU_C.C中) ;

(4) 用汇编语言编写4个与处理器相关的函数 (在O S_C P U_A.ASM中) 。

3.2 硬件驱动层扩展

计算机使用外部硬件, 都必须有驱动程序。μC/OS-Ⅱ系统没有给驱动程序提供统一的标准接口, 在系统中实现硬件管理的程序都称之为驱动程序。底层驱动程序通常采用汇编或C语言编写, 主要实现初始化硬件和释放硬件, 把数据从内核传到硬件和从硬件读取数据, 检测和处理设备出现的错误和故障。同时, 还必须将对某个硬件进行的某项操作的代码封装成函数, 供上层的程序调用。

本系统中, 主要完成通信接口、电机驱动控制、LCD显示等外设驱动函数的编写。限于篇幅, 驱动程序的编写就不详细介绍了。

3.3 应用程序代码的编写

(1) main主函数的编写。多任务的启动是通过在主函数main中调用OSStart () 来实现的。调用OSStart () 后, 从任务就绪表中找到优先级最高的任务控制块, 启动高优先级任务启动函数OSStart High Rdy () 然后再启动多任务内核。编写主程序m a i n () 中需要做的是调用OSInit () 对有关变量初始化, 创建任务, 调用OSStart () 进入实时多任务环境, 同时启动时间节拍定时器, 调度任务就绪表中优先级最高的任务转入运行。

(2) 中断函数的编写。中断函数的编写, 在中断服务程序中, 要在固定的两个位置增加两个函数OSInt Enter () 和OSInt Exit () , 并在系统初始化时挂接在中断向量表中。

(3) 用户任务的编写。基于μC/OS-Ⅱ操作系统内核的应用代码编程, 主要就是对各个任务的编程。本系统中OSTask Create () 创建了10个用户任务:作业控制、U盘读写、键盘输入、代码翻译、插补运算、电机控制、液晶显示、温度检测及报警、电源管理、时钟任务, 同时还包括空闲任务和统计任务等两个系统任务。其中时钟任务优先级最高, 它是一个超级任务, 用来对其他任务进行超时监控, 以避免程序“跑飞”或陷入死循环。优先级最高的是数据采集层, 包括U盘读写、键盘输入等任务, 主要是准确无误地读取信息并传递给数据处理层;

数据处理层是核心层, 包括代码翻译、插补运算等任务, 它根据数据采集层提供的信息, 选择相应的控制策略, 进行有关数据处理, 发出相应的控制指令;控制执行层包括电机控制、液晶显示等任务, 根据数据处理层的期望值作为控制量, 驱动相应的电机, 显示有关信息;辅助管理层包括电源管理、检测报警等任务, 优先级最低, 主要完成一些电源管理和系统诊断等辅助功能。各层内的任务优先级可以根据具体应用进行合理的设定。任务间的通信可以通过邮箱、消息队列等IPC机制来实现。限于篇幅, 下面仅介绍电机控制任务的程序设计。 (见图1)

4 结语

本设计经过实验室模型验证, 效果良好, 系统以S3C44B0X为控制器, 以μC/OS-Ⅱ为操作系统, 具有控制精度高、成本低、体积小、易于扩展和升级等特点, 是传统机械润滑控制系统改造和经济型智能润滑控制系统开发的首选, 具有良好的社会应用价值。

参考文献

[1]张一斌, 余建坤.单片机原理及应用课程设计指导.中南大学出版社, 2009.10.

[2]闫丽娟, 高剑钊, 李西红, 何涛.徐州重型机械有限公司.专利:工程机械集中润滑系统自动控制装置, 公开 (公告) 号:CN200946747, 2007.09.12.

嵌入式μC/OS 篇10

家居智能化控制系统就是指利用先进的计算机技术、网络通信技术、综合布线技术,将与家居生活相关的各种子系统有机结合,从而进行统筹管理,使家居生活更加舒适、安全、有效。

近年来,嵌入式系统设备全面渗透到人们日常生活的各个领域,本文针对智能家居嵌入式系统的软硬件设计需求,以S3C44B0X为处理器进行智能家居系统的硬件设计,以实现μC/OS-Ⅱ在S3C44B0X上的移植。

1软硬件选择

目前主要的嵌入式处理器类型有386EX,SC-400,Power PC,MIPS,ARM/Strong,ARM系列等,其中ARM以其小体积、低功耗、低成本、高性能成为嵌入式处理器首选。S3C44B0X是Samsung公司推出的16/32位RISC处理器,基于ARM7TDMI内核,提供3级流水线结构。它一方面具有ARM处理器低功耗、高性能的特点,同时又具有非常丰富的片上资源。其特点如下:

(1) 内置锁相环(PLL),系统主频最高达66 MHz;

(2) 8路l0位ADC,I2C,I2S总线控制器,6个PWM定时器;

(3) 4种工作模式,正常、慢速、闲置和停止,可以根据需要切换系统工作方式,使系统功耗降低到最低限度;

(4) 内置彩色LCD控制器(最大支持256色的DSTN),71个通用可编程I/O口和实时时钟(RTC)。

由此可以看出,S3C44BOX具有高性能、低功耗、接口资源丰富的特点。这些特点可以较好地满足家居智能控制系统的设计需要。作为家居智能控制系统,除了具有局域网接口、PSTN接口、RS 485接口、蓝牙接口外,还应提供音频视频接口、HUB接口、报警传感器接口等。这些接口可以实现音频视频自动切换、多台PC同时上网、与各PC机结合完成家庭设备管理等功能。

μC/OS-Ⅱ是一种源码公开的实时嵌入式操作系统。它完全是占先式的实时内核,是基于优先级的,即总是让就绪态中优先级最高的任务先运行,因此实时性比非占先式的内核要好。它包含了实时内核、任务管理、时间管理、任务问通信同步(信号量、邮箱、消息队列)和内存管理等功能;它的绝大部分代码用C语言编写,可移植性强。目前,μC/OS-Ⅱ绝大多数可以在8位、l6位、32位以至64位微处理器、微控制器、数字信号处理器(DSP)上运行。

2智能家居硬件设计

在选定了处理器之后,外围电路就可按要求进行设计。其硬件框图如图1所示,主要包括:

2.1 存储器系统

其中静态存储器由FLASH组成,用于存储智能家居中的嵌入式操作系统、HTTP服务器、家庭网络服务器以及支持各种服务所需的文件系统。动态存储器采用SDRAM,以提高系统的允许速度和采用操作系统来保证系统的稳定性,整个智能家居系统软件平台存储在FLASH中,在系统启动时,将从FLASH中运行Bootloader,解压缩操作系统,并将其搬移到SDRAM中,完成搬移之后,所有程序从SDRAM中运行。其中,FLASH选用SST公司生产的SST39VF160芯片。39VF160采用CMOS工艺设计,支持1 M的地址空间,20条地址总线,16条数据总线。SDRAM选用Hynix公司生产的HY57V641620芯片。HY57V641620存储容量为4组×16 M(8 MB),由于采用行/列地址锁存机制,由行列地址共同构成20条地址线,完成1 M的寻址范围。

2.2 输入/输出系统

包含LCD液晶显示、键盘以及微型打印机等,可以基本满足测试数据等显示以及人机交互的需要。

2.3 外部通讯接口

包括RS 232串口、以太网接口。RS 232接口用于系统同PC机之间的通讯,可以把测试系统保存的数据导出来,本系统采用国际通用的RS 232C作为串行接口;以太网接口则可以把整个测试系统连接到互联网上,从而实现该测试系统的远程监控。

2.4 蓝牙通信模块

在家居控制器上使用蓝牙技术主要是为了给家居控制器的各个功能模块提供无线传输的方式。在家居中央控制器上可以采用蓝牙模块加开放蓝牙协议的方式开发蓝牙功能,综合考虑成本、结构等因素,信息家电可以采用蓝牙模块加单片机的方式实现蓝牙功能。将整个蓝牙核心协议栈移植到单片机中显然不合实际,可以采用这样的开发方案:在蓝牙HCI层的基础上,根据信息家电信息传输的实际需求,建立相关协议,利用单片机直接和蓝牙硬件模块交换HCI指令,实现信息交互。单片机采集信息家电的相关信息通过蓝牙模块发送出去,蓝牙模块也可以将接收到的命令用HCI指令传递给单片机执行。

2.5 温度、湿度检测和实时时钟实现模块

主要实现对室内环境的监控,便于控制系统采取适当的方式控制室内环境。其中温度采用温度传感器实现,实时时钟采用S3C440BX自带的RTC模块实现。

3 μC/OS-Ⅱ在S3C44B0X上的移植

μC/OS-Ⅱ在S3C44B0X上的移植,需要修改3个与ARM体系相关的文件:OS_CPU.H,OS_CPU_C.C,OS_CPU.ASM 。在μC/OS-Ⅱ的移植过程中,采用ADS作为编译器,ADS由一套完备的应用程序构成,可用来编写和调试ARM系列的RISC处理器的应用程序,并可通过主机和实时分析工具让使用者对应用程序进行完整的分析,加速实时嵌入式系统的开发和测试。

3.1 设置OS_CPU.H中与处理器和编译器相关的代码

这部分代码的定义主要包括数据类型的定义、开关中断代码的宏定义、任务切换时执行代码的定义和堆栈增长方向的定义。在S3C44B0X中,所有的任务堆栈都是用OS_TSK声明数据类型,用OS_ENTER_CRITICAL( )和OS_EXIT_CRITICAL( )实现开关中断,用结构常量OS_STK_GROWTH来指定堆栈的生长方式。

3.2 编写与操作系统相关的函数OS_CPU_C.C

μC/OS-Ⅱ定义了6个函数在该文件中,其中OSTaskStklnit( )是任务堆栈初始化函数,其他5个函数都是Hook函数,即OSTaskCreateHook( ),OSTaskDelHook( ),OSTaskSwHook( ),OSTaskStatHook( ),0sTimeTickHook( )等接口函数,是系统预留给用户添加功能的,只要声明,可以不包含代码,当用户需要额外扩展功能时,在这5个函数中选择加入就可。实际上需要修改的只有OSTaskStklnit( )函数,该函数用来初始化任务堆栈,使得任务堆栈建立时与发生1次中断后的堆栈结构相同。S3C44B0X的堆栈结构如图2所示。在修改OSTaskStklnit( )函数时应依照该结构进行。

3.3 编写与处理器相关的函数OS_CPU.ASM

这部分代码是对处理器的寄存器进行操作,必须用汇编语言来编写,包括以下4个子函数:

3.3.1 OSStanHighRdy( )

运行优先级最高的就绪任务,此函数是在OS-Start( )多任务启动后,负责从最高优先级任务的TCB控制块中获得该任务的堆栈指针SP,通过SP依次将CPU现场恢复,这时,系统就将控制权交给用户创建的该任务进程,直到该任务堵塞或者被其他更高优先级的任务抢占CPU。该函数仅在多任务启动时被执行一次,之后多任务的调度和切换由以下函数实现。

3.3.2 OSCtxsw( )

可实现任务级的上下切换,任务级切换是通过SWI或者TRAP人为制造的中断来实现。ISR的向量地址必须指向OSCtxSw( ),这一中断完成的功能为:保存任务的环境变量(主要是寄存器的值,通过入栈来实现),将当前SP存入任务控制块中,载入就绪最高优先级任务的SP,恢复就绪态最高优先级任务的环境变量,中断返回,以完成任务级的切换。

3.3.3 OSIntCtxSw( )

中断级的任务切换,在时钟中断ISR中(中断服务例程)如果发现有高优先级等待的时钟信号到来,则在中断中退出后并不返回被中断任务,而是直接调度高优先级的任务执行,从而能够尽快地让高优先级任务得到响应,保证系统的实时性能。其原理基本上与任务级的切换相同,但是由于进人中断时已经保存了被中断任务的CPU现场,因此不再进行类似的操作,只需对堆栈指针做相应调整。

3.3.4 OSTicklSR( )

OSTickISR( )是一个周期性函数,为内核提供时钟节拍中断。频率越高、系统负荷越大、其周期的大小决定了内核所能给应用系统提供的最小时间间隔。一般只限于毫秒级(跟处理器有关),对于要求更加苛刻的任务,需要用户自己建立中断来解决。该函数具体内容:保存寄存器,调用OSIntEnter( ),调用OSTimeTick( ),调用OSIntExit( ),恢复寄存器,中断返回。但注意不要在OSStaut( )之前调用OSTickISR( )。

完成以上3个程序的改写,μC/OS-Ⅱ就可以在S3C44BOX上正确运行。

4结语

家居智能控制系统是家庭内外信息交换和家电控制的平台。本文采用SAMSUNG公司的S3C44BOX芯片设计硬件和软件,克服8位单片机处理速度慢、接口资源和存储资源不足的限制。在实验调试过程中,该系统运行状况良好、工作稳定。证明其设计是实用、有效的。但智能家居嵌入式系统是一个比较大的系统,目前只是涉及到其中核心部分,其他部分还需继续探讨。

摘要:为了提高家居的智能化水平,给出一种基于S3C44B0X芯片和蓝牙通信技术的智能家居控制器的硬件设计和软件设计。该系统主要由存储器系统、以太网接口、蓝牙通信模块、温度检测和实时时钟等组成。介绍源码开放的实时多任务的μC/OS-Ⅱ操作系统在ARM微处理器S3C44BOX上的移植方法,并简要说明移植的主要步骤。

关键词:μC/OS-Ⅱ,S3C44B0X,智能家居,嵌入式系统

参考文献

[1]戚继忠,王自强.基于ARM7TDMI实现CF卡存储的文件系统设计[J].微处理机,2007,28(1):114 115,118.

[2]王田苗.嵌入式系统设计与实例开发———基于ARM处理器与μC/OSⅡ实时操作系统[M].北京:清华大学出版社,2003.

[3]李兰英,杨晨.基于S3C44BOX的智能家居终端控制系统的设计与实现[J].哈尔滨理工大学学报,2007,12(3):8789,93.

[4]宋寅卯,张青波.μC/OSⅡ在S3C44B0X上的移植[J].微计算机信息,2005(4):131 132.

[5]蒋小平,施卫东,郎涛,等.基于ARM的水泵性能测试系统开发[J].中国农村水利水电,2007(10):102 104.

[6]Jean J.Labrose.嵌入式实时操作系统基于μC/OSⅡ[M].2版.邵贝贝,译.北京:北京航空航天大学出版社,2003.

[7]俞露.基于ARM的嵌入式系统硬件设计[D].杭州:浙江大学,2003.

[8]杨连沁.基于嵌入式S3G44BOX的家居智能控制系统设计[J].仪器仪表标准化与计量,2007(3):5 6.

[9]刘卉,刘建辉,李新.嵌入式技术推动家居智能化发展[J].中国科技信息,2007(5):144 145.

[10]张明健,赵乃卓.无线蓝牙技术在智能家居中的应用[J].辽宁师范大学学报:自然科学版,2007(4):18 21.

上一篇:上网现状下一篇:狮子滩水库论文