现在,我们不只具有放在桌上处理文档、进行作业办理的通用计算机,并且也或许具有从大到小的各种运用嵌入式技能的电子产品。跟着电子产品的智能化,智能手机、物联网、智能家居的呈现,运用在通用计算机中操作体系经过变身渐渐呈现在嵌入式产品中。操作体系与硬件严密相关,怎么将操作体系简洁的移植到林林总总的嵌入式产品中是产品厂家急需解决的问题。了解操作体系的基本概念、基本原理,把握操作体系的首要使命及功用的规划思路是规划人员需求具有的常识。想要移植操作体系到电子产品中,需了解实时操作体系的概念、内核结构,怎么裁剪操作体系代码。本文经过对嵌入式操作体系μC/OS-Ⅱ源代码的分析及移植,把握多使命实时体系的基本概念、竞赛与调度算法、使命间同步与通讯、存储与守时的办理。
1 嵌入式操作体系分类
运转在嵌入式硬件平台上,对整个体系及其所操作的部件、设备等资源进行一致和谐、指挥和操控的体系软件叫作嵌入式操作体系。其有如下特色:微型化、可裁剪性、实时性、高牢靠性和易移植性。按嵌入式操作体系运用规模分类可分为:
(1) 通用型嵌入式操作体系,Windows CE,Vx-Works,μCLinux和μC/OS;
(2)专用型嵌入式操作体系,如移动电话的Symbian,PDA的Palm OS。
嵌入式操作体系还可分为商用型和免费型:
(1)商用型的实时操作体系功用安稳、牢靠,有完善的技能支撑和售后服务,但往往价格昂贵,如Vx-works,QNX,WinCE,Palm OS等;
(2)免费型的实时操作体系在价格方面具有优势,现在首要有Linux和μC/OS-Ⅱ,安稳性与服务性存在应战。按嵌入式操作体系运用范畴分类可分为:有线电视机顶盒范畴,PowerTV;移动通讯范畴,EPOC;掌上计算机范畴,Palm OS;数字影像范畴,Digita。
2 μC/OS-Ⅱ代码分析
微操控器操作体系(Micro Controller OS,μC/OS)是美国人Jean J.Labrosse 1992年完结的,运用面覆盖了许多范畴,如照相机、医疗器械、音响设备、发动机操控、高速公路电话体系、主动提款机等。μC/OS-Ⅱ用C言语和汇编言语编写的。其源代码能够从网站www.micrium.com中免费下载。
μC/OS-Ⅱ操作体系内核的首要作业是对使命进程办理和调度。典型的使命一个无限循环,如图1所示。
图1 使命的组成
下面临创立使命的函数OSTaskCreate()的源代码做简略的介绍。
μC/OS-II支撑64个使命,每个使命一个特定的优先级。优先级越高,数字越小。当立异一个新使命时,创立使命函数OSTaskCreate()需先取得一个未被运用的在有效值规模内使命优先级,初始化使命仓库函数OSTaskStkInit()取得该使命的初始数据(指向使命的指针、程序状况字等),初始化使命操控块函数OSTCBInit()获取从务操控块链表中一个使命操控块并用使命的特点对其进行赋值后将其链入到使命操控块链表的头部,OSSched()函数进行使命调度。多使命操作体系的中心作业便是使命调度。所谓调度便是经过一个算法在多个使命中确认哪个使命来运转。 μC/OS-Ⅱ是占先式实时多使命内核,优先级最高的使命一旦准备安排妥当,则具有CPU的所有权开端投入运转。μC/OS-Ⅱ进行使命调度的思维是每时每刻总是让优先级最高的安排妥当使命处于运转状况。μC/OS-Ⅱ进行使命调度的依据便是使命安排妥当表。使命安排妥当表记载安排妥当的使命优先级,依据使命安排妥当表能够判别出哪个使命的优先级最高,进行调度。
3 μC/OS-Ⅱ移植
所谓操作体系的移植,是指派一个实时操作体系能够在某个微处理器平台上运转。μC/OS-Ⅱ的首要代码都是由规范的C言语写成的,移植便利。移植的首要作业是修正部分与处理器硬件相关的代码。尽管μC/OS-Ⅱ在规划之初现已充分考虑了可移植性,可是μC/OS-Ⅱ在读/写处理器寄存器时,只能经过汇编言语来完成,因而仍需求用C言语和汇编言语编写一些与处理器硬件相关的代码。μC/OS-Ⅱ的体系结构如图2所示,在该图中能够很简单看出哪些代码文件与处理器相关需求移植时修正。图中中心有3大块代码文件显现区域,左上区域为与处理器无关的代码,右上区域为与运用有关的代码,下面区域是与处理器相关的代码。下面区域包含C言语OS_CPU.H和OS_CPU_C.C和汇编言语OS_CPU_A.ASM代码文件,在移植时要点去修正这几个文件。
3.1 修正OS_CPU.H
OS_CPU.H中的与处理器和编译器相关的代码包含了用#define句子界说的、与处理器相关的常数、宏以及类型、与ARM 处理器相关宏敞开/封闭中止的代码。绝大多数的微处理器和微操控器的仓库是从上往下长的。可是某些处理器是用别的一种方法作业的。μC/OS-Ⅱ被规划成两种状况都能够处理,只要在结构常量OS_STK_GROWTH中指定仓库的成长方法即可。如设置OS_STK_GROWTH为0表明仓库从下往上增加;设置OS_STK_GROWTH为1表明仓库从上往下增加。
3.2 修正OS_CPU_C.C
OS_CPU_C.C中的与操作体系相关的函数 OSTaskStkInit(),OSInitHookBegin(),OSInitHookEnd(),OSTaskCreateHook(),OSTaskDelHood(),OSTaskSwHook(),OSTaskStatHook(),OSTCBInitHook(),OSTimeTickHook(),OSTaskIdleHook()。如体系启动使命时,CPU从仓库初始化OSTaskStkInit()中取得初始数据,如指向使命的指针、程序状况字。不同处理器内部的寄存器个数及每个位数不同需求依据实际状况修正。
图2 μC/OS-Ⅱ的体系结构
3.3 修正OS_CPU_A.ASM
OS_CPU_A.ASM 中的与处理器相关函数OSS-tartHighRdy(),OSCtxSw(),OSIntCtxSw(),OSTickISR()。下面以运转优先级最高的安排妥当使命函数OSS-tartHighRdy()为例别离移植到ARM和8086中代码改动状况。