0 引言
VxWorks是美国WindRiver公司的产品,它是一个运行在目标机上的高性能、可裁减的嵌入式实时操作系统,自上世纪八十年代初开始涉足商业化嵌入式实时操作系统市场以来,在该领域逐渐占据一席之地,Ciscosystems,HP,Qualcomm等著名公司都是它的商业用户。在VxWorks的开发中,常用宿主机与目标机的模式,目标机就是单板,开发的软件程序运行在这种单板上。在维护软件程序的过程中,常会根据客户的要求进行些改动或是软件的升级等,作为通信设备,一般要求在不断电不中断服务的前提下更新软件,这就要用到程序的倒换。
1.2 程序倒换原理
在目标机上的单板程序自启动过程中,VxWorks要引导应用程序的运行,把编译好的目标应用程序从 络或FLASH中加载到内存中,并执行入口函数运行程序,由于单板程序倒换时现场要保留的数据大都是以全局变量的形式存在,而且与之对应的符 表在内存中排列是有一定的顺序的,但是在卸载目标代码后,符 表同时也会被系统释放。在VxWorks中有一个Pdata段是用来保留一些规则的符 表的,有初值的全局变量都放在这个段中,而且在加载目标模块时这个段地址又可以指定,这样如果我们能够每次启动程序时指定相同的地址,这样就可以恢复现场。VxWorks提供其中一个目标程序的加载函数为:
MODULE-ID loadModuleAt(intfd,intflag,void **Ptext,void **Pdata,void **pBs)。
这个函数可以将目标模块的Ptext,Pdata和Pbs段中的任何一个安装在内存中的指定位置。根据程序倒换的要求,只要求保留相关的数据,所以只需要指定Pdata的地址,其它两个由VxWorks自己管理。
2 程序倒换的实现
2.1 程序倒换过程
在程序倒换时,要成功启用新程序,如果现有程序不卸载的话,有可能导致符 表的混乱,而新的程序也可能找不到程序的入口,这时需要第三方来进行相关的处理。一般的程序倒换是由OMC维护中心的命令引起,当单板程序收到程序倒换的命令后,启动一个新的任务第三方程序(倒换程序),第三方程序相关的代码放在VxWorks操作系统的内核中,因为程序倒换不会重新启动VxWorks操作系统,它只是更新目标程序,这样内核中的第三方程序可以随时由应用程序调用。第三方程序被执行后,首先把旧的任务杀掉,收集相关的现场数据,卸载掉旧的程序,然后加载要倒换的程序,把现场数据恢复到相应的Pdata段。根据VxWorks的任务调度原理,第三方程序应有更高的优先级。倒换的过程如下图1示。
2.2 程序倒换的关键技术
首先倒换程序的优先级要比应用程序的优先级高,另外申请内存时,用于存放Pdada段的内存空间也要在VxWorks的内核中申请,因为在VxWorks操作系统启动时申请的空间与应用程序无关,在卸载应用程序时申请的空间不会被释放。但是在加载应用程序时虽然指定了段地址,但是操作系统仍然会对它进行初始化,由于不便对操作系统进行太多的干预,但可以另外申请地址指针,用于临时保存这些值。假设用于指定Pdata段的地址指针为Para,另外申请的指针为Paratemp,二者的大小应一致,在停止当前的任务,卸载应用程序前用Paratemp指向的地址空间保存Para指向的值,在加载新的应用程序后启动新的任务之前,再把这些值倒回,这样就保留了现场的数据值。见图2。
在应用程序中要使用这两个指针变量用于传递给新的任务,而启动新的任务时taskSpawn()函数可以传递十个参数,所以这两个变量可以很方便地传递给新的程序。另外,在程序倒换中要注意操作系统资源的回收问题,目标应用程序使用的内存资源,打开的文件描述符,以及通过勾挂加入的处理函数等都要在适当的时刻予以回收和释放,还有的系统中实行1+1或N+1等多种形式的备份,在程序倒换时要注意现场业务的实时传递与更新。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!