vxWorks应用程序加载的另一种办法
现在我们的工作中,应用程序一般都是和BSP联编,然后将vxworks_rom.bin烧到班子里。在BSP启动后,调用应用程序的函数的。
但是这样有个问题,就是应用程序和BSP结合的太紧密了。BSP开发者得将BSP代码给应用程序开发者,或者应用程序开发者得将应用程序编译后的.a文件给BSP开发者,才能完成程序的升级!
那么下面的方法是我这两天弄出来的,可以将应用程序和BSP开发分离的一个办法。只要开始将接口约定好就可以了!还不是很成熟,我也还没有正式在项目中使用,但是我相信这是一个不错的选择!
首先,要建立一个文件系统,TFFS的文件系统就可以。磁盘大小只要可以放的下应用程序编译后的文件就好了。这步就不赘述了。
然后,在BSP工程的usrApp中添加下载应用程序模块和启动接口程序的代码。下面主要说明这步,代码如下:
- #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 */
- }
#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" {}中。
vxWorks应用程序加载的另一种办法的更多相关文章
- 关于Windows平台下应用程序加载DLL模块的问题.
本文将讨论以下问题: (1)Windows可执行程序会从哪些目录下加载DLL. (2)如何将可执行使用的DLL放置到统一的目录下,而不是与EXE同一目录. (3)可执行程序加载了不该加载的DLL. ( ...
- 无法为具有固定名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“MySql.Data.MySqlClient.MySqlProviderServices,MySql.Data.Entity.EF6”
"System.InvalidOperationException"类型的未经处理的异常在 mscorlib.dll 中发生 其他信息: 无法为具有固定名称"MySql. ...
- 32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数
32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数 (如果想看所有代码,请下载课堂资料,里面有所有代码,这里会讲解怎么生成一个窗口程序) 一丶32位汇编编写Windows窗口程序 首 ...
- Winform DevExpress控件库(二) 使用SplashScreenManager控件定制程序加载页面
SplashScreenManager控件:主要作用是显示在进行耗时操作时的等待界面: 位于 工具箱 -> Navigation & Layout(导航栏与布局类控件) 目录下: 在工具 ...
- 无法为具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer”。请确保使用限定程序集的名称且该程序集对运行的应用程序可用。有关详细信息,请参阅 http://go.m
Windows服务中程序发布之后会如下错误: 无法为具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“Syste ...
- 刚部署的程序加载不出来css,js以及图片
刚部署的程序加载不出来css,js以及图片,解决方式 需要在配置中加入静态资源 方法一: controller.xml中加入 <mvc:annotation-driven/> <mv ...
- 使用SplashScreenManager控件定制程序加载页面
需要devexpress版本在12.0及以上才支持 https://www.cnblogs.com/wuhuacong/p/6112461.html 在DevExpress程序中使用SplashScr ...
- cordova程序加载pdf文件的2种方法(ios/android)
前言 公司目前的前端架构是微信端由vue全家桶负责h5网站的单页应用,android端和ios端则选择cordova打包成apk和app.其中,有一个业务逻辑是点击某个链接进入pdf的展示,h5的方案 ...
- 操作系统的 (program)loader(程序加载器)
在计算机科学中,加载器(也叫程序加载器)属于操作系统的一部分,用于加载程序(programs)和库(libraries).加载器是执行程序和代码必不可少的组件,正是它负责将程序送入内存,为程序的运行提 ...
随机推荐
- 不需要客户端插件PHP也能实现单点登录
分析CAS原理,构建PHP单点登录 单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户 只需要登录一次就 ...
- Java垃圾回收机制[转]
原文地址:http://blog.csdn.net/zsuguangh/article/details/6429592 综合了若干人的blog- 1. 垃圾回收的意义 在C++中,对象所占的内存在程序 ...
- 洛谷 [P3355] 骑士共存问题
二分图求最大独立点集 本问题在二分图中已处理过,此处用dinic写了一遍 #include <iostream> #include <cstdio> #include < ...
- cdcqの省选膜你赛
cdcqの省选膜你赛 比赛当天因为在杠hnoi2016的大数据结构没有参加,今天补了一下.挺好玩的虽然不看一句话题意的话真的卡读题 此生无悔入东方,来世愿生幻想乡 2651. 新史「新幻想史 -现代史 ...
- 洛谷3月月赛 R1 Step! ZERO to ONE
洛谷3月月赛 R1 Step! ZERO to ONE 普及组难度 290.25/310滚粗 t1 10分的日语翻译题....太难了不会... t2 真·普及组.略 注意长为1的情况 #include ...
- Android开发之漫漫长途 XIV——RecyclerView
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- GitHub中开启二次验证Two-factor authentication,如何在命令行下更新和上传代码
最近在使用GitHub管理代码,在git命令行管理代码时候遇到一些问题.如果开起了二次验证(Two-factor authentication两个要素认证),命令行会一直提示输入用户名和密码.查找了一 ...
- Rsync(远程同步): linux中Rsync命令的实际示例
rsync的 ( 远程同步 )为在Linux / Unix系统局部 拷贝和同步文件和目录远程以及一个最常用的命令. 随着rsync命令的帮助,您可以复制并在目录中远程和本地同步数据,在磁盘和网络,进行 ...
- Node.js 基础介绍(一)
Node.js 学习笔记一) 简单介绍--名称 Node.js,平时听到有好几种叫法,node .Node.js.nodejs ,但是比较正式的称呼还是"Node.js",由于它是 ...
- 【深度学习系列】用PaddlePaddle进行车牌识别(一)
小伙伴们,终于到了实战部分了!今天给大家带来的项目是用PaddlePaddle进行车牌识别.车牌识别其实属于比较常见的图像识别的项目了,目前也属于比较成熟的应用,大多数老牌厂家能做到准确率99%+.传 ...