vxWorks应用程序加载的另一种办法

简介: <p>现在我们的工作中,应用程序一般都是和BSP联编,然后将vxworks_rom.bin烧到班子里。在BSP启动后,调用应用程序的函数的。</p><p> </p><p>但是这样有个问题,就是应用程序和BSP结合的太紧密了。BSP开发者得将BSP代码给应用程序开发者,或者应用程序开发者得将应用程序编译后的.a文件给BSP开发者,才能完成程序的升级!</p><p> </p><p>那么下面

现在我们的工作中,应用程序一般都是和BSP联编,然后将vxworks_rom.bin烧到班子里。在BSP启动后,调用应用程序的函数的。

 

但是这样有个问题,就是应用程序和BSP结合的太紧密了。BSP开发者得将BSP代码给应用程序开发者,或者应用程序开发者得将应用程序编译后的.a文件给BSP开发者,才能完成程序的升级!

 

那么下面的方法是我这两天弄出来的,可以将应用程序和BSP开发分离的一个办法。只要开始将接口约定好就可以了!还不是很成熟,我也还没有正式在项目中使用,但是我相信这是一个不错的选择!

 

首先,要建立一个文件系统,TFFS的文件系统就可以。磁盘大小只要可以放的下应用程序编译后的文件就好了。这步就不赘述了。

 

然后,在BSP工程的usrApp中添加下载应用程序模块和启动接口程序的代码。下面主要说明这步,代码如下:

 

  1. #include "loadLib.h"   
  2. #include "stdio.h"   
  3. #include "taskLib.h"   
  4. #include "ioLib.h"   
  5.    
  6. extern SYMTAB_ID sysSymTbl;  
  7. void usrAppInit (void)  
  8.     {  
  9. #ifdef USER_APPL_INIT   
  10.  USER_APPL_INIT;  /* for backwards compatibility */  
  11. #endif   
  12.  FUNCPTR taskEntry=NULL;  
  13.  SYM_TYPE *pType;  
  14.  intfd=open("/tffs0/appProj.out",O_RDONLY,0);  
  15.  if(fd==NULL)  
  16.  {  
  17.  printf("/nopen project fail../n");  
  18.  return;  
  19.  }  
  20.  if(loadModule(fd,LOAD_ALL_SYMBOLS)==ERROR)  
  21.  {  
  22.  printf("/nload module fail.../n");  
  23.  return;  
  24.  }  
  25.  if(symFindByName(sysSymTbl,"appEntry",(char* *)&taskEntry,pType)==ERROR)  
  26.  {  
  27.  printf("/nfind symbol fail.../n");  
  28.  return;  
  29.  }  
  30.       taskSpawn("entry",100,0,1024,taskEntry,0,0,0,0,0,0,0,0,0,0);  
  31.    
  32.    /* add application specific code here */  
  33.  }  
  34.    
#include "loadLib.h"
#include "stdio.h"
#include "taskLib.h"
#include "ioLib.h"
 
extern SYMTAB_ID sysSymTbl;
void usrAppInit (void)
    {
#ifdef USER_APPL_INIT
 USER_APPL_INIT;  /* for backwards compatibility */
#endif
 FUNCPTR taskEntry=NULL;
 SYM_TYPE *pType;
 intfd=open("/tffs0/appProj.out",O_RDONLY,0);
 if(fd==NULL)
 {
 printf("/nopen project fail../n");
 return;
 }
 if(loadModule(fd,LOAD_ALL_SYMBOLS)==ERROR)
 {
 printf("/nload module fail.../n");
 return;
 }
 if(symFindByName(sysSymTbl,"appEntry",(char* *)&taskEntry,pType)==ERROR)
 {
 printf("/nfind symbol fail.../n");
 return;
 }
      taskSpawn("entry",100,0,1024,taskEntry,0,0,0,0,0,0,0,0,0,0);
 
   /* add application specific code here */
 }
 


 

 

主要代码。只要应用程序将升级后的工程编译成.out文件,上传到磁盘/tffs0中,就可以了!当然,应用程序的入口函数appEntry不能变。

 

最后,这段代码如果之间运行,可能会遇到一些问题:

 

 1.loadMoudle失败,报错Relocation value doesnot fit in 24 bits。这是因为函数在内存中的位置超出了跳转的最大距离(一般跳转指令是24bit,32M).为了解决这个问题,按如下步骤:

 

    在应用程序的工程中选择"Builds"->"default"->"c/c++complier",在后边加入-mlongcall(GUN)或者-Xcode-absolute-far(diab),点击OK.

 

把这个编译出来的.out文件上传到文件系统。

 

2.symFindByName失败。这个原因可能是因为应用程序的工程是cpp文件,也就是c++文件。c++编译出来的文件,符号表的入口和C不同,所以找不到。如,同样的entry(void,int)函数,C编译出来就是entry,而C++可能是entry_Fvi,这个由于不同的编译器而不同。解决这个问题,有两个办法:

 

  (1).入口函数所在的文件,不要用cpp文件,全部改用c文件。

 

  (2).cpp文件中的入口函数包含在external "C" {}中。

相关文章
|
7月前
|
Linux 数据安全/隐私保护 开发者
Red Hat下载ISO镜像的方法
简介:本文介绍如何注册或登录Red Hat账号,选择并下载Red Hat Enterprise Linux (RHEL)的免费版本,以及激活订阅的步骤。首先访问Red Hat官网注册或登录账号,然后在开发者页面选择免费下载RHEL,最后通过终端命令激活订阅,确保状态已订阅。订阅为期一年,到期后需重新注册以继续享受支持和权益。
2489 17
Red Hat下载ISO镜像的方法
Qt下载(使用国内镜像)
Qt下载(使用国内镜像)
6498 2
|
11月前
|
Linux KVM 虚拟化
windwos上通过qemu直接开启img、qcow2等格式磁盘镜像(无需转vmdk)
QEMU 是一款开源虚拟化软件,支持多种硬件平台和虚拟化技术,如 KVM 加速。它可以在 Windows、Linux 和 macOS 上运行。本文介绍了 QEMU 的下载、安装、配置虚拟网卡、启动虚拟机、网络通信及快照管理等步骤。通过 QEMU,用户可以轻松创建和管理虚拟机,实现高效的开发和测试环境。
4436 0
windwos上通过qemu直接开启img、qcow2等格式磁盘镜像(无需转vmdk)
|
存储 Linux 程序员
【Linux-14】进程地址空间&虚拟空间&页表——原理&知识点详解
【Linux-14】进程地址空间&虚拟空间&页表——原理&知识点详解
|
传感器
【经典案例】STM32F407使用HAL库配置I2C详解
STM32F407是一个强大的微控制器,广泛应用于嵌入式系统中。在许多应用中,我们需要使用I2C总线来与传感器、EEPROM、显示屏等外设进行通信。本文将详细介绍如何使用STM32 HAL库来配置和使用I2C接口。
1908 2
|
存储 运维 KVM
QEMU的QCOW2磁盘镜像文件查看
QEMU的QCOW2磁盘镜像文件查看
1443 0
|
缓存 网络协议 网络安全
主机虚拟机互Ping问题详解以及原理、解决互ping不通方案
主机虚拟机互Ping问题详解以及原理、解决互ping不通方案
9003 0
主机虚拟机互Ping问题详解以及原理、解决互ping不通方案
|
存储 Linux API
ZYNQ裸板:串口篇
使用 PS 的时候,通常会添加 UART 控制器,用于打印信息和调试代码。除此之外, PS 在和外部设备通信时,也会经常使用串口进行通信。先从UART控制器开始讲起吧,从简单的测试再到工程实例。
1266 0
ZYNQ裸板:串口篇
|
Windows
vxworks环境下反汇编工具使用技巧
vxworks环境下反汇编工具使用技巧
457 0
vxworks环境下反汇编工具使用技巧