打印

UC/OS-II 实现动态加载程序问题

[复制链接]
3692|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yinux|  楼主 | 2012-8-22 17:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位, 想要实现如下功能:

1. uc/osii系统从片内启动
2. 将一部分应用程序单独编译为lib,并将lib烧写到片内flash或者片外flash,或者SD卡上;
3. 系统启动之后,能够加载2中的lib程序,并调用执行2中的task。

感觉这个应该是UC/OS-II 实现动态加载程序问题,请问大家有没有什么思路 给个建议,谢谢。


UC/OS-II 能实现动态加载lib或者o文件么,我需要在uc/os启动之后,从flash上加载已经存在的一个lib或者o文件。

相关帖子

沙发
xinzha| | 2012-8-23 09:57 | 只看该作者
在ucos运行的时候分配一块足够大的区域,将二进制文件拷贝到那个地址。在你要动态加载的二进制文件中要利用一些手段让主程序能够找到lib中相应函数的入口,并且能够调用之后正确返回。切记lib中不能使用全局变量而要以传入参数的方式送进去。有不同的实现方法,会碰到不同的问题,搞明白c语言的调用返回以及栈之类的操作基本自己能解决。

使用特权

评论回复
板凳
yinux|  楼主 | 2012-8-24 09:37 | 只看该作者
xinzha,你好,
我的可用RAM很小,估计能给与这个lib(也可能是一些编译好的obj文件)大约2k的RAM。我的OS执行起来后,使用文件系统,如果不能将这个lib整体拷贝到一段连续的空闲RAM中,还有什么办法能找到这个lib种函数的入口?
“切记lib中不能使用全局变量而要以传入参数的方式送进去”,这句话什么意思没有明白,如果使用了全局变量会对编译器连接时造成冲突吧? 这个lib是有别人开发的,所以不好限制他编写规则。

很感谢你的回复。

使用特权

评论回复
地板
xinzha| | 2012-8-24 10:39 | 只看该作者
如果是别人开发的,你就只能暂且假定他没有用到全局变量或者静态变量这些东西,如果在动态加载的包里面用到全局变量的话可能会造成严重的后果,因为动态加载的包位置不确定,引用的全局变量的位置也可能不确定,除非能够保证所有全局变量在动态加载的包内并且在链接时选择位置无关这个选项。这部分可以多了解下编译链接的原理。
如果你不能保证分配到连续内存,而且是别人提供的lib,并且没有mmu的话,我也不知道该怎么办了。

使用特权

评论回复
5
原野之狼| | 2012-8-24 12:49 | 只看该作者
.lib  .o   是中间文件   因此无所谓你说的动态加载
在PC平台  windows里叫dll   linux里叫so  它们是可执行文件  可以被动态加载
在单片机上  若没有系统的支持  是不可能做到动态加载的
ucos没有这个功能 不过你倒是可以搜索一下rt-thread 它有动态加载的功能

使用特权

评论回复
6
原野之狼| | 2012-8-24 12:50 | 只看该作者
刚回了一段文字  竟然没了  
那就简单说吧 搜索rt-thread

使用特权

评论回复
7
xinzha| | 2012-8-24 13:49 | 只看该作者
我们已经实现arm7+ucos的aacv2动态加载,楼上的可以查查arm链接器里面的overlay概念,这就是动态加载的一种方式。早好几年功能手机就已经能够下载小软件玩,他们也都是用的arm7+nucleus或者threadx,也是mtk或者展讯自己实现的动态加载。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

14

帖子

0

粉丝