....请教多MDK中多HEX协同工作方法实现动态加载...
本帖最后由 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中是否能实现? 有点麻烦,HEX2的函数要求是可重入的才行,并且要将函数存放的位置定位好。hex1使用函数指针进行访问 有这要求还不如直接把hex2编译成ram运行的,然后把hex2直接当成一串数组编译进hex1内,使用hex2的时候由hex1复制到ram内调用 jiaowoxiaolu 发表于 2018-4-4 13:36
有这要求还不如直接把hex2编译成ram运行的,然后把hex2直接当成一串数组编译进hex1内,使用hex2的时候由hex ...
不符合需求,对方有400多个不同的HEX2,每次根据插入的设备ID来动态下载相应的HEX2 gwnpeter 发表于 2018-4-4 13:19
有点麻烦,HEX2的函数要求是可重入的才行,并且要将函数存放的位置定位好。hex1使用函数指针进行访问 ...
嗯,得研究会 可是可以,指定函数地址,可重入或全局变量也指定地址。 styleno1 发表于 2018-4-4 15:04
可是可以,指定函数地址,可重入或全局变量也指定地址。
1.能否提供个DEMO
2. 如果当前有个4个HEX2过来,HEX1中如何把每个HEX2指定到相应的位置
dy22511825 发表于 2018-4-4 15:14
1.能否提供个DEMO
2. 如果当前有个4个HEX2过来,HEX1中如何把每个HEX2指定到相应的位置
...
1. 不能
2. HEX2用哪一段,商量好,HEX1按地址调用函数指针,烧录就可以运行 这是啥东西?? 用函数指针数组是否可行?在固定内存地址存放函数指针数组,这样只要有个固定地址的入口函数就可以了,由它负责初始化函数指针数组。当然每个HEX2的接口函数要一致才行。 什么东西需要这么多HEX 找到相关的文章一个,供你参考
本帖最后由 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);
理论就是这样的,实现起来,比较麻烦。 styleno1 发表于 2018-4-4 16:14
找到相关的文章一个,供你参考
一个相关专利??
想使用这个专利找谁? jjj 发表于 2018-4-4 16:28
mdk不支持,但可以通过稍微复杂的技巧来实现,
首先通过 eGlobal __attribute__((section(".runtime_global ...
MDK 暂时没试过,但是GCCLINKER 可以实现 如果每个hex不是同时运行,就很容易了。只要依靠hex1加载到内存运行就行了。
如果ram对于某个hex不够,那就只能让它在flash里运行,这就需要ropi编译了。
如果每个hex需要同时运行,那可以ropi,也可以给每个hex绝对定位,驻留在flash里。 armstrong 发表于 2018-4-4 17:41
如果每个hex不是同时运行,就很容易了。只要依靠hex1加载到内存运行就行了。
如果ram对于某个hex不够,那就 ...
是需要同时运行的
还有个问题 在gcc 编译中 可以加-nostartfiles实现无main函数生产HEX,在MDK能实现么? 我有做类似的项目,一个做Loader的Hex,一个做OS的hex,多个做APP的hex,Loader和OS不会同时Run,同时Run的只有OS和APP
主要是API的问题,OS采用集中函数表的方法,APP里采用地址重定位方法,OS加载APP的时候,对APP里面涉及OS-API的地方做重定位修改 你这个方向偏了,你需要的是数据化编程,而不是动态加载。自己可以搜下,也可以付费找我指导。 McuPlayer 发表于 2018-4-4 17:53
我有做类似的项目,一个做Loader的Hex,一个做OS的hex,多个做APP的hex,Loader和OS不会同时Run,同时Run的 ...
一直都想做,就是没实现。
会的人都不愿分享。 我以前也发过类似问题,一直没有特别好特别方便的办法,没有完整的思路,不过我知道rtt用的是解析elf文件的方法来做动态加载的 速度不要求的话 可能脚本更灵活 McuPlayer 发表于 2018-4-4 17:53
我有做类似的项目,一个做Loader的Hex,一个做OS的hex,多个做APP的hex,Loader和OS不会同时Run,同时Run的 ...
。。。对,类似这样,可否给点指导,一些参考 gao_hailong 发表于 2018-4-4 18:03
你这个方向偏了,你需要的是数据化编程,而不是动态加载。自己可以搜下,也可以付费找我指导。 ...
付些费用这个,没有找到数据化编程 huangqi412 发表于 2018-4-5 12:16
速度不要求的话 可能脚本更灵活
脚本可以,但是不知道MDK里面怎么实现 该说的,已经说了,思路可以别人告诉你,但代码你得自己去实现。
Windows运行exe文件的方法,也是类似的,OS加载exe到内存,修改API函数地址,实现重定位,然后进行初始化,最后把执行权限交给main函数。
ARM上的实现是类似的,只是比较简化而已 McuPlayer 发表于 2018-4-5 15:24
该说的,已经说了,思路可以别人告诉你,但代码你得自己去实现。
Windows运行exe文件的方法,也是类似的, ...
....谢谢您指点
感觉这个有点像实现多进程运行。。。 多个HEX可以常驻FLASH吗?还是用完了就需要销毁? 感觉好高级的技术啊 负西弱 发表于 2018-4-6 10:25
感觉好高级的技术啊
....获取并不难,只是我还没有掌握方法 skyxjh 发表于 2018-4-6 09:50
多个HEX可以常驻FLASH吗?还是用完了就需要销毁?
不能啊,每个HEX2都是一个协议 McuPlayer 发表于 2018-4-5 15:24
该说的,已经说了,思路可以别人告诉你,但代码你得自己去实现。
Windows运行exe文件的方法,也是类似的, ...
。。。。你好,现在实现2个HEX了,启动HEX2把函数fun2重定向到0x08002000,但是当第2个hex2把FUN3重定向到0X08002000后,FUN2找不到了,有没有方法让fun3顺位往下放? MDK 不是 有个能编译位置无关代码的选项的吗??? 加上把 模块设计成 可可重入的就 可以了吧, 转载到哪里运行都行 比较高深,学习下 NRF的蓝牙协议栈是不是就是这种,下载两个bin文件 然后用syscall调用 18楼正解 McuPlayer 发表于 2018-4-5 15:24
该说的,已经说了,思路可以别人告诉你,但代码你得自己去实现。
Windows运行exe文件的方法,也是类似的, ...
API地址不修正也行。只要做个全局的API表,放在固定的地址,所有的hex都用函数指针去调用就行。或者给每个api规定一个固定的编号,用syscall去调用也一样的原理,但用syscall还要给每个函数写个包装器。 DING!!!!!!!!!!!! 都是大牛 本帖最后由 dy22511825 于 2018-4-10 13:07 编辑
....首先感谢各位指导;
其次,此功能已实现,原理综上所述;
实现起来,以1个HEX1,2个HEX2为例,需要在HEX1中定义函数指针,把HEX2中的指定位置函数地址保存起来,注意要FLASH或者E2PROM等掉电不丢失的,如感兴趣的同行请查找__attribute用法
由于单位信息安全以及保密,无法上传相应DEMO,赞请请谅解,将在完善之后找机会提供;
最后,如某位将来项目应用此功能,可以交流... styleno1 发表于 2018-4-4 16:14
找到相关的文章一个,供你参考
已经实现,谢谢指导 McuPlayer 发表于 2018-4-4 17:53
我有做类似的项目,一个做Loader的Hex,一个做OS的hex,多个做APP的hex,Loader和OS不会同时Run,同时Run的 ...
已经实现,谢谢指导 gwnpeter 发表于 2018-4-4 13:19
有点麻烦,HEX2的函数要求是可重入的才行,并且要将函数存放的位置定位好。hex1使用函数指针进行访问 ...
....是这方向,感谢... 好东西,mark下.hex2运行完,又回到hex1定位的地址么 formatme 发表于 2018-4-10 14:03
好东西,mark下.hex2运行完,又回到hex1定位的地址么
....HEX2只负责把对某个指定地址函数的实现,HEX1调用这个函数... dy22511825 发表于 2018-4-10 21:52
....HEX2只负责把对某个指定地址函数的实现,HEX1调用这个函数...
谢谢,明白了. formatme 发表于 2018-4-10 22:06
谢谢,明白了.
互相学习 这样岂不是可以像EXE一样跑不同的程序;更像BOOTloader makathy 发表于 2018-4-11 10:39
这样岂不是可以像EXE一样跑不同的程序;更像BOOTloader
BOOTLOADER是上电后跳转到APP之后不回来了,这个是在里面调用APP函数, 这个是不是用于远程升级的技术? EMC菜鸟 发表于 2018-4-11 20:40
这个是不是用于远程升级的技术?
远程升级 没这个复杂,有BOOT就行 是不是beremiz的RET实现原理,上位机生成APP,APP里面调用RET里面的函数,RET也调用APP里面的函数,看了半天,没有看懂.
页:
[1]