morning_enr6U 发表于 2021-12-8 12:18:25

WZH 发表于 2021-12-8 10:47
现在正在整理代码结构和注释,整理好后就开个git仓库

{:8:}{:8:}{:8:}{:8:}{:8:}{:8:}

会飞的猪_2020 发表于 2021-12-8 14:03:15

虽然看不懂,但是觉得很厉害。👍

jasondong388 发表于 2021-12-8 14:14:04

楼主加油。时不时的进来看看有没有新情况。:lol

WZH 发表于 2021-12-8 17:03:13

本帖最后由 WZH 于 2022-2-18 17:52 编辑

我在gitee开了个仓库,里面把代码结构改了改,同时加了一个readme文件,方便大家移植,其中代码的实现思路有时间的话我会写一个详细点的文档,最近学业压力较大,可能要等到过年的时候文档才能写完{:7:}。

动态加载的gitee仓库
动态加载的gitee仓库

这个仓库是我平时学习h7时使用的,里面除了动态加载外还集成了一些别的功能,有兴趣的可以看看
完整的使用工程
动态加载简要的文档


ELF文件格式资料

WZH 发表于 2021-12-8 17:15:09

jasondong388 发表于 2021-12-8 14:14
楼主加油。时不时的进来看看有没有新情况。

gitee仓库已经安排上了:lol

morning_enr6U 发表于 2021-12-8 17:45:14

WZH 发表于 2021-12-8 17:03
我在gitee开了个仓库,里面把代码结构改了改,同时加了一个readme文件,方便大家移植,其中代码的实现思路 ...

非常给力{:8:}{:8:}

feelingcode 发表于 2021-12-10 00:14:10

threadx的module生成的bin文件体积小,文件的最前位置带了信息。像rtt的动态加载就是elf体积比较大,好处就是可以定好函数符号表方便调用

WZH 发表于 2021-12-10 11:54:54

feelingcode 发表于 2021-12-10 00:14
threadx的module生成的bin文件体积小,文件的最前位置带了信息。像rtt的动态加载就是elf体积比较大,好处就 ...

通过命令行配置可以让elf文件变小很多,在gitee提交的工程中修复了这个问题

morning_enr6U 发表于 2021-12-10 12:11:23

WZH 发表于 2021-12-10 11:54
通过命令行配置可以让elf文件变小很多,在gitee提交的工程中修复了这个问题

是在哪个gitee的仓库,是那个H7 RTX的吗?{:33:}

WZH 发表于 2021-12-10 15:03:44

morning_enr6U 发表于 2021-12-10 12:11
是在哪个gitee的仓库,是那个H7 RTX的吗?

在dynamic_loader那个仓库提交的

morning_enr6U 发表于 2021-12-10 15:17:49

WZH 发表于 2021-12-10 15:03
在dynamic_loader那个仓库提交的

{:33:}

wawe 发表于 2021-12-10 18:06:00

多年以前研究过,也没弄明白,当时只弄成了固定地址bin文件,加载后可以运行,这次可以好好学习学习了,感谢楼主分享!{:8:}

WZH 发表于 2021-12-10 23:52:19

wawe 发表于 2021-12-10 18:06
多年以前研究过,也没弄明白,当时只弄成了固定地址bin文件,加载后可以运行,这次可以好好学习学习了,感 ...

大家一起交流学习:lol

morning_enr6U 发表于 2021-12-11 12:35:29

WZH 发表于 2021-12-10 23:52
大家一起交流学习

SVC_CM7_Keil.lib   请问 这个库是负责什么功能的,WZH大侠!{:33:}

morning_enr6U 发表于 2021-12-11 12:38:22

SVC_CM7_IAR.a / SVC_CM7_GCC.a / SVC_CM7_Keil.lib: 16 bits mono/stereo and
multichannel input/output buffers, library runs on any STM32 microcontroller featuring a
core with Cortex®-M7 instruction set.
=======================
楼主,找到了,{:8:}

WZH 发表于 2021-12-11 12:52:59

morning_enr6U 发表于 2021-12-11 12:38
SVC_CM7_IAR.a / SVC_CM7_GCC.a / SVC_CM7_Keil.lib: 16 bits mono/stereo and
multichannel input/outpu ...

这个库是ST公司的一个智能音量控制的库,可以智能调节音频信号的增益,-80dB到36dB的范围

likeping 发表于 2021-12-11 22:31:33

动态加载的工程是独立编译么?

WZH 发表于 2021-12-12 01:22:39

likeping 发表于 2021-12-11 22:31
动态加载的工程是独立编译么?

被用来加载的elf文件与下载到单片机的工程是分开编译的,论坛里的app_elf_generate的工程用来生成被加载的elf文件,host_elf_loader则是用于解码加载elf文件的程序代码

morning_enr6U 发表于 2021-12-13 22:20:23

WZH大侠,你在准备教程吗?{:8:}{:34:}

emwin 发表于 2021-12-13 23:25:14

谢谢分享,你的elf loader跟这个文章是类似的吗?
https://ourembeddeds.github.io/blog/2020/08/16/elf-loader/

`dc2018 发表于 2021-12-14 09:09:01

我觉得有必要测试一下函数查找, 加载和释放的耗时.

WZH 发表于 2021-12-14 20:38:17

emwin 发表于 2021-12-13 23:25
谢谢分享,你的elf loader跟这个文章是类似的吗?
https://ourembeddeds.github.io/blog/2020/08/16/elf-l ...

{:8:}对,我的实现方法和这篇文章大体思路是一样的,但在具体操作上略有不同。我没做符号表的支持,也就是在编译时不链接一些函数,而是在动态加载时在链接。因为MDK5的编译器在编译base_platform属性的elf文件时,在编译期时就需要确定所有函数的定义,要不然无法链接。同时不使用这种符号表导入的方式可以大幅减少加载的的过程。

WZH 发表于 2021-12-14 20:50:37

`dc2018 发表于 2021-12-14 09:09
我觉得有必要测试一下函数查找, 加载和释放的耗时.

这个不太好测,因为这个耗时是根据动态加载的elf不同而不同,主要的耗时操作如下。
dl_load_lib:读文件、分配内存空间、将elf文件的加载域复制到内存、地址重定位、分配函数字符串的空间。
其中地址重定位、分配函数字符串的空间与elf文件中的动态符号表数量有关,代码中和全局变量相关的代码越多,需要重定位的地方越多,导出的函数越多,句柄中的函数串越多。
dl_get_func:这个函数就是查表,根据字符串寻找到elf文件中的函数指针
dl_get_entry:这个函数返回句柄中的entry_addr,没有额外操作
dl_destroy_lib:释放掉加载elf文件的内存,释放掉字符串函数表的内存,与导出的函数数量正相关
在一般的使用中,这几个函数可以很快的执行完

WZH 发表于 2021-12-14 20:56:18

morning_enr6U 发表于 2021-12-13 22:20
WZH大侠,你在准备教程吗?

已经新建好word文档了;P
最近的空闲时间比较零散,等到今年寒假安排上:lol

morning_enr6U 发表于 2021-12-14 21:21:58

WZH 发表于 2021-12-14 20:56
已经新建好word文档了
最近的空闲时间比较零散,等到今年寒假安排上

寒假安排,{:8:}{:3:}

morning_enr6U 发表于 2022-1-11 14:18:21

WZH 大侠有更新了,哈哈, 非常期待寒假大作的发布{:34:}{:34:}

WZH 发表于 2022-1-11 19:08:51

morning_enr6U 发表于 2022-1-11 14:18
WZH 大侠有更新了,哈哈, 非常期待寒假大作的发布

{:34:}

morning_enr6U 发表于 2022-2-11 21:46:24

寒假过完了吗? WZH大侠{:3:}

WZH 发表于 2022-2-12 21:51:40

morning_enr6U 发表于 2022-2-11 21:46
寒假过完了吗? WZH大侠

感觉写作太难了:'(,我这第一章还没写完

morning_enr6U 发表于 2022-2-14 09:06:06

{:34:}期待作品完成 {:34:}

水水水木木木 发表于 2022-2-15 14:59:31

顶一个,楼主辛苦了

jizai 发表于 2022-2-15 17:51:49

楼主,请问一下:dl_load_shared_object函数中加载elf文件时,分配的是栈上的空间,那么函数退出后,这段空间不就没有了嘛,怎么还能后续再次执行动态库中的代码逻辑呢?

lililili 发表于 2022-2-16 11:00:39

mark                        

WZH 发表于 2022-2-16 12:41:06

jizai 发表于 2022-2-15 17:51
楼主,请问一下:dl_load_shared_object函数中加载elf文件时,分配的是栈上的空间,那么函数退出后,这段空 ...

这是分配在堆上呀,函数退出依旧会保持的内存区

jizai 发表于 2022-2-16 14:12:32

WZH 发表于 2022-2-16 12:41
这是分配在堆上呀,函数退出依旧会保持的内存区

抱歉,从linux过来的,看到alloc函数就下意识的认为是在栈上开辟的空间。我追到底层看了下,虽然不太理解,但是看到malloc ralloc 和alloc都是差不多的汇编实现,感谢楼主的回复。

悠悠三千载 发表于 2022-2-17 10:38:34

sxw101320 发表于 2021-12-5 18:06
牛,之前做国网产品的时候,国网提供的操作系统就是动态加载app,知道是rtt的lwp模块,但是一直没有弄清楚 ...

听你这个描述,感觉不像是动态调用dll这种啊?感觉就是类似OTA这样的

WZH 发表于 2022-2-18 21:17:30

morning_enr6U 发表于 2022-2-14 09:06
期待作品完成

{:22:}

morning_enr6U 发表于 2022-2-20 11:13:48

{:22:}{:6:}

xad74 发表于 2022-2-22 08:03:08

好东西,这样是不是就意为着当程序出现问题时不用整体更新了,只需更新问题程序就行

jasondong388 发表于 2022-2-23 14:30:45

Mark      
页: 1 [2] 3 4 5
查看完整版本: 论坛首发,STM32实现动态加载模组(似于Windows的dll),使用MDK编译动态库类