当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]基于VxWorks的bootrom代码改进

摘要:在Wind River公司开发的VxWorks嵌入式操作系统平台上,改进交换机产品bootrom软件的实现方式;给出实现方法和改进目的,为BSP开发人员提供一套全新的bootrom实现方案。

    关键词:VxWorks bootrom BSP makefile

1 问题的提出

VxWorks是Wind River公司开发的一种嵌入式操作系统,具有强大的功能和友好的用户界面。VxWorks软件应用非常广泛,不仅应用在网络设备、家用电器当中,而且还应用在航天、导弹等高端领域。在网络设备应用领域中,通常利用VxWorks来开发bootrom代码、BSP(Boadr Support Packet)代码以及上层的网络协议代码。

通常,Bootrom软件有以下功能:①通过串口下载操作系统映像;②通过串口升级自身映像;③通过串口下载系统配置文件、系统信息文件;④加载操作系统映像,使其正常启动;⑤其它的辅助功能,如地址内容查看功能、址内容修改功能和bootrom菜单显示信息控制的功能等。对于通常的bootrom代码编译,大多数用户选择使用GNU make的DOS命令来进行。因为如果bootrom不提供网口功能的话,单纯的CPU驱动部分代码量是不大的;但如果提供网口功能的话,代码量相对较大,文件之间的内在关系比较复杂,因此,系统使用GNU make的DOS命令来编译生成bootrom就显得有点麻烦。Makefile文件主要是由“目标”(target)、“依赖性”(dependencies)和“动作”组成的一系列规则,而VxWorks提供的GNU make工具就是根据Makefile指定的规则来编译和链接程序的。Makefile基本结构虽然简单,但正确、灵活地运用这些规则并不是那么轻松的事情。即使根据GNU Makefile规则书写出适当的Makefile文件,但随着代码的改变,Makefile还需要经常修改,这就增加了BSP开发人员的负担。而且,对于交换产品而言,其成本控制是非常严格的。对于存放bootrom软件的Flash来说,通常要求大小为512KB,这样就需要考虑到容量的限制。

因此,必须使用新的方法来简化bootrom代码编译,而且要在保证提供网口功能的情况下,系统提供的bootrom软件小于512KB。

2 实现方法

2.1 通过建立工程生成bootrom映像

采用建立工程的方式可以有效地解决这个问题。首先依据bootrom中的BSP代码来新建一个工程,然后将网中驱动代码加入到建好的工程中。这样就可以通过编译工程实现带有网口下载功能的bootrom软件。但对于VxWorks嵌入式系统而言,它有自己一套规范,求bootrom软件在加电后必须从romInit()函数开始运行,而建立工程所得的入口函数为sysInit()。因此需要增加一个系统壳代码,这个壳代码所要完成的任务就是加载bootrom工程的映像,并从romInit()开始执行bootrom代码。通过建立工程来调试bootrom代码有以下优点。

(1)责任分明

开发产品是一个复杂的工程,需要多人合作完成。对于CPU子系统和网口驱动系统这两块内容来说,更需要责任明确。通过建立工程来调试代码,可以准确地定位错误文件和函数的位置。是BSP代码出现问题,还是网口驱动代码出现问题,可以一目了然,做到责任明确。

(2)提高效率

通过建立工程可以节省书写Makefile文件时间,并可以让VxWorks软件的友好图形界面这优点得到更好的体现。另外,建立工程也可以减少文件编译排错的难度,方便工程文件的调试以及功能的验证,从而大大提高工作效率,加快工作进度。

2.2 编写壳代码并实现加载

建立工程生成映像文件的入口函数为sysInit(),而VxWorks规范中要求系统加电后要从romInit()函数开始运行。因此,需要设计一个方案来加载编译工程得到的映像,而且要具备初始化CPU和SDRAM存储空间的功能。

首先,系统从romInit()函数中开始运行,完成CPU和SDRAM初始化,跳转到函数romStart()运行。然后,加载第二份bootrom代码到系统的低地址处,运行壳代码中的sysInit()函数,并调用自己构造的解压函数usrInit(),将压缩后的工程映像文件解压缩到系统高地址处,之后系统继续运行解压后的bootrom代码。此时,系统开始运行sysInit()函数,调用VxWorks系统中的usrInit()函数,开始初始化系统硬件、内核以及其它外围设备。

壳函数usrInit()代码如下:

void usrInit(void){

volatile FUNCPTR absEntry;

if(inflate((UCHAR*)ROM_OFFSET(_binArrayStart),

(UCHAR *)(RAM_LOW_ADRS),&_binArrayEndbinArrayStart)!=OK)

return;

absEntry=(FUNCPTR)(RAM_LOW_ADRS);

(absEntry)();

}

其中RAM_LOW_ADRS为系统低地址,是操作系统运行的起始地址,但bootrom可以利用低地址来实现在系统高地址的运行。宏ROM_OFFSET用于准确定位函数地址,因为bootrom中运行的代码要求以相对地址方式来寻址,而不能以绝对地址方式寻址。_binArrayStart为压缩后二进制代码的开始符,_binArrayEnd为压缩后二进制代码的结束符。Inflate()是VxWorks软件的解压缩函数,用于解压缩由deflate()压缩函数压缩的二进制文件映像。同时,需要将下述代码添加到编译规则文件rules.vxWorks中的相应部分:

$(CC)-c $(CFLAGS)$(BSP_DIR)/unzip.c-o$(BSP_DIR)/unzip.o

$(LD)$(LDFLAGS)-e sysInit -Ttext $(RAM_LOW_ADRS)o

unzip_obj.o sysALib.o $(BSP_DIR)/unzip.o $(LIBS)flex.z.o

其中,unzip.c中包含构造的壳函数usrInit()。SysInit()为解压软件入口函数。上述语句的功能:第一行完成壳文件的编译,第二、三行完成壳目标代码与第二份bootrom代码的链接。这样,一个具有解压功能的壳函数就被链接到第二份bootrom映像中了。

    图1、图2是修改前的系统运行方式与修改后系统运行方式比较。

通过这两种方式的比较可以看出,修改前系统运行式与修改后的运行方式有下面两点差异;①第一份bootrom启动后,前者存在解压缩自射映像的操作,而后者没有;②对于第二份bootrom,前者没有壳代码,而后者有。

2.3 缩减文件长度

通常第一份bootrom代码只有两个文件,一个是包含CPU和SDRAM初始化文件romInit.s,另外就是包含romStart()函数的bootInit.c文件。另外,根据需要还可以添加提供串口轮询显示功能的文件。对于第一份bootrom代码,通常只有10KB左右(这是针对系统修改后的方式),而对于包含壳函数代码的,通过建立工程并编译而生成的第二份bootrom比较大,通常为570KB左右。(注意:这几个数值是通过特定的产品来得出的结论,并不应用于所有产品,但遇到类似的情况可以借鉴处理。)而其后面的一部分完全是0,可以考虑去掉这些0,但不能影响软件的功能。经过测试得出结论:去掉后面的0对系统功能和性能没有任何影响。

通过文件的操作来实现两份bootrom合并,合并后的大小要求小于或等于512KB。如果不采用任何措施,直接将两个文件合并起来要在580KB左右,大于512KB,这是很多系统不能满足的。第二份bootrom映像的后面部分的内容类似表1所列的信息。

表1 bootrom映像部分二进制内容

000 210h EB E2 BD 95 BD 15 87 AE 3C 74 FD 5C 5F 6A FD 8B
000 220h D6 BD 3A EB FF 6F CF 2A D2 69 95 E9 34 AE E7 EF
000 230h 86 94 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000 240h 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000 250h 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

从表1可以看出,在地址0x00078233处就是0值了。这样可以通过对文件内容的操作将0x00078240后面的内容全部剔除,从而可将合并后的bootrom代码控制在512KB以内。当然,我们通常会选择一个整数值进行操作,即将0x0007824后的所有值去掉即可。

这样处理,可以减少维护和开发的工作量。如果按照以往的做法,bootrom软件对外将有第一份和第二份的区别,无论是生产、上层软件调试还是开发,都需要分别对待,这样维护量和开发量将会加大。而经过修改后,可把区别只控制在开发阶段,在线升级时,可以按照一个软件来通过串口或网口来进行升级。通过对bootrom最后生成文件大小的控制,可以简化生产流程,加快生产进度。

3 小结

在嵌入式操作系统中进行程序开发,需要经常开辟新的思路,以一些简单的实现方式代替复杂易错的方式。在本次产品开发过程中,将bootrom映像生成方式由惯用的GNU make命令行实现,修改为按照新建工程的方式来实现,是一个相对好的方法,对整个产品的后续批量生产、用户维护和后续开发都奠定了一个良好的基础。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

阿联酋迪拜2025年8月26日 /美通社/ -- 纳斯达克上市公司Robo.ai Inc.今日正式宣布完成品牌焕新升级,并于8月26日正式启用全新纳斯达克股票代码"...

关键字: AI 人工智能 代码 智能科技

北京2025年8月13日 /美通社/ -- 近日,北京积算科技有限公司(以下简称"积算科技")推出一站式AlphaFold3在线算力服务,现已开放免费使用。其内置优化后的AlphaFold3模型,支持...

关键字: ALPHA 代码 图形化 蛋白质

北京2025年7月21日 /美通社/ -- 浪潮信息宣布元脑企智一体机已率先完成对Kimi K2 万亿参数大模型的适配支持,并实现单用户70 tokens/s的流畅输出速度,为企业客户高效部署应用大模型提供高处...

关键字: 模型 AGENT TOKEN 代码

7月18日,一则“微信安卓安装包出现5处fxxk”的话题,迅速登上微博热搜,吸引了众多网友的热议和关注。

关键字: 代码 程序员

共鉴AI未来,缅怀先辈贡献 深圳 2025年5月21日 /美通社/ -- 5月16日下午,深圳市金澄智创AI+传承迎来了乔迁之喜,一场意义非凡的活动在新址盛大举行。活动现场星光熠熠,庄世平前辈之子庄荣新先生、南方财经...

关键字: AI AI技术 BSP 代码

C语言代码优化与性能提升是软件开发中至关重要的一环。优化C语言代码不仅可以提高程序的执行效率,还可以减少资源消耗,提升用户体验。

关键字: C语言 代码

Qt 路线图致力于实现与各行业技术栈的无缝集成,助力企业与开发者使用自选工具,更高效地构建、扩展和维护软件解决方案。 芬兰埃斯波 2025年5月7日 /美通社/ -- 在今日举行的2025年Qt全球峰会上,Qt...

关键字: GROUP 生态系统 开发者 代码

——首批"专家级数字员工"部署上岗,构建组织传承与人才战略的AI导师矩阵 北京2025年4月25日 /美通社/ -- 在生成式AI技术加速重构组织能力与人才机制的当下,如何留住专家经验、培养管理人才...

关键字: AI 智能体 矩阵 代码

深圳2025年4月21日 /美通社/ -- 近日,国家发展改革委公布第 31 批国家企业技术中心认定名单,华测检测认证集团股份有限公司(股票代码:300012.SZ,简称 "CTI 华测检测")凭借在检验检测领域的全链条...

关键字: TI IC 代码 半导体

珠海2025年3月13日 /美通社/ -- 近期,AI工具DeepSeek引发广泛关注,大量非专业投资者试图借助其生成股票策略,却面临现实困境:平台输出的Python代码策略对零编程基础用户存在极高使用门槛。即...

关键字: EPS 代码 PSE AI
关闭