随着高位嵌入式处理器的日益普及,近年来嵌入式操作系统得到了迅猛的发展,并越来越多地应用于通信、国防、工业控制、医疗设备等方面。由于嵌入式系统直接面对硬件,一般的设计模式是将嵌入式操作系统以及用户程序制作成不需要任何操作人员干预的自启动(auto-boot)软件,对系统的控制采取PC或工作站通过网口下传命令的方式。VxWorks通常使用源文件*.c的静态链接方法来制作结合用户程序的自启动VxWorks,而本文将提出一种新的基于档案库(archives)的制作方法,具有文档管理方便、自动优化最终软件、非常易于移植等优点。 VxWorks VxWorks是由Wind River公司开发的一种强实时性嵌入操作系统,支持Mortorola公司和ARM公司等多种嵌入式CPU。Wind River同时提供集成开发环境Tornado。用户程序编制使用标准C,也可以选择 C++支持。非常适合于交互式开发。 通常所指的VxWorks操作系统对应软件包括三个部分:引导程序bootrom、主操作系统VxWorks、以及用户开发程序。为方便理解,表1中列出了VxWorks与 Windows的类比。 这里的自启动指不需要操作人员干预 ,程序在系统上电时自动执行。从表1可以看出,VxWorks操作系统在开发中三个部分被分开修改编译,只要 bootrom制作完毕 ,就可以在不改动硬件的条件下改变vxWorks操作系统和用户开发程序的下载途径,灵活方便,易于开发。而开发完毕后,所有的硬件都固化到单板硬件,不再需要任何干预,简单快捷。 BSP(板级支持包)安装完毕后就是Torando目录下 argetconfig的一个文件夹 ,例如ads860,就是一个支持 PowerPC860处理器的 BSP。这个目录中包括了编译bootrom和VxWorks需要的与CPU类型直接相关的程序,对单板上的其它硬件,通过用户添加文件提供驱动。对系统的裁剪可以通过修改源码和 Config.h中的宏定义#define INCLUDE_XXX直接进行,而对编译参数的设定则通过修改makefile进行。将目录 argetconfig目录下的all文件夹拷贝到BSP目录下,在makefile下添加 CONFIG_ALL=all,然后修改bootconfig.c中的autoboot()函数改变默认的启动方式:网络下载还是从 Flash直接启动。 操作系统软件制作如下: 软件制作方法 Tornado提供一个集成的编译 bootrom、VxWorks以及用户程序的工程环境,此外bootrom和VxWorks的编译还可以使用命令行的方式,也就是通过在DOS环境下(Win98下运行command,Win2000下运行cmd)直接输入命令的方式进行由于bootrom的工程环境下编译实际上就是采用了命令行方式 ,且使用命令行方式制作bootrom和VxWorks可以结合批处理的方法,更加方便快捷,因此本文中介绍的bootrom和VxWorks制作方法选用命令行方式。而用户程序的制作可以单独建立工程编译,但编译选项中必须选择和相应VxWorks的CPU类型。 基于静态链接的自启动VxWorks 用户程序在开发过程中使用单独的工程编译,编译结束后生成一批和.c文件同名的.o文件,这些文件通过target server动态下载,这样提供便捷的调试环境 ,但需要主机环境的支持。当开发结束后,需要给操作人员提供最方便的启动方式 ,因此必须将用户程序也编译链接到VxWorks.bin中,在VxWorks启动后就直接启动用户程序。链接方式包括静态链接和动态链接两种 。静态链接将提供的所有函数都链接到VxWorks中,而动态链接只链接被调用的函数。 静态链接有两种方式 :.c的链接和.o的链接。 .c的链接方式 :先在BSP目录下建立用户程序文件夹usrAPI,将所有用户源程序拷贝到此目录下,然后在usrconfig.c的usrroot()函数结尾处调用用户程序 ,需要在usrconfig.c程序开始添加申明:#include "usrAPI/用户程序名.c"。 .o的链接方式:同样建立目录 usrAPI,将在工程中编译生成的.o文件拷贝到 usrAPI,在makefile中添加LIB_EXTRA的定义,将.o包括到VxWorks中。或者直接制作一个 usrAPI.h,在这个文件中用上面的形式申明所有出现在这些.o中的函数,然后在需要使用到这些函数的文件头部都加上 #include "usrAPI/usrAPI.h"。这种方法更有利于程序的规划整齐,并且有助于日后察看函数的使用形式。 最后运行已经制作好的 makeall.bat,生成的VxWorks已经包含有自启动的用户程序了。 基于动态链接的自启动vxWorks 动态链接使用.a文件。同样制作usrAPI目录并拷贝.o文件,然后在此目录下建立批处理文件makea.bat。内容如下: 首先是设定环境变量: set WIND_HOST_TYPE=x86-win32 set WIND_BASE=C:Tornado set PATH=%WIND_BASE%host/% WIND_HOST_TYPE%in;%PATH% 然后使用ar工具将所有.o加入到一个档案库文件usrAPI.a中。使用arppc仍然是因为采用的BSP是基于PowerPC类型的,别的CPU类型也类似。 arppc-crusv usrAPI.a a.o b.o接下来类似于静态链接的.o方式,建立usrAPI.h并在需要的文件中引用。 最后在makefile中加入LIB_EXTRA=usrAPI/usrAPI.a,运行makeall.bat生成VxWorks。 不同链接方法的对比 基于.c的链接方法将所有用户编写的源程序保留在BSP文件夹中,移植时不利于程序的版权保密。而在不同BSP之间用户程序的移植更是不方便,虽然这种方法不需要对makefile进行任何改动,修改的只是.c文件,比较容易理解,但仍然不推荐使用。 基于.o的链接方法保留了全部的的测试函数接口,并且移植时提供编译过的.o 文件也比提供源代码.c文件利于保密。用户源程序和BSP源程序分开,文档结构整齐,特别是对用户源程序比较庞杂的时候,使用库文件.o或者.a更加有利于文件管理。 基于.a的链接方法只保留必要的函数接口,自动优化了VxWorks的文件大小,因此将对单板机的Flash大小要求降到最低。这种方法同时使用户程序在不同BSP间的移植变得非常简单。 唯一需要注意的是,如果在生成了bootrom和VxWorks之后,希望通过更新.o来更新VxWorks中包含的用户程序,不仅需要重新运行makea.bat和重新制作usrAPI.a,还需要在命令行下输入makeclean,将VxWorks和bsp目录下(不含子目录,因此用户程序生成的.o程序不受影响)所有的*.o、*.rpo、VxWorks*、bootrom*、stdt.c、symtbl.c和depead.(bspaame)删除,然后再运行makeall.bat。因为编译时会自动检查bootrom和VxWorks的存在以及原BSP目录下文件有没有改变,如果存在并没有改变,则认为没有重新编译的必要。这样运行makeA.bat不会更新bootrom和VxWorks,而使用makeclean之后,系统检测不到bootrom和VxWorks的存在,就会重新编译了。如果觉得在命令行下输入太麻烦,希望每次都强制更新,只需要在makeall.bat程序最开头加上一行makeclean就可以了。 结语 本文介绍了VxWorks操作系统的软件制作方法,分别提出了基于.c的静态链接、基于.o的静态链接和基于.a的动态链接编译方法,并比较了各自的优劣。着重推荐了基于档案库.a的动态链接编译方法,应用该方法使文档管理方便、最终软件被优化到最小、并且十分有利于用户程序在不同BSP间的移植,十分适用于制作结合用户程序的自启动VxWorks。
|