硬汉嵌入式论坛

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

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

  [复制链接]

7

主题

18

回帖

39

积分

新手上路

积分
39
发表于 2022-10-16 15:57:46 | 显示全部楼层
我用的就是gitee上的试了不行,不过我另外新建的工程可以了。想问下这个应用程序还能仿真吗?毕竟仿真是单片机开发的优势之一啊。
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2022-10-17 15:11:43 | 显示全部楼层
pokemonds 发表于 2022-10-16 15:57
我用的就是gitee上的试了不行,不过我另外新建的工程可以了。想问下这个应用程序还能仿真吗?毕竟仿真是单 ...

你指的仿真是仿真调试吗?这个目前应该还不能调试,没研究过这个
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2022-10-19 17:14:21 | 显示全部楼层
虽然看不懂,但是觉得很厉害
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2022-11-24 11:25:44 | 显示全部楼层
谢谢分享,
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2022-11-24 17:13:29 | 显示全部楼层
一定要用keil编译吗? gcc不行?
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2022-11-24 17:20:42 | 显示全部楼层
lenghonglin 发表于 2022-11-24 17:13
一定要用keil编译吗? gcc不行?

程序分为两部分,一部分是用于加载程序的动态加载器,这部分可以用任何平台编译。
另一部分是被动态加载的程序,这部分使用Keil编译的,因为本文中的生成用于动态加载的程序利用了Keil的链接器的部分特性。如果gcc有这部分特性的话,当然可以用gcc编译,只不过需要自己研究一下相关的编译器与链接器手册。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2022-11-28 18:15:11 | 显示全部楼层
WZH 发表于 2022-11-24 17:20
程序分为两部分,一部分是用于加载程序的动态加载器,这部分可以用任何平台编译。
另一部分是被动态加载 ...

之前一直想了解这部分,都没看啥好的资料,。我搞个keil来研究下
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2022-11-28 21:57:12 | 显示全部楼层
lenghonglin 发表于 2022-11-28 18:15
之前一直想了解这部分,都没看啥好的资料,。我搞个keil来研究下

期待你成功
回复

使用道具 举报

21

主题

61

回帖

124

积分

初级会员

积分
124
发表于 2023-5-31 10:45:38 | 显示全部楼层
版主你好,你发的教程里动态加载的实现,使用RAM空间较小的MCU能实现吗,比如stm32l431 64kRAM。是不是app代码不能写的太大,因为程序是加载到RAM中运行的?
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2023-6-2 10:00:48 | 显示全部楼层
zhumx 发表于 2023-5-31 10:45
版主你好,你发的教程里动态加载的实现,使用RAM空间较小的MCU能实现吗,比如stm32l431 64kRAM。是不是app ...

没错,是在ram中运行的。单个app的代码写的太大确实会装载不下,像这种情况可以把一个大的app拆成多个小的来加载。
回复

使用道具 举报

3

主题

1220

回帖

1229

积分

至尊会员

积分
1229
发表于 2023-6-2 11:07:11 | 显示全部楼层
楼主还活跃在这个帖子,
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2023-6-8 12:50:09 | 显示全部楼层
morning_enr6U 发表于 2023-6-2 11:07
楼主还活跃在这个帖子,

回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2023-6-15 19:10:10 | 显示全部楼层
lenghonglin 发表于 2022-11-24 17:13
一定要用keil编译吗? gcc不行?

可以用GCC-ARM-NONE-EABI 编译器试一下,需要自己写.ld文件,.ld文件也可以借助STM32CUBE IDE 配置生成,然后再根据楼主.sct文件改改就好了
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2023-6-16 19:34:54 | 显示全部楼层
发现大多数都是基于操作系统实现动态加载,裸机上可以吗?比如while不停的扫描存放elf文件的flash区域,扫描到就开始动态加载
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2023-6-17 13:48:22 | 显示全部楼层
linuxarmy@163 发表于 2023-6-16 19:34
发现大多数都是基于操作系统实现动态加载,裸机上可以吗?比如while不停的扫描存放elf文件的flash区域,扫 ...

这个就是在裸机上实现的,不需要任何操作系统。
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2023-6-19 17:25:23 | 显示全部楼层
WZH 发表于 2023-6-17 13:48
这个就是在裸机上实现的,不需要任何操作系统。

很强,最近也在研究这个,可以少走很多弯路
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2023-6-20 19:20:02 | 显示全部楼层
linuxarmy@163 发表于 2023-6-19 17:25
很强,最近也在研究这个,可以少走很多弯路

好,祝你成功
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2023-6-20 19:20:07 | 显示全部楼层
linuxarmy@163 发表于 2023-6-19 17:25
很强,最近也在研究这个,可以少走很多弯路

好,祝你成功
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2023-7-14 14:51:22 | 显示全部楼层
使用GCC编译 dl_vector.c 会有stdin、stdout、strerr  initializer element is not constant 的error,这个问题有人遇到过吗
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2023-7-14 22:22:08 | 显示全部楼层
kann 发表于 2023-7-14 14:51
使用GCC编译 dl_vector.c 会有stdin、stdout、strerr  initializer element is not constant 的error,这个 ...

这几个变量和编译器有关,我这个只适用于arm clang编译器
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

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

这种要mmu支持
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2023-7-31 17:48:30 | 显示全部楼层
楼主,您好。看你的文章大受启发,已经移植成功RTT的rt_err_t dlmodule_load_relocated_object(struct rt_dlmodule* module, void *module_ptr)
我请教一个问题,像这种Relocation type for arm的符号如何找到对应的汇编指令以及解析方式,我看您实现了R_ARM_THM_MOVW_ABS_NC 以及R_ARM_THM_MOVT_ABS,有相关资料去了解吗
谢谢~期待你的回复
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2023-8-3 15:28:02 | 显示全部楼层
本帖最后由 WZH 于 2023-8-3 15:31 编辑
awell18 发表于 2023-7-31 17:48
楼主,您好。看你的文章大受启发,已经移植成功RTT的rt_err_t dlmodule_load_relocated_object(struct rt_d ...

这个我当时是在arm官网关于动态加载的文章中找到的,那篇文章链接现在失效了,可以在官网里再找找看。原文链接如下:https://developer.arm.com/documentation/ihi0044/h/?lang=en#dynamic-linking
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2023-8-4 20:21:08 | 显示全部楼层
主体程序有什么要求吗?
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2023-8-6 19:16:02 | 显示全部楼层
wswh2o 发表于 2023-8-4 20:21
主体程序有什么要求吗?

无要求
回复

使用道具 举报

13

主题

89

回帖

128

积分

初级会员

积分
128
发表于 2023-8-18 11:37:56 | 显示全部楼层

大佬考虑给IAR IDE出个教程嘛
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2023-9-13 09:28:51 | 显示全部楼层

我已经在mdk环境和gcc环境测试都OK了,不过在你的工程上我只保留了uart、led、sd 这三个外设,你提供的资料帮助很大,非常感谢
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2023-9-13 09:33:54 | 显示全部楼层
kann 发表于 2023-7-14 14:51
使用GCC编译 dl_vector.c 会有stdin、stdout、strerr  initializer element is not constant 的error,这个 ...

函数表这些我都剪掉了,测试的时候自定义简单的就好了,后面有需要在慢慢添加
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2023-9-14 13:44:34 | 显示全部楼层
linuxarmy@163 发表于 2023-9-13 09:28
我已经在mdk环境和gcc环境测试都OK了,不过在你的工程上我只保留了uart、led、sd 这三个外设,你提供的资 ...

恭喜
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2023-9-14 13:59:13 | 显示全部楼层
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2023-9-23 21:44:06 | 显示全部楼层
qq1646544 发表于 2023-8-18 11:37
大佬考虑给IAR IDE出个教程嘛

没用过IAR。。。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-11-15 16:21:19 | 显示全部楼层
必须支持
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2023-11-22 17:52:16 | 显示全部楼层
最近正在研究这个,楼主很不错,超赞
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2024-2-21 16:25:12 | 显示全部楼层
楼主,我编译子程序,base_platform会产生编译warning,提示该选项已被弃用,不知道是否会对动态加载产生影响?

移植后,主程序调用子程序export出来的接口,会卡死在主程序中:
主程序调用如下:
                        err=dl_load_file(&use_handle,"0:module.axf");
                        if (err == DL_NO_ERR)
                        {
                                printf("open module.axf ok\r\n");
                               
                                test_cnt = dl_get_func(&use_handle, "test_cnt");
                                printf("test_cnt func:0x%p\r\n", test_cnt);
                                test_cnt(1000, 1);
                                printf("test_cnt done\r\n");
                               
                               
                                export_func=dl_get_func(&use_handle,"export_func");
                                printf("export_func:0x%p\r\n", export_func);
                                export_func(showtips);
                                printf("export_func done\r\n");
                         }

加载子程序的打印信息:
<<DL_DEBUG>>LOAD segment: 0, 0x00000000, 0x00000274
<<DL_DEBUG>>LOAD segment: 1, 0x00000400, 0x00005228
<<DL_DEBUG>>module size: 22056, vstart_addr: 0x00000000
<<DL_DEBUG>>max_align: 1024
<<DL_DEBUG>>mem_ptr : 0x24006800
<<DL_DEBUG>>entry_addr : 0x24006909
<<DL_DEBUG>>relocate symbol str shndx 2<<DL_DEBUG>>MOVW_ABS_NC:sym_addr:0x24006c00,*sym_addr:0x00000000<<DL_DEBUG>>MOVW_ABS_NC:where:2400690a,*where:0x0400f240,tmp:4400f646<<DL_DEBUG>>relocate symbol str shndx 2<<DL_DEBUG>>R_ARM_THM_MOVT_ABS:sym_addr:0x24006c00,*sym_addr:0x00000000<<DL_DEBUG>>MOVT_ABS:where:24006910,*where:0x0400f2c0,tmp:4400f2c2<<DL_DEBUG>>relocate symbol test shndx 2<<DL_DEBUG>>MOVW_ABS_NC:sym_addr:0x24007000,*sym_addr:0x00000000<<DL_DEBUG>>MOVW_ABS_NC:where:24006974,*where:0x0000f240,tmp:0000f247<<DL_DEBUG>>relocate symbol test shndx 2<<DL_DEBUG>>R_ARM_THM_MOVT_ABS:sym_addr:0x24007000,*sym_addr:0x00000000<<DL_DEBUG>>MOVT_ABS:where:2400697c,*where:0x0000f2c0,tmp:4000f2c2<<DL_DEBUG>>relocate symbol test_cnt.start shndx 2<<DL_DEBUG>>MOVW_ABS_NC:sym_addr:0x2400be20,*sym_addr:0x00000000<<DL_DEBUG>>MOVW_ABS_NC:where:240069d0,*where:0x0500f240,tmp:6520f64b<<DL_DEBUG>>relocate symbol test_cnt.start shndx 2<<DL_DEBUG>>R_ARM_THM_MOVT_ABS:sym_addr:0x2400be20,*sym_addr:0x00000000<<DL_DEBUG>>MOVT_ABS:where:240069de,*where:0x0500f2c0,tmp:4500f2c2<<DL_DEBUG>>relocate symbol test_cnt.total_run shndx 2<<DL_DEBUG>>MOVW_ABS_NC:sym_addr:0x2400be24,*sym_addr:0x00000000<<DL_DEBUG>>MOVW_ABS_NC:where:240069d4,*where:0x0600f240,tmp:6624f64b<<DL_DEBUG>>relocate symbol test_cnt.total_run shndx 2<<DL_DEBUG>>R_ARM_THM_MOVT_ABS:sym_addr:0x2400be24,*sym_addr:0x00000000<<DL_DEBUG>>MOVT_ABS:where:240069e2,*where:0x0600f2c0,tmp:4600f2c2
open module.axf ok
func:__aeabi_memset4
func addr:0x24006803
func:__aeabi_memset8
func addr:0x24006803
func:__semihosting$guard
func addr:0x24006813
func:__aeabi_memclr4
func addr:0x24006815
func:__aeabi_memclr8
func addr:0x24006815
func:__rt_memclr_w
func addr:0x24006815
func:_memset_w
func addr:0x24006819
func:export_func
func addr:0x2400696d
func:test_cnt
func addr:0x240069cd

可以帮忙看看是哪个点出问题了,有什么方向解决吗?
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2024-2-21 16:31:52 | 显示全部楼层
附图是调试信息
dll_gen_issue.png
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2024-2-22 13:32:27 | 显示全部楼层
relax 发表于 2024-2-21 16:31
附图是调试信息

代码中的test_cnt是什么函数?如果里面调用了类似clock()这样的函数,要注意自己是否已经实现这个函数了,如果没实现这个函数,在调用后会跳转到未知的地址,进而卡死。另外如果使用STM32H7的话,要注意ICACHE的处理。
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2024-2-22 15:25:41 | 显示全部楼层
WZH 发表于 2024-2-22 13:32
代码中的test_cnt是什么函数?如果里面调用了类似clock()这样的函数,要注意自己是否已经实现这个函数了 ...

子程序用的是你放到帖子里的工程,test_cnt函数只有做空了,应该不是函数内实现的问题;我用的开发板是STM32H7,但我的主程序工程是none操作系统的,这样能实现动态加载吗?另外ICACHE、DCACHE我disable了
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2024-2-22 20:38:27 | 显示全部楼层
relax 发表于 2024-2-22 15:25
子程序用的是你放到帖子里的工程,test_cnt函数只有做空了,应该不是函数内实现的问题;我用的开发板是ST ...

楼主,现在我工程里面可以动态调用函数了,不过我是裸机环境,子程序中调用的printf、clock等函数,现有的实现方式不行,按您的做法现在是会卡死,裸机环境下的实现您有研究过吗?由于不能使用SVC指令,我的理解应该要自定义管理中断服务程序、中断向量表等

我想的一种简单点的方式是主程序挂载回调函数的方式,提供给子程序调用,实现体还是在主程序中,我还未验证是否可行,即使可行,子程序代码可移植性没那么好

有什么建议提供给我参考吗,感谢
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2024-2-22 23:54:14 | 显示全部楼层
relax 发表于 2024-2-22 15:25
子程序用的是你放到帖子里的工程,test_cnt函数只有做空了,应该不是函数内实现的问题;我用的开发板是ST ...

我帖子里的工程好像有点问题,最好还是用gitee上的工程,另外我能想到的比较简单的方法就是约定一个固定的地址,把app要调用的函数指针以数组的形式存在这个地址里,app通过固定地址加偏移量,获取函数指针进行访问。
回复

使用道具 举报

3

主题

1220

回帖

1229

积分

至尊会员

积分
1229
发表于 2024-2-23 08:34:00 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 21:35 , Processed in 0.433317 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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