搜索
bottom↓
回复: 51

....请教多MDK中多HEX协同工作方法实现动态加载...

[复制链接]

出0入0汤圆

发表于 2018-4-4 13:11:53 | 显示全部楼层 |阅读模式
本帖最后由 dy22511825 于 2018-4-4 14:54 编辑

...1.MDK中如何实现多个HEX一起工作,不是IAP,比如HEX1与HEX2,HEX1完成基础配置,HEX2是几个函数(无中断,只算法),HEX1,HEX2需要相互调用,实现动态加载...

PS:  对方有400多个不同的HEX2,每次根据插入的设备ID来动态下载相应的HEX2

2. 对于某些依赖于gcc编译器的代码比如 eGlobal __attribute__((section(".runtime_globals"))) globals,这种代码将指定变量放到固定的目标文件自定义段的操作,还有将某些变量放到用户指定地址 ,这些在mdk中是否能实现?

出0入0汤圆

发表于 2018-4-4 13:19:49 | 显示全部楼层
有点麻烦,HEX2的函数要求是可重入的才行,并且要将函数存放的位置定位好。hex1使用函数指针进行访问

出0入22汤圆

发表于 2018-4-4 13:36:02 | 显示全部楼层
有这要求还不如直接把hex2编译成ram运行的,然后把hex2直接当成一串数组编译进hex1内,使用hex2的时候由hex1复制到ram内调用

出0入0汤圆

 楼主| 发表于 2018-4-4 14:53:01 | 显示全部楼层
jiaowoxiaolu 发表于 2018-4-4 13:36
有这要求还不如直接把hex2编译成ram运行的,然后把hex2直接当成一串数组编译进hex1内,使用hex2的时候由hex ...

不符合需求,对方有400多个不同的HEX2,每次根据插入的设备ID来动态下载相应的HEX2

出0入0汤圆

 楼主| 发表于 2018-4-4 14:53:37 | 显示全部楼层
gwnpeter 发表于 2018-4-4 13:19
有点麻烦,HEX2的函数要求是可重入的才行,并且要将函数存放的位置定位好。hex1使用函数指针进行访问 ...

嗯,得研究会

出0入0汤圆

发表于 2018-4-4 15:04:26 | 显示全部楼层
可是可以,指定函数地址,可重入或全局变量也指定地址。

出0入0汤圆

 楼主| 发表于 2018-4-4 15:14:46 | 显示全部楼层
styleno1 发表于 2018-4-4 15:04
可是可以,指定函数地址,可重入或全局变量也指定地址。

1.能否提供个DEMO
2. 如果当前有个4个HEX2过来,HEX1中如何把每个HEX2指定到相应的位置

出0入0汤圆

发表于 2018-4-4 15:24:15 | 显示全部楼层
dy22511825 发表于 2018-4-4 15:14
1.能否提供个DEMO
2. 如果当前有个4个HEX2过来,HEX1中如何把每个HEX2指定到相应的位置
...

1. 不能
2. HEX2用哪一段,商量好,HEX1按地址调用函数指针,烧录就可以运行

出0入0汤圆

发表于 2018-4-4 15:25:48 | 显示全部楼层
这是啥东西??

出0入0汤圆

发表于 2018-4-4 15:34:00 | 显示全部楼层
用函数指针数组是否可行?在固定内存地址存放函数指针数组,这样只要有个固定地址的入口函数就可以了,由它负责初始化函数指针数组。当然每个HEX2的接口函数要一致才行。

出0入0汤圆

发表于 2018-4-4 15:43:45 | 显示全部楼层
什么东西需要这么多HEX

出0入0汤圆

发表于 2018-4-4 16:14:58 | 显示全部楼层
找到相关的文章一个,供你参考

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-4-4 16:28:38 | 显示全部楼层
本帖最后由 jjj 于 2018-4-4 16:36 编辑

mdk不支持,但可以通过稍微复杂的技巧来实现,
首先通过 eGlobal __attribute__((section(".runtime_globals"))) globals类似的声明把函数定位到某个固定位置,然后把把生成的HEX想办法弄出来,这就得到了可加载的HEX函数。比如:
        uint8 tcms_fun(uint8 * p_dst,uint8 * p_src,uint32 jclx) __attribute__((section(".ARM.__at_0x31000")));
第二,通过把固定地址强制转换为函数调用来 跳转到生成 的HEX,比如:
       ((void (*)())(0x31000))(Tcms_to_6A_buf,Hdlc_buf,HXD3C);
理论就是这样的,实现起来,比较麻烦。

出0入0汤圆

发表于 2018-4-4 16:35:30 | 显示全部楼层
styleno1 发表于 2018-4-4 16:14
找到相关的文章一个,供你参考

一个相关专利??
想使用这个专利找谁?

出0入0汤圆

 楼主| 发表于 2018-4-4 17:22:52 | 显示全部楼层
jjj 发表于 2018-4-4 16:28
mdk不支持,但可以通过稍微复杂的技巧来实现,
首先通过 eGlobal __attribute__((section(".runtime_global ...

MDK 暂时没试过,但是GCC  LINKER 可以实现

出870入263汤圆

发表于 2018-4-4 17:41:48 | 显示全部楼层
如果每个hex不是同时运行,就很容易了。只要依靠hex1加载到内存运行就行了。
如果ram对于某个hex不够,那就只能让它在flash里运行,这就需要ropi编译了。
如果每个hex需要同时运行,那可以ropi,也可以给每个hex绝对定位,驻留在flash里。

出0入0汤圆

 楼主| 发表于 2018-4-4 17:52:15 | 显示全部楼层
armstrong 发表于 2018-4-4 17:41
如果每个hex不是同时运行,就很容易了。只要依靠hex1加载到内存运行就行了。
如果ram对于某个hex不够,那就 ...

是需要同时运行的

还有个问题 在gcc 编译中 可以加-nostartfiles实现无main函数生产HEX,在MDK能实现么?

出0入0汤圆

发表于 2018-4-4 17:53:16 | 显示全部楼层
我有做类似的项目,一个做Loader的Hex,一个做OS的hex,多个做APP的hex,Loader和OS不会同时Run,同时Run的只有OS和APP
主要是API的问题,OS采用集中函数表的方法,APP里采用地址重定位方法,OS加载APP的时候,对APP里面涉及OS-API的地方做重定位修改

出0入0汤圆

发表于 2018-4-4 18:03:17 来自手机 | 显示全部楼层
你这个方向偏了,你需要的是数据化编程,而不是动态加载。自己可以搜下,也可以付费找我指导。

出100入85汤圆

发表于 2018-4-4 19:22:04 来自手机 | 显示全部楼层
McuPlayer 发表于 2018-4-4 17:53
我有做类似的项目,一个做Loader的Hex,一个做OS的hex,多个做APP的hex,Loader和OS不会同时Run,同时Run的 ...

一直都想做,就是没实现。
会的人都不愿分享。

出0入0汤圆

发表于 2018-4-4 23:13:06 | 显示全部楼层
我以前也发过类似问题,一直没有特别好特别方便的办法,没有完整的思路,不过我知道rtt用的是解析elf文件的方法来做动态加载的

出0入0汤圆

发表于 2018-4-5 12:16:36 来自手机 | 显示全部楼层
速度不要求的话 可能脚本更灵活

出0入0汤圆

 楼主| 发表于 2018-4-5 14:28:12 | 显示全部楼层
McuPlayer 发表于 2018-4-4 17:53
我有做类似的项目,一个做Loader的Hex,一个做OS的hex,多个做APP的hex,Loader和OS不会同时Run,同时Run的 ...

。。。对,类似这样,可否给点指导,一些参考

出0入0汤圆

 楼主| 发表于 2018-4-5 14:29:39 | 显示全部楼层
gao_hailong 发表于 2018-4-4 18:03
你这个方向偏了,你需要的是数据化编程,而不是动态加载。自己可以搜下,也可以付费找我指导。 ...

付些费用这个,没有找到数据化编程

出0入0汤圆

 楼主| 发表于 2018-4-5 14:39:14 | 显示全部楼层
huangqi412 发表于 2018-4-5 12:16
速度不要求的话 可能脚本更灵活

脚本可以,但是不知道MDK里面怎么实现

出0入0汤圆

发表于 2018-4-5 15:24:30 | 显示全部楼层
该说的,已经说了,思路可以别人告诉你,但代码你得自己去实现。

Windows运行exe文件的方法,也是类似的,OS加载exe到内存,修改API函数地址,实现重定位,然后进行初始化,最后把执行权限交给main函数。
ARM上的实现是类似的,只是比较简化而已

出0入0汤圆

 楼主| 发表于 2018-4-5 17:33:52 | 显示全部楼层
McuPlayer 发表于 2018-4-5 15:24
该说的,已经说了,思路可以别人告诉你,但代码你得自己去实现。

Windows运行exe文件的方法,也是类似的, ...

....谢谢您指点

感觉这个有点像实现多进程运行。。。

出0入0汤圆

发表于 2018-4-6 09:50:27 | 显示全部楼层
多个HEX可以常驻FLASH吗?还是用完了就需要销毁?

出0入0汤圆

发表于 2018-4-6 10:25:46 | 显示全部楼层
感觉好高级的技术啊

出0入0汤圆

 楼主| 发表于 2018-4-6 14:53:28 | 显示全部楼层
负西弱 发表于 2018-4-6 10:25
感觉好高级的技术啊

....获取并不难,只是我还没有掌握方法

出0入0汤圆

 楼主| 发表于 2018-4-6 14:53:58 | 显示全部楼层
skyxjh 发表于 2018-4-6 09:50
多个HEX可以常驻FLASH吗?还是用完了就需要销毁?

不能啊,每个HEX2都是一个协议

出0入0汤圆

 楼主| 发表于 2018-4-9 10:12:55 | 显示全部楼层
McuPlayer 发表于 2018-4-5 15:24
该说的,已经说了,思路可以别人告诉你,但代码你得自己去实现。

Windows运行exe文件的方法,也是类似的, ...

。。。。你好,现在实现2个HEX了,启动HEX2把函数fun2重定向到0x08002000,但是当第2个hex2把FUN3重定向到0X08002000后,FUN2找不到了,有没有方法让fun3顺位往下放?

出0入0汤圆

发表于 2018-4-9 10:49:37 | 显示全部楼层
MDK 不是 有个能编译位置无关代码的选项的吗??? 加上把 模块设计成 可可重入的就 可以了吧, 转载到哪里运行都行

出0入0汤圆

发表于 2018-4-9 11:05:04 | 显示全部楼层
比较高深,学习下

出0入0汤圆

发表于 2018-4-9 11:11:56 | 显示全部楼层
NRF的蓝牙协议栈是不是就是这种,下载两个bin文件 然后用syscall调用

出0入0汤圆

发表于 2018-4-9 11:13:22 | 显示全部楼层
18楼正解

出300入477汤圆

发表于 2018-4-9 11:40:04 来自手机 | 显示全部楼层
McuPlayer 发表于 2018-4-5 15:24
该说的,已经说了,思路可以别人告诉你,但代码你得自己去实现。

Windows运行exe文件的方法,也是类似的, ...

API地址不修正也行。只要做个全局的API表,放在固定的地址,所有的hex都用函数指针去调用就行。或者给每个api规定一个固定的编号,用syscall去调用也一样的原理,但用syscall还要给每个函数写个包装器。

出0入0汤圆

发表于 2018-4-9 23:22:25 | 显示全部楼层
DING!!!!!!!!!!!!

出0入0汤圆

发表于 2018-4-10 12:38:38 来自手机 | 显示全部楼层
都是大牛

出0入0汤圆

 楼主| 发表于 2018-4-10 13:02:35 | 显示全部楼层
本帖最后由 dy22511825 于 2018-4-10 13:07 编辑

....首先感谢各位指导;
其次,此功能已实现,原理综上所述;
实现起来,以1个HEX1,2个HEX2为例,需要在HEX1中定义函数指针,把HEX2中的指定位置函数地址保存起来,注意要FLASH或者E2PROM等掉电不丢失的,如感兴趣的同行请查找__attribute用法
由于单位信息安全以及保密,无法上传相应DEMO,赞请请谅解,将在完善之后找机会提供;
最后,如某位将来项目应用此功能,可以交流...

出0入0汤圆

 楼主| 发表于 2018-4-10 13:08:39 | 显示全部楼层
styleno1 发表于 2018-4-4 16:14
找到相关的文章一个,供你参考

已经实现,谢谢指导

出0入0汤圆

 楼主| 发表于 2018-4-10 13:09:02 | 显示全部楼层
McuPlayer 发表于 2018-4-4 17:53
我有做类似的项目,一个做Loader的Hex,一个做OS的hex,多个做APP的hex,Loader和OS不会同时Run,同时Run的 ...

已经实现,谢谢指导

出0入0汤圆

 楼主| 发表于 2018-4-10 13:54:29 | 显示全部楼层
gwnpeter 发表于 2018-4-4 13:19
有点麻烦,HEX2的函数要求是可重入的才行,并且要将函数存放的位置定位好。hex1使用函数指针进行访问 ...

....是这方向,感谢...

出0入0汤圆

发表于 2018-4-10 14:03:43 | 显示全部楼层
好东西,mark下.hex2运行完,又回到hex1定位的地址么

出0入0汤圆

 楼主| 发表于 2018-4-10 21:52:16 | 显示全部楼层
formatme 发表于 2018-4-10 14:03
好东西,mark下.hex2运行完,又回到hex1定位的地址么

....HEX2只负责把对某个指定地址函数的实现,HEX1调用这个函数...

出0入0汤圆

发表于 2018-4-10 22:06:53 | 显示全部楼层
dy22511825 发表于 2018-4-10 21:52
....HEX2只负责把对某个指定地址函数的实现,HEX1调用这个函数...

谢谢,明白了.

出0入0汤圆

 楼主| 发表于 2018-4-11 10:30:46 | 显示全部楼层

互相学习

出0入0汤圆

发表于 2018-4-11 10:39:06 | 显示全部楼层
这样岂不是可以像EXE一样跑不同的程序;更像BOOTloader

出0入0汤圆

 楼主| 发表于 2018-4-11 13:02:16 | 显示全部楼层
makathy 发表于 2018-4-11 10:39
这样岂不是可以像EXE一样跑不同的程序;更像BOOTloader

BOOTLOADER是上电后跳转到APP之后不回来了,这个是在里面调用APP函数,

出5入14汤圆

发表于 2018-4-11 20:40:24 来自手机 | 显示全部楼层
这个是不是用于远程升级的技术?

出0入0汤圆

 楼主| 发表于 2018-4-12 10:43:12 | 显示全部楼层
EMC菜鸟 发表于 2018-4-11 20:40
这个是不是用于远程升级的技术?

远程升级 没这个复杂,有BOOT就行

出50入135汤圆

发表于 2023-7-5 18:08:49 | 显示全部楼层
是不是beremiz的RET实现原理,上位机生成APP,APP里面调用RET里面的函数,RET也调用APP里面的函数,看了半天,没有看懂.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-29 14:37

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

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