搜索
bottom↓
回复: 47

rtos下如何动态加载任务

[复制链接]

出0入0汤圆

发表于 2015-1-20 14:43:48 | 显示全部楼层 |阅读模式
我现在用的iap功能,其实就是个boot功能,导致这个boot程序内容无法重用,如果boot程序要支持各种高级协议,如tcpip、usb等,占用程序空间就会较大

这样在stm32这样的小rom单片机上就不是很适合,如果我们能够让boot成为全功能部件,就像Windows一样,所有的应用程序就是个动态加载程序

如果能够将rtos打造成类似于windows os这样,支持动态加载程序的话,应用程序区升级就方便多了,修改也非常容易

可能有人说需要mmu支持,其实在stm32里,使用位置无关代码或者就算是位置相关的,只要指定了rom区域,照样也没有问题

我们可以使用svc方式调用os函数,这样的话应用程序区甚至不会出现boot程序区的函数标号

唯一的不便是访问os区全局变量,不过可以用函数接口解决,看上去思路很清晰啊  

貌似rt-thread已经支持了任务动态加载,不知道是不是真的

出0入0汤圆

 楼主| 发表于 2015-1-20 21:27:08 | 显示全部楼层
s200661524 发表于 2015-1-20 20:25
rt里面已经有这样的例子了,可以实现动态加载

是在rtt公开下载那个文件里吗,我去研究研究

出0入0汤圆

 楼主| 发表于 2015-2-7 07:48:00 | 显示全部楼层
s200661524 发表于 2015-2-6 23:09
是的,模拟器上也可以跑,其实现在处理器性能已经很强大了,要是对速度没什么要求,完全可以用脚本语言去做 ...

有需求时再搞这个脚本吧,不过rtx本身就是用svc运行系统函数,改造起来还是挺麻烦的

出0入0汤圆

 楼主| 发表于 2015-2-13 16:59:15 | 显示全部楼层
s200661524 发表于 2015-2-13 14:25
"rtx本身就是用svc运行系统函数",不是通过svc调用来实现的,是对应用程序与系统进行动态链接实现的 ...

没明白你的意思


我在rtt官网问了这个问题,看他们好像是对elf文件格式进行动态加载,而不是bin文件动态加载。。。
具体也没搞懂,用了很高级的特性,对elf中引用的系统标号进行动态替换然后在sram中运行

出0入0汤圆

 楼主| 发表于 2015-3-25 07:56:00 | 显示全部楼层
本帖最后由 myxiaonia 于 2015-3-26 11:34 编辑
soos 发表于 2015-3-24 09:19
楼主有没有研究出办法啊??


恩 有个思路 rtx使用svc 0号中断系统调用,r12传递真实函数,我们可以强制要求r12传递值作为rtx内核函数的索引,这样的话我们只需要把所有rtx内核函数放到一张表中,通过索引来获得对应函数即可
这样rtx中前缀为os_的就可以搞定了,还有个isr_前缀的不知道怎么搞,你有思路吗


///////////////////////////////////////////////////////////////////////////////////////////////////////
为了兼容rtx原来的调用,不修改svc0号中断用法,而是使用svc1中断以查表法实现svc0的os_前缀内核函数,isr_则可以使用svc2的方式调用,isr_内核函数其实是通过pendsv实现的,我们就用svc间接来完成,同样只需要将所有isr_内核函数放到表中,做成索引
并且可以像rtx处理其他svc的方法调用svc2即可,即svc2调用后不需要处理任务切换

总结下,在rtx中,隐藏rtos内核函数具体实现,并在app程序中可以任意调用的方法:保留svc 0,1,2这三个中断号作为系统使用的中断号,其中svc0是rtx默认使用的,svc1是间接调用os_内核函数,svc2是间接调用isr_内核函数的


//////////////////////////////////////////////////////////////
遇上个麻烦事,nvic设置偏移的话,app程序中怎么兼容boot区的几个中断svc,pendsv和systick,不设置偏移的话,其他中断怎么调用

出0入0汤圆

 楼主| 发表于 2015-3-25 08:36:55 | 显示全部楼层
dgtg 发表于 2015-3-25 08:31
太高级了,没搞过,帮顶!

其实这个问题类似于 如何共用iap程序区的函数,这个问题坛子里早就有人问过了

出0入0汤圆

 楼主| 发表于 2015-3-25 15:17:10 | 显示全部楼层
zhenghe 发表于 2015-3-25 15:15
操作系统中线程是可以动态的。如果程序也是动态的(安装和卸载),这个不简单吧?可以参考windows的DLL ...

一般说rtos的任务的话,都是指的线程哦

出0入0汤圆

 楼主| 发表于 2015-3-28 07:35:42 | 显示全部楼层
s200661524 发表于 2015-3-27 22:33
把应用程序编译成可重定位的elf格式文件,操作系统加载elf格式文件并经链接处理后,生成一个可执行的对象 ...

我在rtt官网上问问了,确实如你所说,是对elf文件进行修改,而且还要在ram中运行。。。和我现在说的情况还是有不同的

出0入0汤圆

 楼主| 发表于 2015-3-28 11:53:48 | 显示全部楼层
huangqi412 发表于 2015-3-28 09:59
弱弱问  这个情况是两个普通工程么 还是说应用程序不是我们平常的普通mdk工程,只是生成一段代码片段 两个 ...

是个独立的程序,可能中断函数不好处理,如何重定向原来的3个中断函数,是个问题,看来只能指定函数地址了,然后在app程序中使用其作为中断向量

出0入0汤圆

 楼主| 发表于 2015-3-28 22:40:26 来自手机 | 显示全部楼层
kinsno 发表于 2015-3-28 22:10
还是没看懂你这个动态加载任务的意义所在啊?
最终不都得通过BIN烧进去!  ...

你看我楼主位就知道了,最直接目的是复用boot区代码,如果boot区是个全功能rtos,那么app区就可以调用boot区各种系统调用,看上去就像电脑上启动一个应用了,不是有很大灵活性么

出0入0汤圆

 楼主| 发表于 2015-3-29 13:54:07 | 显示全部楼层
McuPlayer 发表于 2015-3-29 09:12
另外,不建议直接把中断直接MAP给APP,JMP过去也不好,可以使用驱动程序做中转
对于速度要求高的,在中断函 ...

怎么用驱动程序跳转中断,我发现到最后,rtos使用的中断函数必须要让app程序知道啊

出0入0汤圆

 楼主| 发表于 2016-8-2 12:02:58 | 显示全部楼层
McuPlayer 发表于 2015-3-28 13:34
我也在用动态加载了,我觉得重点是这几个方面
1、OS实现函数导出表,APP把对OS的API全部基于这个表
2、APP ...

os导出函数调用表,这种做法是不是Windows上dll的做法啊,要用到时候就是一个跳转指令啊嘿嘿,
因为我用的rtx,所以我想到的办法就是再重定向一个svc,然后svc里面按照svc号选择对应的os函数,这样就不需要实际的函数标号地址,而且iap程序就算重新编译,也不怕这些函数标号换地址

用同样的办法我也找到了解决中断例程的问题,就是再用一个svc号的函数,可以注册到对应的向量中断里,这样的话app程序就可以运行中断了

再考虑到我在另一个帖子里找到了mdk下ropi程序的做法,其实到这里我已经可以实现了app程序的动态加载

现在最大的问题是,app程序既然是动态加载的,应该是可以传递 argv 和argc的,现在这个还没有思路,不知道mdk的程序是否支持程序的参数传递功能

出0入0汤圆

 楼主| 发表于 2016-8-4 16:04:24 | 显示全部楼层
McuPlayer 发表于 2016-8-2 12:28
APP通过软中断的方式调用OS提供的服务,也是一个办法,注意参数和返回值的问题就可以了,就像DOS下的int1 ...

我找到了给main函数传递argc,argv的方法,其实就是重定向了arm提供的__ARM_get_argv函数

之前没有找到,请看这里

出0入0汤圆

 楼主| 发表于 2016-8-4 19:03:58 | 显示全部楼层
McuPlayer 发表于 2016-8-4 17:28
你堆栈是怎么处理的?

没有处理,这个有什么特殊的吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-7 13:50

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表