01

[转] 实现动态加载VXWORKS .O/.OUT模块


转至:http://www.cnblogs.com/hpunix/articles/355758.html

整个过程为:
创建文件系统–》下载文件–》加载模块–》查找符号地址并执行

以下为演示该过程的一个简易实现文件,有使用或者引用的话,也
打个招呼,或者给评论一下:
==============START OF THE FILE=============
/*********************************************************
 * 版权所有 NP系统工作室。
 * 
 * 文件名称:    \FilseSystemCreate.c
 * 文件标识:    
 * 内容摘要:    创建文件系统,在系统启动之后保存文件
 * 其它说明: 
 * 当前版本:    S 1.0
 * 作    者:    william
 * 完成日期:    2005-10-12 17:04
 * 当前责任人-1:william
 *
 * 修改记录1:   
 *    修改日期:2006-3-21 12:00
 *    版 本 号:S 1.0
 *    修 改 人:william
 *    修改内容:创建 
 * 修改记录2:
 **********************************************************/

#include <taskLib.h>
#include <.h>
#include <stdio.h>
#include <string.h> 
#include <ioLib.h >
#include <symLib.h >
#include <loadlib.h >

#include “dosFsLib.h”
#include “ramDrv.h”
#include “usrLib.h”

typedef int                       STATUS;
#define ERROR                     -1
#define OK                        0
#define DIAG_RAM_DISK_SIZE        (0×100000*10)  /* 64M */
#define DIAG_RAM_DISK_NAME        “/selfdev/”

STATUS FileSystem_Init()
{
    BLK_DEV     *pBlkDev;
    char        *pFileSysRamDiskBase = NULL;
    
    ramDrv();
    pFileSysRamDiskBase = malloc(DIAG_RAM_DISK_SIZE);
    if(NULL == pFileSysRamDiskBase)
        return ERROR;
        
    bzero(pFileSysRamDiskBase,DIAG_RAM_DISK_SIZE);

    pBlkDev = ramDevCreate( pFileSysRamDiskBase,  
                            /* start address */                
                            512,        
                            /* sector size */                                                  
                            64,     
                            /* sectors per track */                                                      
                            (int)(DIAG_RAM_DISK_SIZE/512),    
                            /* total sectors 64 MBytes */
                            0);                               
                            /* offset */
    if(NULL == pBlkDev)
    {
        free(pFileSysRamDiskBase);
        return ERROR;
    }

    if(NULL == dosFsMkfs (DIAG_RAM_DISK_NAME, pBlkDev))
    {
        free(pFileSysRamDiskBase);
        return ERROR;

    }

    return OK;
}

extern SYMTAB_ID sysSymTbl ;
void runModule()
{
    STATUS status=ERROR;
    int fd;     
    MODULE_ID hModule ;
    FUNCPTR taskEntry = NULL ;
    SYM_TYPE * pType ;

    if ((fd = open(“/selfdev/youown.o”, O_RDONLY, 0)) < 0) 
    {
          printf(“\nCannot open memory device.\n”);
          goto done;
    }
     
    if ((hModule=loadModule(fd,LOAD_ALL_SYMBOLS))==NULL)
    {
        printf(“loadModule error = 0x%x.\n”,errno) ;
        goto done;
    }
   
    status = symFindByName(sysSymTbl,
                           “willian_test”,
                           (char **)&taskEntry,pType ) ;
    if (status==ERROR)
    {
          printf(“symFindByName error=%d\\n”, errno) ;
          goto done;
    }
    else
    {
        printf(“taskEntryr=0x%x, type=%d\n.”,
                    (int)taskEntry,(int)*pType);         
        status = taskSpawn(“test1″,
                           100,
                           0,
                           30000,
                           taskEntry,
                           0,0,0,0,0,0,0,0,0,0) ;
        if (status==ERROR)
        {
            printf(“taskSpawn error=%d\n”,errno) ;
            goto done;
        }
    }
    
done: 
     if (fd >= 0)
       close(fd);    
}

 

int downLoadModules(
    char *hostName,
    char *srcfileName,
    char *destfileName,
    char *usr,
    char *passwd)
{
    ………
    /*实现下载远端PC模块到本地机*/

    return (filesize);
}

STATUS test_dynamic_download()
{
    STATUE status = OK;
    int fileLenth = 0;
    
    status = FileSystem_Init();
    if(status == ERROR)
    {
        printf(“\nerror occured during init file system\n”);
        return ERROK;        
    }
    
    fileLenth = downLoadModules(“winner2″,
                                “youown.o”,
                                “/selfdev/youown.o”,
                                “target”,
                                “target”);
    if(ERROR == fileLenth)
    {
        printf(“\nSome error occured when download files\n”); 
        return ERROK;                 
    }                                
    else
    {
        if(0 == fileLenth)  
        {
            return OK;    
        }
    }
    
    runModule();
}
=============END OF THE FILE==========

几个需要注意的问题:
1:在文件系统初始化中使用的是MALLOC,该部分是使用的实际是
   BSP的空间在实际申请的过程中一定要根据自己可能拷贝的文
   件大小和实际的BSP的空间

2:在创建文件系统之后,可以查看该目录的文件列表,或者执行
   COPY,前提是必须在TORNADO中选择初始化文件系统组件;
   
3:在下载文件的过程中,有的BSP初始化已经可以直接通过COPY
   在远端FTP SERVER直接拷贝文件,比如:
         copy “youown.o”,”/selfdev/youown.o”
   这种情况没有必要再调用downLoadModules,至于如何使能,
   大家关注的话可以在后边对其专门论述。     

4:加载模块的过程可以调用如下代码:
        if ((hModule=loadModule(fd,LOAD_ALL_SYMBOLS))==NULL)
    同样也可以如下实现:
        ld(1,0,”/selfdev/youown.o”);
    至于各个参数什么意思,参考HELP就可以找到结论了!
    
    
5:在    status = symFindByName(sysSymTbl,
                           “willian_test”,
                           (char **)&taskEntry,pType ) ;
   中,有可能实际返回错误,但是通过lkup 是可以实际找到的,
   对于这个问题,我看网上答案比较少,原因是这样的:
   
   假如你在主机运行shell,默认的远端目标机是没有符号表
   (symbol table)的,只有在主机的shell上,你运行LKUP的
   时候,才能找到这个符号,不信你可以这样尝试一下,打开两
   个SHELL,一个通过串口,一个通过TORNADO的网口,你在其中
   一个中能够使用LKUP找到,而在另外一个则不能找到,是不是
   呀??   
       接下来继续解释,我们的symFindByName是在目标机器上
   执行的,所以自然的就返回错误了,也是没有找到了!
       解决方法是这样的:在目标机中包含符号表,同时将其和
   主机保持同步。
   Wind River told us to include all this defines in the 
        config files for the target:
        
       #define INCLUDE_SYM_TBL_SYNC
       #define INCLUDE_LOADER
       /* object module loading */
       #define INCLUDE_NET_SYM_TBL  
       /* load the symbol table by whatever means */
       #define INCLUDE_SHELL 
       /* target-based shell */
       #define INCLUDE_SHOW_ROUTINES 
       /* optional target-based system utilities */
       #define INCLUDE_STAT_SYM_TBL  
       /* optional target error status routines */
       #define INCLUDE_SYM_TBL         
       /* symbol table package */
       #define INCLUDE_UNLOADER        
       /* optional object module unloading */
       #define INCLUDE_WDB

Random Posts Recent Comments

  • 女友糖尿病害我蛀牙 Says:

    汗一个…...

  • Htj06 Says:

    zhenyouchuangyi...

  • 电商圈 Says:

    试图该怎么建立啊,,怎在程序中是吸纳...

  • edward Says:

    看得人心旷神怡,好文,情不自禁的顶一下...

  • Daniel Says:

    我也在处理这个问题,没有找到好的方法。我用了楼上兄弟的方法,还是可以的。不知道您找到好的方法了吗、我暂时楼上兄弟的方法。...

  • 卡,卡 Says:

    弱弱问一句:博主,你博客的模板这样设计pv高吗?...

  • 站长工具 Says:

    博主,兔年快乐!...

  • health Says:

    great post!!I hope I can read more in your website....

  • pdu Says:

    好博文,支持分享...

  • 站长工具 Says:

    博主的文章很不错,我是站长工具-站长精灵的作者,一款专业的SEO工具软件(可以帮您提高博客的流量),想跟您交换个链接,不知可否...

Tag Cloud

arm audio blog brew cache class debug flash google html j2me java javascript Joke linux lua mobile mtk php python ror ruby server shell stream unix web windows 优化 动态加载 女人 女生 平台 开发 手机 技术 流媒体 测试 漫画 生活 男人 男生 缓存 芯片