摘要:以VxWorks嵌入式实时操作系统为例,介绍了改进启动代码(Bootrom)功能的四点经验:(1)具备故障保护功能的Bootrom的自我在线更新;(2)增加重启功能;(3)自动运行应用软件;(4)多种应用软件的选择。
VxWorks是美国WindRiver System公司于1983年设计开发后个运行在目标机上的高性能、可裁减的嵌入式实时操作系统(RTOS)。它是一种功能强大而且比较复杂的操作系统,包括了进程管理、存储管理、设备管理、文件系统管理、网络协议及系统应用等几部分。VxWorks为程序员提供了高效的实时多任务调度、中断管理、实时的系统资源以及实时的任务间通信。其核心功能主要有微内核、任务间通信机制、网络支持、文件系统和I/O管理、POSIX标准实时扩展以及C++等其他标准支持。在各种CPU平台上提供了统一的编程接口和一致的运行特性,尽可能地屏蔽不同CPU之间的底层差异。应用程序员可以将尽可能多的精力放在应用程序本身,而不必关心系统资源的管理。VxWorks以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精类技术及实时要求极高的领域中,如卫星通信、弹道制导、飞机导航等。
设计师通常利用VxWorks开发Bootrom代码。Bootrom相当于PC机中的BIOS,它完成对加载过程中所需设备的初始化及驱动;然后,通过某种可选择的通信手段(如网口、串口),将VxWorks内核加载。VxWorks内核相关于PC机上的操作系统,如Linux、Windows。此外,Bootrom还提供了一些辅助功能,如地址内容查看、地址内容修改和Bootrom菜单显示信息控制等功能。但是,在实际应用中,这些功能不够丰富,便利性不足。本文介绍了几点笔者在工作中行之有效的改进Bootrom功能的经验。
1 具备故障保护功能的Bootrom的自我在线更新
Bootrom一般以二进制文件的方式保存在非易失怀存储介质,例如Flash、CF卡、EPROM中。通常需要仿无休止器、烧结器或JTAG工具等才能将代码烧入这类介质,在实际应用中非常不便。以Flash为例介绍如何在线更新Bootrom。
首先,为了做到故障保护,防止在更新过程中发生更新文件出错、断电等灾难性故障,Bootrom的数据必须在更新之前备份在Flash的另一区域。因此,Flash中必须存在两片物理区域,暂且命名为PA和PB,每片512KB(假设Bootrom文件小于512KB)。两片物理区域的起始地址可以互换,其中一片区域的起始地址必须为系统的上电启动地址,这个地址因处理器而异,例如,PowerPC体系结构的处理器的启动地址一般是0xfff00100,而MIPS体系结构的处理器的启动地址是0xbfc00000。在逻辑上,以启动地址开始的区域为主Boot区,另一片区域为备Boot区。
为了实现地址互联换,在CPU模块和Flash芯片之间,增加了一片CPLD(可编程逻辑器件)和一个跳线或拨号开关,开关信号JP输入到CPLD。CPU访问Flash的地址信号和片选信号经过CPLD进行地址互换,再到Flash芯片。如果不跳线(默认情况),JP信号为高,则PA的起始地址为启动地址,PA为主Boot区,PB为备Boot区;否则,JP信号为低,PB的起始地址为启动地址,PB为主Boot区,PA为备Boot区。默认情况下,PA为主Boot区。如图1。
如果系统中有两片Flash芯片,可以不用CPLD,选用另一种地址互换方式,如图2。两个二选一逻辑实现两片Flash片选信号(CS)的互换,从而实现了地址的互换。
地址互换机制屏蔽了PA和PB实际物理位置的差别,给底层软件提供了一个统一的接口,带来的好处不言而喻。Bootrom数据总线是从主Boot区备份到备Boot区,系统总是从主Boot区启动。
其次,编写Flash擦写驱动函数。Flash是一种读写非对称器件,读数据与普通器件一样,比较简单;而写必须根据芯片厂商提供的算法,先擦除欲写入数据的区域,以扇区(Sector)为单位,然后写入数据。函数flashUpdate(char *sourceAddr,char *destAddr,int Length)集成了擦除和写入两个步骤。
再次,在文件bootConfig.cr Bootrom操作接口函数bootCmdLoop()中增加新命令“u”(update的编写)。
switch(*(pLine++)){
……
case 'u'; /*更新Bootrom*/
…… /*下载更新代码并更新*/
break;
……
}
“u”命令的实现流程如图3。除了flashUpdate()之外,其它函数都由VxWorks本身提供。如果更新挫败,则改变JP设置,从备份Bootrom启动,再次更新Bootrom或运行应用软件。
2 增加重启功能
VxWorks的Bootrom用户命令缺少重启功能,给调试和实际应用带来诸多不便。与Bootrom在线更新方法相同,增加这项功能其实并不难,只要在函数bootCmdLoop()中增加新命令“r”(reset的缩写),在命令中调用系统重启函数sysReboot()即可。SysReboot()由设计师根据系统的不同自行编写。
Switch(*(pLine++)){
……
case 'r'; /*重启系统*/
sysReboot();
break;
……
}
举一反三,还可以根据需要在Bootrom中增加许多自己的命令。完成之后,不要忘了在Bootrom命令解释函数bootHelp()中添加新增命令的用途、用法等帮助信息。
3 自动运行应用软件
在实际应用中,一般将上层软件和VxWorks映象链接在一起,暂且称之为应用程序。默认情况下,当Bootrom运行后,它会倒计时7s,然后从启动参数(BOOT_LINE)指定的路径下载应用程序。但是,因为Bootrom提供了启动参数修改命令,启动参数可能由于某些原因发生更改。例如调试时需要从FTP服务器下载,或者疏忽好奇等,给下次应用带来不少麻烦,很可能出现应用程序下载挫败等故障。
为了保证自动启动总是从固定路径下载应用程序,而不受启动参数的影响,需要修改文件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)平台上得到了验证,希望对其它系统的启动代码的开发有所借鉴和启迪。
- Boot(37582)
- 进经验谈(6761)
protel的栅格经验谈
5384ARM嵌入式软件编程经验谈
FPGA 牛人经验谈
FPGA几个入门资料
FPGA牛人经验谈
PCB设计经验谈
Protel 99 PCB设计经验谈
TI电子书免费下载——《电源设计经验谈》
[下载]超强PCB布线设计经验谈附原理图(1-6章)
[下载]超强PCB布线设计经验谈附原理图(1-6章)
[资料分享]+Android软件安全审计及漏洞修复经验谈
fpga经验谈
fpga经验谈(西安大唐电信)
fpga经验谈分享
pcb设计经验谈
【下载】《电源设计经验谈》-----TI工程师
如何学好FPGA(大师经验谈)绝对经典!
工程师经验分享:PCB布线经验谈zz
服务器选型经验谈
维修经验谈,软驱故障巧解决
蓝牙模块:选择经验谈
请问可以改BOOTROM里的bootloader程序吗
超强PCB布线设计经验谈附原理图
超强PCB布线设计经验谈附原理图(3)
超强PCB布线设计经验谈附原理图(4)
超强PCB布线设计经验谈附原理图(5)
超强PCB布线设计经验谈附原理图(6)
Protel 99 PCB设计经验谈
0基于VxWorks的bootrom代码改进
25pcb布局经验谈
421PCB布线设计经验谈附原理图(第二章)
837
PCB布线设计经验谈附原理图(第三章)
2325
PCB布线设计经验谈附原理图(第五章)
2306
PCB布线设计经验谈附原理图(第六章)
1234
pcb layout设计经验谈
3688局域网测试及故障排除经验谈——传统而经典的技术
498这个冬天看电影吧!HTPC配置选择经验谈
1353充分利用 FTP分类账户设置经验谈
642去钻污生产经验
1367PLC使用经验谈
39FPGA设计经验谈
5fpga高手经验谈
16FPGA设计经验谈
8电源设计经验谈-合集
8fpga经验谈(华为)
0FIFO经验谈
27VxWorks的bootrom代码改进解析
3Wi-Fi产品射频电路调试经验谈
886
焊接工艺技巧与电烙铁使用经验谈,Welding skills
2073硬件设计经验谈
55950条电源设计的经验详细说明
13老工程师经验谈,高速运算放大器电路PCB布线资料下载
22超强PCB布局经验谈
625
电子发烧友App








评论