微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > μC/OS-II在PC机上移植的设计与实现

μC/OS-II在PC机上移植的设计与实现

时间:03-22 来源:互联网 点击:

1 引言

μC/OS-II是专门为嵌入式系统应用而设计的嵌入式实时操作系统,人们在学习μC/OS-II时,一开始往往在基于PC机的DOS或 Windows环境下进行分析与研究。在这种环境中,带有μC/OS-II内核的应用系统(简称μC/OS-II应用系统)的运行,让人觉得它好像是一个 DOS程序,人们无法真实地领略实时操作系统的面貌。实际上,在PC机的DOS或Windows环境中,μC/OS-II应用系统确实是一个DOS可执行程序,它的运行离不开DOS或Windows环境。为了让更多的人掌握和理解μC/OS-II实时操作系统,笔者对μC/OS-II进行移植,使其完全脱离DOS或Windows环境而运行。首先设计Bootloader引导程序,由它来装入μC/OS-II应用系统;其次修改BORLAND C++编译器中的EXE启动代码,剥去与DOS相关的代码;最后修改μC/OS-II内核代码中与硬件平台相关部分的代码,使其能正常运行和正常退出。

2 bootloader的设计

Bootloader引导程序的设计是嵌入式系统软件开发的一个重要环节,它把操作系统和硬件平台衔接在一起,通过初始化硬件设备、建立内存空间映射,为最终加载操作系统内核建立正确的环境。由于Bootloader的实现依赖于CPU的体系结构,因此大多数初始化引导程序分为两部分,第一部分主要包含依赖于CPU体系结构的硬件初始化代码,第二部分实现的功能比第一部分更多更复杂,它为内核程序准备运行的环境,将内核装入到指定位置,并转到内核处运行。本文设计的Bootloader也是由两部分构成,一部分称作BOOT的引导记录,另一部分是LOADER装入程序。BOOT的大小固定为512个字节,作为引导记录存放在软盘的0面0磁道1扇区,它所实现的功能是在软盘的目录区中寻找LOADER文件,并将LOADER装入到内存中,然后由 LOADER负责初始化工作环境并引导内核的运行。

软盘采用FAT文件系统,并对它进行格式化,使用工具将BOOT写到0面0磁道1扇区中,将LOADER和μC/OS-II应用系统程序复制到软盘中,然后用软盘启动系统,就能观察到μC/OS-II实时操作系统的运行情况,它完全脱离了DOS运行环境。同样,也可以通过Bochs、QEMU或 VMware等虚拟机做一个磁盘映像文件,用BOOT替换该映像文件的前512个字节,将LOADER和μC/OS-II应用系统复制到该映像文件中,然后就可以在虚拟机中完成系统的启动。这样,在每次修改程序后,不需要重新启动机器来验证系统的正确性,而只需要调整映像文件,在虚拟机中重启系统即可,使用虚拟机使内核的修改和调试变得十分容易。

2.1 BOOT的设计

当PC机加电后,首先进行自检,然后寻找启动盘,如果从软盘启动,计算机读取软盘的0面0磁道1扇区的内容,若该扇区最后两个字节是0x55、 0xaa,则其为引导扇区,计算机将其内容装入到内存地址0x7c00开始处,并转到该处运行。因BOOT只能占用一个扇区,其大小固定为512个字节,其实现的功能受到限制,所以BOOT的主要功能是在磁盘的目录区中寻找LOADER程序,并将其装入到内存中,最后将CPU的控制权交给LOADER,其后的任务就由LOADER完成。BOOT程序的算法描述如下:

(1) 在显示屏上显示“Booting...”提示信息,同时使软驱复位;

(2) 在磁盘的目录区中寻找LOADER文件;

(3) 若LOADER文件存在,则转(5);

(4) LOADER文件不存在,显示提示信息“Boot fail!”,关闭软驱马达,程序进入死循环;

(5) 将LOADER读到内存0x90000处;

(6) CPU转到0x90000处运行,即将CPU的控制权交给LOADER。

这段程序用汇编语言编写,它经过汇编连接后,使用工具软件,比如debug将其写到软盘的0面0道1扇区。

2.2 LOADER的设计

2.2.1 EXE文件格式

在DOS或Windows环境中,μC/OS-II使用BORLAND C++开发工具,因此,μC/OS-II应用系统的文件采用DOS的EXE格式,在装入μC/OS-II应用系统时,引导程序将按EXE文件格式的要求将内核加载到内存中。EXE文件由两部分组成:文件首部和程序主体。文件首部包含重定位信息和控制信息,它由编译器和连接程序自动生成;程序主体包含代码段、栈段、数据段等,它由EXE启动代码和程序员编的程序构成,它是程序实际运行部分。EXE文件首部内容如表1所示。

表1 EXE文件首部

偏 移

说 明

00-01

EXE型程序标志“MZ”

02-03

文件长度除以512的余数

04-05

文件长度除512的商

06-07

重定位项数

08-09

文件首部长度(单位为节,每16字节为一节)

0A-0B

程序装入后要求高地址内存的最小节数

0C-0D

程序装入后要求高地址内存的最大节数

0E-0F

堆栈段SS的值

10-11

SP的初值

12-13

文件校验和

14-15

IP的初值

16-17

代码段CS的值

18-19

第一个重定位项的位置

1A-1B

覆盖号

1C-

保留

[18-19]-

重定位表

2.2.2 LOADER程序的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top