侵权投诉
订阅
纠错
加入自媒体

嵌入式实时操作系统μC/OS-II在PC机上的移植

2013-12-04 11:15
蓝林笑生
关注

作者:李红卫

  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]  重定位表

1  2  下一页>  
声明: 本文由入驻维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

文章纠错
x
*文字标题:
*纠错内容:
联系邮箱:
*验 证 码:

粤公网安备 44030502002758号