Bootrom功能改进经验谈
为了保证自动启动总是从固定路径下载应用程序,而不受启动参数的影响,需要修改文件bootConfig.c中的自动启动函数autoboot()。例如,自动启动总是从CF卡读取应用程序。
if(bytesRead ==0){ /*倒计时期间没有输入*/
LoadApplicationImage();/*复制应用程序映象到起始地址为Entry的内存中*/
go((FUNCPTR)ENTRY;/*从Entry地址开始运行*/
}
else{
……
}
Entry是应用程序的入口地址,VxWorks系统中该值是RAM_LOW_ADRS。LoadApplicationImage()函数将应用程序映旬从CF卡复制到起始地址为Entry的内存中,然后将PC指针指向该地址,启动系统。如果在倒计时期间有字符输入,则进入Bootrom的命令界面,用户可以修改启动参数,然后按“@”从启动参数指定的路径下载程序,而不影响调试,但是更改后的参数不会影响下次自动启动的下载路径。
4 多种应用软件的选择
在通信领域,许多产品的硬件平台其实相同,区别在于应用软件。不同的软件塑造出了一个个特色鲜明的产品。如果能够将不同的软件集成到一个硬件平台上,由用户在启动时选择,那么这个产品就拥有一机多能的特性,大大增强了产品的市场竞争力。
退而言之,即使硬件平台只适合于一种应用软件,将故障检测程序作为另一种应用软件,会带给产品测试和现场维修人员诸多的方便。
参考以上三点经验,在Bootrom中增加这项功能并非难事。以两个应用软件为例,在函数bootCmdLoop()中增加新命令“o”(other的编写),如下所示。
switch(*(pLine++)){
……
case 'o': /*启动另一应用软件*/
LoadAnoterApplicationImage();/*复制另一应用程序映象到起始地址为Entry的内存中*/
AutoSystemVersionSet();/*询问用户是否将另一应用软件设置为默认启动*/
go((FUNCPTR)Entry);/*从Entry地址开始运行*/
break;
……
}
图3
在Bootrom代码中定义一个变量defaultVersion,用于记录谁是默认的启动软件,该变量保存在Flash等非易失媒质中。上电后,如果在倒计暑期间没有任何输入,系统自动启动defaultVersion指定的应用软件;否则,用户进入命令界面。如果键入“o”命令,Bootrom调用函数LoadAnotherApplicationImage()将另一应用程序映象复制到起始地址为Entry的内存区域,然后询问用户是否希望将另一应用程序设置为默认启动;如果用户回答“是”,更改defaultVersion值;否则,defaultVersion值不变。最后运行当前选定的应用软件。
上述的几点经验大部分是修改文件bootConfig.c的代码。因为bootConfig.c是一个公用文件,为了不影响其它底层软件的开发,建议将它复制到当前Bootrom开发目录下,并且在Makefile文件中增加定义:BOOTCONFIG=bootConfig.c。
嵌入式系统开发需要经常开辟新的思路,一些微小的简单改动通常能够带给产品新的功能和特征。启动代码是嵌入式系统的重要组成部分。笔者的以上四点经验在PowerPC处理器(MPC8260)平台和MIPS处理器(RM7000A)平台上得到了验证,希望对其它系统的启动代码的开发有所借鉴和启迪。