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).加载器是执行程序和代码必不可少的组件,正是它负责将程序送入内存,为程序的运行提 ...
随机推荐
- spring jdbc踩坑日记,new JdbcTemplate 为null导致UserDao一直为null
private DataSource datasource; private JdbcTemplate jdbcTemplateObject; //设置注入 public void setdataso ...
- ABP官方文档翻译 8.1 通知系统
通知系统 介绍 发送模型 通知类型 通知数据 通知严重性 关于通知持久化 订阅通知 发布通知 用户通知管理 实时通知 客户端 通知存储 通知定义 介绍 在系统中通知用来基于特定的事件告知用户.ABP提 ...
- Could note find result map com.xxxx.entity.UserAccountDO
原因: insert语句的标签写错:应该是parameterType,而不应该是resultType
- BZOJ 3992: [SDOI2015]序列统计 [快速数论变换 生成函数 离散对数]
3992: [SDOI2015]序列统计 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1017 Solved: 466[Submit][Statu ...
- BZOJ 2754: [SCOI2012]喵星球上的点名 [AC自动机+map+暴力]
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1902 Solved: 837[Submit][St ...
- WEB-INF目录下文件复制的几种方式
2018年1月31日 10:42:55 工作完写点博客记录下. 需求:从web-inf下拷贝文件到指定目录. 目录结构 直接贴代码 第一种方式,字节流读取 try { int index = 0; S ...
- Halcon一日一练:CAD类型的相关操作
大很多场合,需要在视觉程序中导入CAD文档,比如,在3C行业,需要对手机外壳进行CNC加工,或者点胶操作,此时,需要获取产品的各个点的数据.如果将CAD直接导入,就会大的减少编程工作量,同时也能达到很 ...
- Windows实用快捷键
1 返回上一级目录:Backspace 2 复制当前窗口:Ctr + N 3 在当前文件目录中选定首个文件(夹):Space 4 切换窗口:Alt + Tab 5 当前浏览器Tab页倒退或前进历史页 ...
- 在OS X系统中php访问sftp时需要ssh2扩展的安装
php -v brew install homebrew/php/php55-ssh2 [实现方式] <?php $connection = ssh2_connect('192.168.0.14 ...
- fiddler 抓取 nodejs
nodejs 代理指向 fiddler var options = { ........ }; options.path = 'http://' + options.host + ...