摘要:VxWorks嵌入式系统广泛应用于通信领域,程序倒换是软件设计中的重要内容。结合VxWorks的特点,本文提出了一种简单有效的解决程序倒换的方法,该方法在七号信令的单板程序中得到很好的应用。 0 引言 VxWorks是美国WindRiver公司的产品,它是一个运行在目标机上的高性能、可裁减的嵌入式实时操作系统,自上世纪八十年代初开始涉足商业化嵌入式实时操作系统市场以来,在该领域逐渐占据一席之地,Ciscosystems,HP,Qualcomm等著名公司都是它的商业用户。在VxWorks的开发中,常用宿主机与目标机的模式,目标机就是单板,开发的软件程序运行在这种单板上。在维护软件程序的过程中,常会根据客户的要求进行些改动或是软件的升级等,作为通信设备,一般要求在不断电不中断服务的前提下更新软件,这就要用到程序的倒换。 1 程序倒换的概念和原理 1.1 程序倒换的概念 程序倒换是在单板的VxWorks操作系统正常运行的情况下,对应用目标程序进行更新,由新的程序替代旧的程序运行。程序倒换一般有两种情况。一种是没有现场保留的,直接停止旧的任务,启动新的程序任务。这种倒换适合于简单而又对现场没有要求的系统中。另一种是要现场恢复的程序倒换,它不仅要倒换程序,而且要对现场的数据等信息进行保留,在新程序启动后直接使用,保证业务的畅通。大多数的通信软件的开发,都要求第二种程序倒换。在实际的开发过程中,根据不同的操作系统许多设备制造商采用了不同的机制,就VxWorks来讲,也有很多的解决方案。有的采用文件保存的方法,在程序倒换前后将现场数据以文件的形式放入FLASH或文件系统中,也有一些开发者使用共享内存的方法。作者在程序开发过程中,根据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示。 图1 程序倒换过程 2.2 程序倒换的关键技术 首先倒换程序的优先级要比应用程序的优先级高,另外申请内存时,用于存放Pdada段的内存空间也要在VxWorks的内核中申请,因为在VxWorks操作系统启动时申请的空间与应用程序无关,在卸载应用程序时申请的空间不会被释放。但是在加载应用程序时虽然指定了段地址,但是操作系统仍然会对它进行初始化,由于不便对操作系统进行太多的干预,但可以另外申请地址指针,用于临时保存这些值。假设用于指定Pdata段的地址指针为Para,另外申请的指针为Paratemp,二者的大小应一致,在停止当前的任务,卸载应用程序前用Paratemp指向的地址空间保存Para指向的值,在加载新的应用程序后启动新的任务之前,再把这些值倒回,这样就保留了现场的数据值。见图2。 图2 数据的倒换与倒回 在应用程序中要使用这两个指针变量用于传递给新的任务,而启动新的任务时taskSpawn()函数可以传递十个参数,所以这两个变量可以很方便地传递给新的程序。另外,在程序倒换中要注意操作系统资源的回收问题,目标应用程序使用的内存资源,打开的文件描述符,以及通过勾挂加入的处理函数等都要在适当的时刻予以回收和释放,还有的系统中实行1+1或N+1等多种形式的备份,在程序倒换时要注意现场业务的实时传递与更新。 2.3 程序倒换的应用实例 作者在实际开发七号信令系统的工作中对这一方法进行了研究与应用。基于CDMA2000的七号信令系统主要有MTP,SCCP和TCAP几个部分组成。系统要求七号信令系统提供稳定、可靠的信令支持,在程序倒换时要求恢复现场数据,而单板程序的数据并不复杂,主要有信令点的配置数据,信令链路的状态信息,以及SCCP部分GT表的翻译配置,TCAP的状态机信息等,这些数据在Pdata段符号表中规则而有序。而系统的硬件平台是Motorola公司的powerPC750,它有32M的内存,基本满足了系统需求。将程序倒换的方法应用于此系统中,在CDMA2000的试验网中进行检验,它不但可以进行正常的程序倒换,而且可以对现场的数据进行有效恢复,保证信令链路的畅通。表1是程序倒换过程源代码示例,它主要实现了启动新程序并保存和恢复被倒换程序的现场业务信息。 表1程序倒换过程源代码示例 3 小结 结合VxWorks的特点,本文提出了一种新型的程序倒换方法,该方法在CDMA2000七号信令系统的实现中得到很好的验证。对于数据段符号表改动较少且处理器内存适当盈余的系统,这种程序倒换方案既满足了程序倒换应用的基本需求,又易于工程实现。
|