Chinaunix首页 | 论坛 | 博客
  • 博客访问: 588729
  • 博文数量: 169
  • 博客积分: 2656
  • 博客等级: 少校
  • 技术积分: 1685
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-30 13:03
文章分类

全部博文(169)

文章存档

2011年(1)

2010年(135)

2009年(33)

我的朋友

分类: 嵌入式

2009-08-08 14:00:24

整个过程为:

创建文件系统-->下载文件-->加载模块-->查找符号地址并执行

以下为演示该过程的一个简易实现文件,有使用或者引用的话,也打个招呼,或者给评论一下:

隐藏: 关闭:
==============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
#include
#include
#include
#include
#include
#include

#include "dosFsLib.h"
#include "ramDrv.h"
#include "usrLib.h"


typedef int STATUS;
#define ERROR -1
#define OK 0
#define DIAG_RAM_DISK_SIZE (0x100000*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
阅读(3255) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~