pokemonds
发表于 2022-10-16 15:57:46
我用的就是gitee上的试了不行,不过我另外新建的工程可以了。想问下这个应用程序还能仿真吗?毕竟仿真是单片机开发的优势之一啊。
WZH
发表于 2022-10-17 15:11:43
pokemonds 发表于 2022-10-16 15:57
我用的就是gitee上的试了不行,不过我另外新建的工程可以了。想问下这个应用程序还能仿真吗?毕竟仿真是单 ...
你指的仿真是仿真调试吗?这个目前应该还不能调试,没研究过这个
denike
发表于 2022-10-19 17:14:21
虽然看不懂,但是觉得很厉害
deerdda
发表于 2022-11-24 11:25:44
谢谢分享,
lenghonglin
发表于 2022-11-24 17:13:29
一定要用keil编译吗? gcc不行?
WZH
发表于 2022-11-24 17:20:42
lenghonglin 发表于 2022-11-24 17:13
一定要用keil编译吗? gcc不行?
程序分为两部分,一部分是用于加载程序的动态加载器,这部分可以用任何平台编译。
另一部分是被动态加载的程序,这部分使用Keil编译的,因为本文中的生成用于动态加载的程序利用了Keil的链接器的部分特性。如果gcc有这部分特性的话,当然可以用gcc编译,只不过需要自己研究一下相关的编译器与链接器手册。
lenghonglin
发表于 2022-11-28 18:15:11
WZH 发表于 2022-11-24 17:20
程序分为两部分,一部分是用于加载程序的动态加载器,这部分可以用任何平台编译。
另一部分是被动态加载 ...
之前一直想了解这部分,都没看啥好的资料,。我搞个keil来研究下
WZH
发表于 2022-11-28 21:57:12
lenghonglin 发表于 2022-11-28 18:15
之前一直想了解这部分,都没看啥好的资料,。我搞个keil来研究下
期待你成功{:34:}
zhumx
发表于 2023-5-31 10:45:38
版主你好,你发的教程里动态加载的实现,使用RAM空间较小的MCU能实现吗,比如stm32l431 64kRAM。是不是app代码不能写的太大,因为程序是加载到RAM中运行的?
WZH
发表于 2023-6-2 10:00:48
zhumx 发表于 2023-5-31 10:45
版主你好,你发的教程里动态加载的实现,使用RAM空间较小的MCU能实现吗,比如stm32l431 64kRAM。是不是app ...
没错,是在ram中运行的。单个app的代码写的太大确实会装载不下,像这种情况可以把一个大的app拆成多个小的来加载。
morning_enr6U
发表于 2023-6-2 11:07:11
楼主还活跃在这个帖子,{:34:}
WZH
发表于 2023-6-8 12:50:09
morning_enr6U 发表于 2023-6-2 11:07
楼主还活跃在这个帖子,
{:34:}
linuxarmy@163
发表于 2023-6-15 19:10:10
lenghonglin 发表于 2022-11-24 17:13
一定要用keil编译吗? gcc不行?
可以用GCC-ARM-NONE-EABI 编译器试一下,需要自己写.ld文件,.ld文件也可以借助STM32CUBE IDE 配置生成,然后再根据楼主.sct文件改改就好了
linuxarmy@163
发表于 2023-6-16 19:34:54
发现大多数都是基于操作系统实现动态加载,裸机上可以吗?比如while不停的扫描存放elf文件的flash区域,扫描到就开始动态加载
WZH
发表于 2023-6-17 13:48:22
linuxarmy@163 发表于 2023-6-16 19:34
发现大多数都是基于操作系统实现动态加载,裸机上可以吗?比如while不停的扫描存放elf文件的flash区域,扫 ...
这个就是在裸机上实现的,不需要任何操作系统。
linuxarmy@163
发表于 2023-6-19 17:25:23
WZH 发表于 2023-6-17 13:48
这个就是在裸机上实现的,不需要任何操作系统。
很强,最近也在研究这个,可以少走很多弯路
WZH
发表于 2023-6-20 19:20:02
linuxarmy@163 发表于 2023-6-19 17:25
很强,最近也在研究这个,可以少走很多弯路
好,祝你成功{:34:}
WZH
发表于 2023-6-20 19:20:07
linuxarmy@163 发表于 2023-6-19 17:25
很强,最近也在研究这个,可以少走很多弯路
好,祝你成功{:34:}
kann
发表于 2023-7-14 14:51:22
使用GCC编译 dl_vector.c 会有stdin、stdout、strerrinitializer element is not constant 的error,这个问题有人遇到过吗
WZH
发表于 2023-7-14 22:22:08
kann 发表于 2023-7-14 14:51
使用GCC编译 dl_vector.c 会有stdin、stdout、strerrinitializer element is not constant 的error,这个 ...
这几个变量和编译器有关,我这个只适用于arm clang编译器
wswh2o
发表于 2023-7-21 18:37:22
sxw101320 发表于 2021-12-5 18:06
牛,之前做国网产品的时候,国网提供的操作系统就是动态加载app,知道是rtt的lwp模块,但是一直没有弄清楚 ...
这种要mmu支持
awell18
发表于 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,有相关资料去了解吗
谢谢~期待你的回复
WZH
发表于 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
wswh2o
发表于 2023-8-4 20:21:08
主体程序有什么要求吗?
WZH
发表于 2023-8-6 19:16:02
wswh2o 发表于 2023-8-4 20:21
主体程序有什么要求吗?
无要求
qq1646544
发表于 2023-8-18 11:37:56
WZH 发表于 2023-8-6 19:16
无要求
大佬考虑给IAR IDE出个教程嘛
linuxarmy@163
发表于 2023-9-13 09:28:51
WZH 发表于 2023-6-20 19:20
好,祝你成功
我已经在mdk环境和gcc环境测试都OK了,不过在你的工程上我只保留了uart、led、sd 这三个外设,你提供的资料帮助很大,非常感谢
linuxarmy@163
发表于 2023-9-13 09:33:54
kann 发表于 2023-7-14 14:51
使用GCC编译 dl_vector.c 会有stdin、stdout、strerrinitializer element is not constant 的error,这个 ...
函数表这些我都剪掉了,测试的时候自定义简单的就好了,后面有需要在慢慢添加
WZH
发表于 2023-9-14 13:44:34
linuxarmy@163 发表于 2023-9-13 09:28
我已经在mdk环境和gcc环境测试都OK了,不过在你的工程上我只保留了uart、led、sd 这三个外设,你提供的资 ...
恭喜{:34:}
银色的月亮鱼
发表于 2023-9-14 13:59:13
{:8:}{:8:}{:8:}
WZH
发表于 2023-9-23 21:44:06
qq1646544 发表于 2023-8-18 11:37
大佬考虑给IAR IDE出个教程嘛
没用过IAR。。。
dapan
发表于 2023-11-15 16:21:19
{:8:}必须支持
Bcabbage
发表于 2023-11-22 17:52:16
最近正在研究这个,楼主很不错,超赞
relax
发表于 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
可以帮忙看看是哪个点出问题了,有什么方向解决吗?
relax
发表于 2024-2-21 16:31:52
附图是调试信息
WZH
发表于 2024-2-22 13:32:27
relax 发表于 2024-2-21 16:31
附图是调试信息
代码中的test_cnt是什么函数?如果里面调用了类似clock()这样的函数,要注意自己是否已经实现这个函数了,如果没实现这个函数,在调用后会跳转到未知的地址,进而卡死。另外如果使用STM32H7的话,要注意ICACHE的处理。
relax
发表于 2024-2-22 15:25:41
WZH 发表于 2024-2-22 13:32
代码中的test_cnt是什么函数?如果里面调用了类似clock()这样的函数,要注意自己是否已经实现这个函数了 ...
子程序用的是你放到帖子里的工程,test_cnt函数只有做空了,应该不是函数内实现的问题;我用的开发板是STM32H7,但我的主程序工程是none操作系统的,这样能实现动态加载吗?另外ICACHE、DCACHE我disable了
relax
发表于 2024-2-22 20:38:27
relax 发表于 2024-2-22 15:25
子程序用的是你放到帖子里的工程,test_cnt函数只有做空了,应该不是函数内实现的问题;我用的开发板是ST ...
楼主,现在我工程里面可以动态调用函数了,不过我是裸机环境,子程序中调用的printf、clock等函数,现有的实现方式不行,按您的做法现在是会卡死,裸机环境下的实现您有研究过吗?由于不能使用SVC指令,我的理解应该要自定义管理中断服务程序、中断向量表等
我想的一种简单点的方式是主程序挂载回调函数的方式,提供给子程序调用,实现体还是在主程序中,我还未验证是否可行,即使可行,子程序代码可移植性没那么好
有什么建议提供给我参考吗,感谢
WZH
发表于 2024-2-22 23:54:14
relax 发表于 2024-2-22 15:25
子程序用的是你放到帖子里的工程,test_cnt函数只有做空了,应该不是函数内实现的问题;我用的开发板是ST ...
我帖子里的工程好像有点问题,最好还是用gitee上的工程,另外我能想到的比较简单的方法就是约定一个固定的地址,把app要调用的函数指针以数组的形式存在这个地址里,app通过固定地址加偏移量,获取函数指针进行访问。
morning_enr6U
发表于 2024-2-23 08:34:00
{:34:}{:8:}