硬汉嵌入式论坛

 找回密码
 立即注册
楼主: WZH
收起左侧

[STM32H7] 论坛首发,STM32实现动态加载模组(似于Windows的dll),使用MDK编译动态库类

  [复制链接]

3

主题

1220

回帖

1229

积分

至尊会员

积分
1229
发表于 2021-12-8 12:18:25 | 显示全部楼层
WZH 发表于 2021-12-8 10:47
现在正在整理代码结构和注释,整理好后就开个git仓库

回复

使用道具 举报

37

主题

193

回帖

314

积分

高级会员

积分
314
发表于 2021-12-8 14:03:15 | 显示全部楼层
虽然看不懂,但是觉得很厉害。👍
回复

使用道具 举报

3

主题

41

回帖

50

积分

初级会员

积分
50
发表于 2021-12-8 14:14:04 | 显示全部楼层
楼主加油。时不时的进来看看有没有新情况。
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2021-12-8 17:03:13 | 显示全部楼层
本帖最后由 WZH 于 2022-2-18 17:52 编辑

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

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

这个仓库是我平时学习h7时使用的,里面除了动态加载外还集成了一些别的功能,有兴趣的可以看看
完整的使用工程
动态加载简要的文档
STM32动态加载V0.1.pdf (1.12 MB, 下载次数: 341)

ELF文件格式资料
ELF手册-中文版.pdf (551.78 KB, 下载次数: 367)
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2021-12-8 17:15:09 | 显示全部楼层
jasondong388 发表于 2021-12-8 14:14
楼主加油。时不时的进来看看有没有新情况。

gitee仓库已经安排上了
回复

使用道具 举报

3

主题

1220

回帖

1229

积分

至尊会员

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

非常给力
回复

使用道具 举报

7

主题

74

回帖

100

积分

初级会员

积分
100
发表于 2021-12-10 00:14:10 | 显示全部楼层
threadx的module生成的bin文件体积小,文件的最前位置带了信息。像rtt的动态加载就是elf体积比较大,好处就是可以定好函数符号表方便调用
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2021-12-10 11:54:54 | 显示全部楼层
feelingcode 发表于 2021-12-10 00:14
threadx的module生成的bin文件体积小,文件的最前位置带了信息。像rtt的动态加载就是elf体积比较大,好处就 ...

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

使用道具 举报

3

主题

1220

回帖

1229

积分

至尊会员

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

是在哪个gitee的仓库,是那个H7 RTX的吗?
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2021-12-10 15:03:44 | 显示全部楼层
morning_enr6U 发表于 2021-12-10 12:11
是在哪个gitee的仓库,是那个H7 RTX的吗?

在dynamic_loader那个仓库提交的
回复

使用道具 举报

3

主题

1220

回帖

1229

积分

至尊会员

积分
1229
发表于 2021-12-10 15:17:49 | 显示全部楼层
WZH 发表于 2021-12-10 15:03
在dynamic_loader那个仓库提交的

回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2021-12-10 18:06:00 | 显示全部楼层
多年以前研究过,也没弄明白,当时只弄成了固定地址bin文件,加载后可以运行,这次可以好好学习学习了,感谢楼主分享!
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2021-12-10 23:52:19 | 显示全部楼层
wawe 发表于 2021-12-10 18:06
多年以前研究过,也没弄明白,当时只弄成了固定地址bin文件,加载后可以运行,这次可以好好学习学习了,感 ...

大家一起交流学习
回复

使用道具 举报

3

主题

1220

回帖

1229

积分

至尊会员

积分
1229
发表于 2021-12-11 12:35:29 | 显示全部楼层
WZH 发表于 2021-12-10 23:52
大家一起交流学习

SVC_CM7_Keil.lib   请问 这个库是负责什么功能的,WZH大侠!
回复

使用道具 举报

3

主题

1220

回帖

1229

积分

至尊会员

积分
1229
发表于 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.
=======================
楼主,找到了,
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 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的范围
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2021-12-11 22:31:33 | 显示全部楼层
动态加载的工程是独立编译么?
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2021-12-12 01:22:39 来自手机 | 显示全部楼层
likeping 发表于 2021-12-11 22:31
动态加载的工程是独立编译么?

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

使用道具 举报

3

主题

1220

回帖

1229

积分

至尊会员

积分
1229
发表于 2021-12-13 22:20:23 | 显示全部楼层
WZH大侠,你在准备教程吗?
回复

使用道具 举报

210

主题

1041

回帖

1681

积分

至尊会员

More we do, more we can do.

积分
1681
发表于 2021-12-13 23:25:14 | 显示全部楼层
谢谢分享,你的elf loader跟这个文章是类似的吗?
https://ourembeddeds.github.io/blog/2020/08/16/elf-loader/
回复

使用道具 举报

10

主题

92

回帖

122

积分

初级会员

积分
122
发表于 2021-12-14 09:09:01 | 显示全部楼层
我觉得有必要测试一下函数查找, 加载和释放的耗时.
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2021-12-14 20:38:17 | 显示全部楼层
emwin 发表于 2021-12-13 23:25
谢谢分享,你的elf loader跟这个文章是类似的吗?
https://ourembeddeds.github.io/blog/2020/08/16/elf-l ...

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

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 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文件的内存,释放掉字符串函数表的内存,与导出的函数数量正相关
在一般的使用中,这几个函数可以很快的执行完
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2021-12-14 20:56:18 | 显示全部楼层
morning_enr6U 发表于 2021-12-13 22:20
WZH大侠,你在准备教程吗?

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

使用道具 举报

3

主题

1220

回帖

1229

积分

至尊会员

积分
1229
发表于 2021-12-14 21:21:58 | 显示全部楼层
WZH 发表于 2021-12-14 20:56
已经新建好word文档了
最近的空闲时间比较零散,等到今年寒假安排上

寒假安排,
回复

使用道具 举报

3

主题

1220

回帖

1229

积分

至尊会员

积分
1229
发表于 2022-1-11 14:18:21 | 显示全部楼层
WZH 大侠有更新了,哈哈, 非常期待寒假大作的发布
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2022-1-11 19:08:51 | 显示全部楼层
morning_enr6U 发表于 2022-1-11 14:18
WZH 大侠有更新了,哈哈, 非常期待寒假大作的发布

回复

使用道具 举报

3

主题

1220

回帖

1229

积分

至尊会员

积分
1229
发表于 2022-2-11 21:46:24 | 显示全部楼层
寒假过完了吗? WZH大侠
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2022-2-12 21:51:40 | 显示全部楼层
morning_enr6U 发表于 2022-2-11 21:46
寒假过完了吗? WZH大侠

感觉写作太难了,我这第一章还没写完
回复

使用道具 举报

3

主题

1220

回帖

1229

积分

至尊会员

积分
1229
发表于 2022-2-14 09:06:06 | 显示全部楼层
  期待作品完成
回复

使用道具 举报

2

主题

39

回帖

50

积分

初级会员

积分
50
发表于 2022-2-15 14:59:31 | 显示全部楼层
顶一个,楼主辛苦了
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2022-2-15 17:51:49 | 显示全部楼层
楼主,请问一下:dl_load_shared_object函数中加载elf文件时,分配的是栈上的空间,那么函数退出后,这段空间不就没有了嘛,怎么还能后续再次执行动态库中的代码逻辑呢?
Snipaste_2022-02-15_17-50-50.png
图片.png
回复

使用道具 举报

1

主题

30

回帖

33

积分

新手上路

积分
33
发表于 2022-2-16 11:00:39 | 显示全部楼层
mark                        
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2022-2-16 12:41:06 | 显示全部楼层
jizai 发表于 2022-2-15 17:51
楼主,请问一下:dl_load_shared_object函数中加载elf文件时,分配的是栈上的空间,那么函数退出后,这段空 ...

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

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2022-2-16 14:12:32 | 显示全部楼层
WZH 发表于 2022-2-16 12:41
这是分配在堆上呀,函数退出依旧会保持的内存区

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

使用道具 举报

9

主题

78

回帖

105

积分

初级会员

积分
105
发表于 2022-2-17 10:38:34 | 显示全部楼层
sxw101320 发表于 2021-12-5 18:06
牛,之前做国网产品的时候,国网提供的操作系统就是动态加载app,知道是rtt的lwp模块,但是一直没有弄清楚 ...

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

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2022-2-18 21:17:30 | 显示全部楼层
回复

使用道具 举报

3

主题

1220

回帖

1229

积分

至尊会员

积分
1229
发表于 2022-2-20 11:13:48 | 显示全部楼层
回复

使用道具 举报

5

主题

14

回帖

29

积分

新手上路

积分
29
发表于 2022-2-22 08:03:08 | 显示全部楼层
好东西,这样是不是就意为着当程序出现问题时不用整体更新了,只需更新问题程序就行
回复

使用道具 举报

3

主题

41

回帖

50

积分

初级会员

积分
50
发表于 2022-2-23 14:30:45 | 显示全部楼层
Mark      
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-20 08:00 , Processed in 0.457092 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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