加入收藏 | 设为首页 | 会员中心 | 我要投稿 | RSSRSS-巴斯仪表网
您当前的位置:首页 > 电子发烧 > 单片机学习

VxWorks文件压缩和解压缩技术

时间:2013-09-08  来源:123485.com  作者:9stone

     在嵌入式系统中,我们通常会要求vxworks这个文件尽量的小,比如通过串口、软盘或tffs加载vxworks的时候,如果文件太大,可能无法存储,或加载失败。下面介绍一种利用Tornado和vxworks自带的deflate和inflate,对vxworks文件进行压缩和解压缩的技术。希望对大家有所帮助。

1   使用Tornado创建bootable的project,包括应用程序。对vxworks进行适当的裁减和配置。

2   如果准备将vxworks存储于硬盘,软盘或tffs上,应该在usrAppInit中使用usrNetEndDevStart和usrNetIfConfig启动网络接口。如果存储于tffs上,还要修改usrNetBoot.c中:
     if ( (strncmp (sysBootParams.bootDev, "scsi", 4) == 0)
|| (strncmp (sysBootParams.bootDev, "ide", 3) == 0)
|| (strncmp (sysBootParams.bootDev, "ata", 3) == 0)
|| (strncmp (sysBootParams.bootDev, "fd", 2) == 0))
   为:
     if ( (strncmp (sysBootParams.bootDev, "scsi", 4) == 0)
|| (strncmp (sysBootParams.bootDev, "ide", 3) == 0)
|| (strncmp (sysBootParams.bootDev, "ata", 3) == 0)
|| (strncmp (sysBootParams.bootDev, "tffs", 4) == 0)
|| (strncmp (sysBootParams.bootDev, "fd", 2) == 0))

3   在dos下运行 tornado/host/x86-win32/bin/torvars。

4   进入vxworks所在的目录,运行:
    deflate <vxWorks> vxWorks.z。这里我们默认.z文件是压缩文件。

5   如果准备将vxworks.z存储于硬盘,软盘或tffs上,需要首先创建相应的设备,并用dosFS初始化。如果是通过串口或网络加载vxworks.z,则需要初始化相应的接口。

6   修改bootConfig.c文件:
    a. 在LOCAL STATUS netLoad 函数的 tftpXfer和 ftpXfer这一部分代码结束的地方添加:
     if ( strstr(fileName,".z") || strstr(fileName,".Z") )
     {       
printf("/nfile %s is compressed, now begin uncompressing.../n",fileName);
if (bootLoadModuleInflate(fd, pEntry) != OK)
      goto readErr;
     }
     else if (bootLoadModule (fd, pEntry) != OK)
goto readErr;
    b. 在 LOCAL STATUS tffsLoad 函数的 usrTffsConfig和open这一部分代码结束的地方添加:
     if ( strstr(fileName,".z") || strstr(fileName,".Z") )
     {       
printf("/nfile %s is compressed, now begin uncompressing.../n",fileName);
if (bootLoadModuleInflate(fd, pEntry) != OK)
      goto readErr;
     }
     else if (bootLoadModule (fd, pEntry) != OK)
goto readErr;
    c. 在 LOCAL STATUS bootLoad 函数之前定义函数 bootLoadModuleInflate的原型:
#define DECOMP_BUF_SIZE   (RAM_HIGH_ADRS - RAM_LOW_ADRS)
#define COMP_BUF_SIZE   (DECOMP_BUF_SIZE / 3)
STATUS bootLoadModuleInflate(int zfd, FUNCPTR *pEntry)
{
      char *imageBuf = NULL;
      char *compBuf = NULL;
      int    fd = -1;
      int    rv = ERROR;
      int    compSize, r;
      extern STATUS inflate(char *src, char *dst, int src_size);
      if ((compBuf = malloc(COMP_BUF_SIZE)) == NULL)
      {
   printErr("No enough memory for image buffer/n");
   goto done;
      }
      compSize = 0;
      while ((r = read(zfd, compBuf + compSize, COMP_BUF_SIZE - compSize)) > 0)
   compSize += r;
      if (r < 0)
      {
   printErr("Read failed: errno = %d/n", errnoGet());
   goto done;
      }
      if (compSize == COMP_BUF_SIZE)
      {
   printErr("Compressed image too large/n");
   goto done;
      }
      printErr("Uncompressing %d bytes... ", compSize);
      if ((imageBuf = malloc(DECOMP_BUF_SIZE)) == NULL)
      {
   printErr("Not enough memory for decompression buffer/n");
   goto done;
      }
      if ((r = inflate(compBuf, imageBuf, compSize)) < 0)
      {
   printErr("/nUncompress failed/n");
   goto done;
      }
      printErr("/nLoading image... ");
      memDrv();
      memDevCreate("mem:", imageBuf, DECOMP_BUF_SIZE);
      if ((fd = open("mem:0", O_RDONLY, 0)) < 0)
      {
   printErr("/nCannot open memory device./n");
   goto done;
      }
      if (bootLoadModule(fd, pEntry) != OK)
      {
   printErr("/nError loading: errno = %d/n", errnoGet());
   goto done;
      }
      printErr("/n");
      rv = OK;
   done:
      if (fd >= 0)
   close(fd);
      if (imageBuf)
   free(imageBuf);
      if (compBuf)
   free(compBuf);
      return rv;
}
      d. 如果加载不成功,应读懂上一段代码,调整 RAM_HIGH_ADRS 和 RAM_LOW_ADRS的大小。

7   修改 config.h中的启动参数,比如启动设备为tffs=0,0(0,0),文件名为/tffs0/vxworks.z等等,重新制作bootrom,并写入flash。

8   启动时,修改启动参数,使系统仍然从网络加载vxworks,这个vxworks中应该实现了ftp或tftp功能。通过这些功能,把vxworks.z文件写入存储介质如tffs中。

9   重新启动从tffs或硬盘,软盘加载vxworks,即可成功。

10 可以首先通过网络启动,把启动文件名改为 vxworks.z来进行验证压缩和解压缩。

11 以上只是考虑了从网络和tffs来加载vxworks.z压缩文件,如果从fd, ata等加载,只需在相应地方添加和6.a中相同的代码即可。

12 本方法在ppc850上,利用tffs和网络加载进行了验证,完全适用。


分享到:
来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
栏目导航->单片机学习
  • 电子应用基础
  • 电源技术
  • 无线传输技术
  • 信号处理
  • PCB设计
  • EDA技术
  • 单片机学习
  • 电子工具设备
  • 技术文章
  • 精彩拆解欣赏
  • 推荐资讯
    使用普通运放的仪表放大器
    使用普通运放的仪表放
    3V与5V混合系统中逻辑器接口问题
    3V与5V混合系统中逻辑
    数字PID控制及其改进算法的应用
    数字PID控制及其改进
    恶劣环境下的高性价比AD信号处理数据采集系统
    恶劣环境下的高性价比
    栏目更新
    栏目热门