dy22511825 发表于 2018-4-4 13:11:53

....请教多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中是否能实现?

gwnpeter 发表于 2018-4-4 13:19:49

有点麻烦,HEX2的函数要求是可重入的才行,并且要将函数存放的位置定位好。hex1使用函数指针进行访问

jiaowoxiaolu 发表于 2018-4-4 13:36:02

有这要求还不如直接把hex2编译成ram运行的,然后把hex2直接当成一串数组编译进hex1内,使用hex2的时候由hex1复制到ram内调用

dy22511825 发表于 2018-4-4 14:53:01

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

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

dy22511825 发表于 2018-4-4 14:53:37

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

嗯,得研究会

styleno1 发表于 2018-4-4 15:04:26

可是可以,指定函数地址,可重入或全局变量也指定地址。

dy22511825 发表于 2018-4-4 15:14:46

styleno1 发表于 2018-4-4 15:04
可是可以,指定函数地址,可重入或全局变量也指定地址。

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

styleno1 发表于 2018-4-4 15:24:15

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

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

inkfish321 发表于 2018-4-4 15:25:48

这是啥东西??

flamma 发表于 2018-4-4 15:34:00

用函数指针数组是否可行?在固定内存地址存放函数指针数组,这样只要有个固定地址的入口函数就可以了,由它负责初始化函数指针数组。当然每个HEX2的接口函数要一致才行。

inkfish321 发表于 2018-4-4 15:43:45

什么东西需要这么多HEX

styleno1 发表于 2018-4-4 16:14:58

找到相关的文章一个,供你参考

jjj 发表于 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);
理论就是这样的,实现起来,比较麻烦。

jjj 发表于 2018-4-4 16:35:30

styleno1 发表于 2018-4-4 16:14
找到相关的文章一个,供你参考

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

dy22511825 发表于 2018-4-4 17:22:52

jjj 发表于 2018-4-4 16:28
mdk不支持,但可以通过稍微复杂的技巧来实现,
首先通过 eGlobal __attribute__((section(".runtime_global ...

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

armstrong 发表于 2018-4-4 17:41:48

如果每个hex不是同时运行,就很容易了。只要依靠hex1加载到内存运行就行了。
如果ram对于某个hex不够,那就只能让它在flash里运行,这就需要ropi编译了。
如果每个hex需要同时运行,那可以ropi,也可以给每个hex绝对定位,驻留在flash里。

dy22511825 发表于 2018-4-4 17:52:15

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

是需要同时运行的

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

McuPlayer 发表于 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的地方做重定位修改

gao_hailong 发表于 2018-4-4 18:03:17

你这个方向偏了,你需要的是数据化编程,而不是动态加载。自己可以搜下,也可以付费找我指导。

whatcanitbe 发表于 2018-4-4 19:22:04

McuPlayer 发表于 2018-4-4 17:53
我有做类似的项目,一个做Loader的Hex,一个做OS的hex,多个做APP的hex,Loader和OS不会同时Run,同时Run的 ...

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

myxiaonia 发表于 2018-4-4 23:13:06

我以前也发过类似问题,一直没有特别好特别方便的办法,没有完整的思路,不过我知道rtt用的是解析elf文件的方法来做动态加载的

huangqi412 发表于 2018-4-5 12:16:36

速度不要求的话 可能脚本更灵活

dy22511825 发表于 2018-4-5 14:28:12

McuPlayer 发表于 2018-4-4 17:53
我有做类似的项目,一个做Loader的Hex,一个做OS的hex,多个做APP的hex,Loader和OS不会同时Run,同时Run的 ...

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

dy22511825 发表于 2018-4-5 14:29:39

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

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

dy22511825 发表于 2018-4-5 14:39:14

huangqi412 发表于 2018-4-5 12:16
速度不要求的话 可能脚本更灵活

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

McuPlayer 发表于 2018-4-5 15:24:30

该说的,已经说了,思路可以别人告诉你,但代码你得自己去实现。

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

dy22511825 发表于 2018-4-5 17:33:52

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

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

....谢谢您指点

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

skyxjh 发表于 2018-4-6 09:50:27

多个HEX可以常驻FLASH吗?还是用完了就需要销毁?

负西弱 发表于 2018-4-6 10:25:46

感觉好高级的技术啊

dy22511825 发表于 2018-4-6 14:53:28

负西弱 发表于 2018-4-6 10:25
感觉好高级的技术啊

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

dy22511825 发表于 2018-4-6 14:53:58

skyxjh 发表于 2018-4-6 09:50
多个HEX可以常驻FLASH吗?还是用完了就需要销毁?

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

dy22511825 发表于 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顺位往下放?

onepower 发表于 2018-4-9 10:49:37

MDK 不是 有个能编译位置无关代码的选项的吗??? 加上把 模块设计成 可可重入的就 可以了吧, 转载到哪里运行都行

ZDHCKJS 发表于 2018-4-9 11:05:04

比较高深,学习下

gyd0317 发表于 2018-4-9 11:11:56

NRF的蓝牙协议栈是不是就是这种,下载两个bin文件 然后用syscall调用

897152237 发表于 2018-4-9 11:13:22

18楼正解

redroof 发表于 2018-4-9 11:40:04

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

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

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

babyhua 发表于 2018-4-9 23:22:25

DING!!!!!!!!!!!!

longhua 发表于 2018-4-10 12:38:38

都是大牛

dy22511825 发表于 2018-4-10 13:02:35

本帖最后由 dy22511825 于 2018-4-10 13:07 编辑

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

dy22511825 发表于 2018-4-10 13:08:39

styleno1 发表于 2018-4-4 16:14
找到相关的文章一个,供你参考

已经实现,谢谢指导

dy22511825 发表于 2018-4-10 13:09:02

McuPlayer 发表于 2018-4-4 17:53
我有做类似的项目,一个做Loader的Hex,一个做OS的hex,多个做APP的hex,Loader和OS不会同时Run,同时Run的 ...

已经实现,谢谢指导

dy22511825 发表于 2018-4-10 13:54:29

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

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

formatme 发表于 2018-4-10 14:03:43

好东西,mark下.hex2运行完,又回到hex1定位的地址么

dy22511825 发表于 2018-4-10 21:52:16

formatme 发表于 2018-4-10 14:03
好东西,mark下.hex2运行完,又回到hex1定位的地址么

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

formatme 发表于 2018-4-10 22:06:53

dy22511825 发表于 2018-4-10 21:52
....HEX2只负责把对某个指定地址函数的实现,HEX1调用这个函数...

谢谢,明白了.

dy22511825 发表于 2018-4-11 10:30:46

formatme 发表于 2018-4-10 22:06
谢谢,明白了.

互相学习

makathy 发表于 2018-4-11 10:39:06

这样岂不是可以像EXE一样跑不同的程序;更像BOOTloader

dy22511825 发表于 2018-4-11 13:02:16

makathy 发表于 2018-4-11 10:39
这样岂不是可以像EXE一样跑不同的程序;更像BOOTloader

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

EMC菜鸟 发表于 2018-4-11 20:40:24

这个是不是用于远程升级的技术?

dy22511825 发表于 2018-4-12 10:43:12

EMC菜鸟 发表于 2018-4-11 20:40
这个是不是用于远程升级的技术?

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

Stm32Motor 发表于 2023-7-5 18:08:49

是不是beremiz的RET实现原理,上位机生成APP,APP里面调用RET里面的函数,RET也调用APP里面的函数,看了半天,没有看懂.
页: [1]
查看完整版本: ....请教多MDK中多HEX协同工作方法实现动态加载...