搜索
bottom↓
回复: 64

分享:几行代码,在Keil环境下实现动态链接库(原创)

  [复制链接]

出0入0汤圆

发表于 2021-9-7 19:02:12 | 显示全部楼层 |阅读模式
本帖最后由 dog 于 2021-9-7 19:50 编辑

有时,我们的MCU产品需要用到【动态链接库】技术,
【动态链接库】是可以替换的,可以动态从上位机加载。

第一次在Keil上搞动态链接库,
看了一下其它的方法,都太麻烦,有的是要用RT-Thread,有的还说要上Linux,我去。。
经过一番研究,发现其实很简单,共享给大家,造福人类:

首先,我们要设置Keil的链接器参数,
如下图所示,打开Keil中链接器的配置文件,它的扩展名是.sct文件。



编辑该sct文件:
1.在文件中,定义两个Flash映像,这样你编译出来,会产生两个bin件,
即FLASH_MAIN.bin 和 FLASH_DLL.bin,在Keil中,两个文件可以一次烧入MCU。
分成两个文件,可避免Main和DLL之间的【没有用到的空间】也包含bin文件里,
造成bin文件很大,在调试下载时会浪费时间。
另忘了在Keil要用它把HEX转成bin文件用frmelf命令:
fromelf --bin --output "$L..\..\bin\xxxx.bin" "#L"

2. 在文件中定义两个SECION,即MAIN_CODE, 和DLL_CODE。
这样,我们就可以把函数代码放到指定的区域。


  1. ; *************************************************************
  2. ; *** Scatter-Loading Description File generated by uVision ***
  3. ; *************************************************************

  4. LR_IROM1 0x08000000 0x00001000  {    ; 定义你的FLASH_MAIN bin文件区域
  5.   FLASH_MAIN 0x08000000 0x00001000  {  ; 定义主程序的起始地址与空间
  6.    *.o (MAIN_CODE)      ; 定义主程序代码SECTION
  7.    *.o (RESET, +First)  
  8.    *(InRoot$Sections)
  9.    .ANY (+RO)
  10.    .ANY (+XO)
  11.   }

  12.   RW_IRAM1 0x20000000 0x00020000  {  ; RW data
  13.    .ANY (+RW +ZI)
  14.   }
  15. }

  16. LR_IROM2 0x08001000 0x00002000  {   ; 定义你的FLASH_DLL.bin文件区域
  17.   FLASH_DLL  0x08001000 0x00002000  {  ; 定义DLL的起始地址与空间大小
  18.      *.o (DLL_CODE)    ;定义动态库代码SECTION
  19.    }
  20. }
复制代码




  1. // DLL.h文件代码

  2. // 定义动态库要输出的函数类型
  3. typedef void (*TYPE_DLL_FUN1)(void);
  4. typedef int (*TYPE_DLL_FUN2)(int);

  5. // 将常量函数指针声明为external,供其它C模块直接调用。
  6. extern const TYPE_DLL_FUN1 FP_DLLFun1;
  7. extern const TYPE_DLL_FUN2 FP_DLLFun2;

  8. // 声明函数原型,并定义将函数放在指定的DLL_CODE的SECTION中。
  9. void DLLFun1(void) __attribute__((section("DLL_CODE")));
  10. bol DLLFun2(void) __attribute__((section("DLL_CODE")))
复制代码


  1. // DLL.c文件代码

  2. // 在C文件中定义常量指针实例,将其放置在Flash固定地址,并初始化函数指针为函数的真实地址
  3. const TYPE_DLL_FUN1 FP_DLLFun1 __attribute__((at(0x08001000))) = (FP_DLLFun1)DLLFun1;

  4. // 函数体代码
  5. void DLLFun1(void)
  6. {
  7.     ...
  8. }

  9. void DLLFun2(void)
  10. {
  11.     // 这里可通过函数指针直接调用主程序中的函数。
  12.     FP_MainFun1();
  13. }

复制代码


主函数中,向DLL共享函数,也是同样的方法,就不再赘述。
希望我说清楚了。
当然,这些步骤,可以用宏定义来简化,
有什么更好的方法实现动态链接?
希望大家交流指导。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入420汤圆

发表于 2021-9-7 19:08:43 | 显示全部楼层
你这不叫动态链接吧

出0入0汤圆

发表于 2021-9-7 19:21:49 | 显示全部楼层
怎么动态调用呢?

出0入984汤圆

发表于 2021-9-7 19:26:36 | 显示全部楼层
reloc都没呀

出0入0汤圆

 楼主| 发表于 2021-9-7 19:39:56 | 显示全部楼层

太专业,不明白

出0入0汤圆

 楼主| 发表于 2021-9-7 19:40:33 | 显示全部楼层
shiva_shiva 发表于 2021-9-7 19:21
怎么动态调用呢?

刚刚才写完整,再看看

出0入0汤圆

 楼主| 发表于 2021-9-7 19:41:29 | 显示全部楼层
hameyou 发表于 2021-9-7 19:08
你这不叫动态链接吧

可以更新,从上位机动态下载并运行,就是动态库了。

出0入442汤圆

发表于 2021-9-7 22:03:19 来自手机 | 显示全部楼层
lz你这样搞跑user code是ok的,但是中断。。。。

你这套逻辑就是mcu的bootloader干的事,你写的这一堆就是bootloader。。只不过mcu是可以物理上动态切换中断向量的,而你的程序貌似必须得做一个int proxy过去了。

出0入8汤圆

发表于 2021-9-7 22:19:39 来自手机 | 显示全部楼层
不是分散加载吗?还以为啥呢

出100入85汤圆

发表于 2021-9-7 23:40:37 来自手机 | 显示全部楼层
想法不错

出0入8汤圆

发表于 2021-9-7 23:43:32 来自手机 | 显示全部楼层
这个只是分散加载,毕竟动态库是成熟的专有名词,不能随便叫,这个类似于 mcu 常见的内置的 rom libs,所谓的动态更新,也只是更新指定分区的代码功能。并没有实现动态链接。

出870入263汤圆

发表于 2021-9-8 07:58:26 | 显示全部楼层
本帖最后由 armstrong 于 2021-9-8 08:06 编辑

楼主的标题真是言过其实。
你这不叫动态链接技术,只是一个函数地址表而已,是很普通的用法。你这需求别跟动态库扯起来,贻笑大方。
就拿你说的main和dll两部分来说吧:
dll应该随便放在哪个地址都能正确运行;而且dll也携带全局变量,加载时还要为这些变量赋初始值,比如dll代码里写:
int aaa = 85;
那么dll被链接时,aaa变量就应该被初始化,并且地址能被main获得,当然也能被dll访问。
dll要让main透明的访问其函数和变量,在main看来,这些函数和变量就像它自己代码里的一样。
楼主好好地啃一啃《程序员的自我修养:链接、装载与库》,保证让你谦虚一点。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入147汤圆

发表于 2021-9-8 08:17:36 | 显示全部楼层
虽然有点打击楼主的积极性,但还是得说说,这种实现的灵活性太差, 至少要做到不需要定义常量函数指针,才有工程价值

出100入85汤圆

发表于 2021-9-8 08:25:24 来自手机 | 显示全部楼层
这个还是有应用场合的。你做的代码以这种形式提供给对方做二次开发,比直接提供lib安全性好多了

出0入0汤圆

 楼主| 发表于 2021-9-8 08:52:21 | 显示全部楼层
wye11083 发表于 2021-9-7 22:03
lz你这样搞跑user code是ok的,但是中断。。。。

你这套逻辑就是mcu的bootloader干的事,你写的这一堆就是 ...

和中断没关系啊,没有动MSP,也没有动中断向量表。
当然也不能把中断服务函数放在动态库里,也没这个必要。

出0入0汤圆

 楼主| 发表于 2021-9-8 08:54:07 | 显示全部楼层
dreampet 发表于 2021-9-8 08:17
虽然有点打击楼主的积极性,但还是得说说,这种实现的灵活性太差, 至少要做到不需要定义常量函数指针,才 ...

比如,要怎么做?

出15入178汤圆

发表于 2021-9-8 08:56:45 | 显示全部楼层
whatcanitbe 发表于 2021-9-8 08:25
这个还是有应用场合的。你做的代码以这种形式提供给对方做二次开发,比直接提供lib安全性好多了 ...

去掉调试信息的lib拿到了作用也不大了,没有源文件信息。跟这个方式比,编译简单很多

出0入0汤圆

 楼主| 发表于 2021-9-8 08:57:12 | 显示全部楼层
armstrong 发表于 2021-9-8 07:58
楼主的标题真是言过其实。
你这不叫动态链接技术,只是一个函数地址表而已,是很普通的用法。你这需求别跟 ...

哇,好实用的低调。
这种书可能我看不懂

出100入312汤圆

发表于 2021-9-8 08:57:29 | 显示全部楼层
下了一跳,原来是分散加载

出0入0汤圆

 楼主| 发表于 2021-9-8 08:58:15 | 显示全部楼层
jingwaner 发表于 2021-9-7 22:19
不是分散加载吗?还以为啥呢

分散加载又是啥啊?

出0入0汤圆

 楼主| 发表于 2021-9-8 08:59:50 | 显示全部楼层
akey3000 发表于 2021-9-8 08:57
下了一跳,原来是分散加载

明明是分布式加载

出0入24汤圆

发表于 2021-9-8 09:00:24 | 显示全部楼层
感谢分享经验!

出0入0汤圆

 楼主| 发表于 2021-9-8 09:13:38 | 显示全部楼层
security 发表于 2021-9-7 23:43
这个只是分散加载,毕竟动态库是成熟的专有名词,不能随便叫,这个类似于 mcu 常见的内置的 rom libs,所谓 ...

是哪个公司的成熟专有名词啊?
我只是分享了一个简单的办法,不知道离你心中的【动态链接库】差多远。
能不能科普一下,什么是动态链接库?

出870入263汤圆

发表于 2021-9-8 10:19:02 | 显示全部楼层
楼主还沉浸在兴奋当中,就像一年级小孩学会了10以内的加法运算一样高兴。
帖子标题中的“动态链接库”,是一个已经有明确定义的概念,你不知道可以百度啊。
你不知道这个概念却用了这个标题,点进来看的人当然会感觉到落差,才忍不住会纠正一下。

出870入263汤圆

发表于 2021-9-8 10:41:54 | 显示全部楼层
这样吧,基于楼主现有的实现,给楼主出个题:
1、确保在main代码中调用DLLFun1(),先编译一次得到main1.bin和dll1.bin,分别写入芯片;
2、修改DLLFun1()函数,增加对malloc和printf这类库函数的调用(确保第1步代码中没有调用过该库函数),再编译得到dll2.bin;
3、把dll2.bin写入芯片(但不要写main2.bin,因为这是动态加载的目的);
4、等着看奇迹吧。

出0入0汤圆

 楼主| 发表于 2021-9-8 10:48:30 | 显示全部楼层
armstrong 发表于 2021-9-8 10:19
楼主还沉浸在兴奋当中,就像一年级小孩学会了10以内的加法运算一样高兴。
帖子标题中的“动态链接库”,是 ...

你是对的。

出30入54汤圆

发表于 2021-9-8 10:50:29 | 显示全部楼层
楼主的标题有点言过其实,但是换个角度看对于大家也是非常实用的技术,能解决问题
一般认为的动态库会安排上位置无关代码PIC,能任意被加载到自定义地址执行,有些符号表可能还需要加载器动态修改指令来完成加载
我觉得大家没有必要把MCU的执行环境搞得和dll、so这些概念一样,毕竟这玩意第一步的函数名匹配的效率对于MCU来说就显得很奢侈

出0入0汤圆

 楼主| 发表于 2021-9-8 10:51:38 | 显示全部楼层
armstrong 发表于 2021-9-8 10:41
这样吧,基于楼主现有的实现,给楼主出个题:
1、确保在main代码中调用DLLFun1(),先编译一次得到main1.bin ...

本人理解能力有限,没搞懂你说的。

出0入0汤圆

 楼主| 发表于 2021-9-8 10:52:51 | 显示全部楼层
cloudboy 发表于 2021-9-8 10:50
楼主的标题有点言过其实,但是换个角度看对于大家也是非常实用的技术,能解决问题
一般认为的动态库会安排 ...

是的,是个标题党,
确实简单,粗暴,有用。

出0入8汤圆

发表于 2021-9-8 11:38:03 | 显示全部楼层
dog 发表于 2021-9-8 09:13
是哪个公司的成熟专有名词啊?
我只是分享了一个简单的办法,不知道离你心中的【动态链接库】差多远。
能 ...

只能这么说吧:动态链接库,是成名许久的专有名词,也不是某个公司的。

出5入8汤圆

发表于 2021-9-8 11:46:58 | 显示全部楼层
优秀  向楼主学习,向楼主致敬

出0入8汤圆

发表于 2021-9-8 11:53:43 | 显示全部楼层
dog 发表于 2021-9-8 10:52
是的,是个标题党,
确实简单,粗暴,有用。


armstrong 在 24 楼说得对,以为在动态链接库有了新的突破,几行代码就实现了。
点进来,却发现不是。
(对动态链接库有了解同学,想必对楼主的这个技术,是 get 的,因此难免有落差。并不是说楼主的技术 low。只是说专有名词,还是不要乱用。)

出0入0汤圆

 楼主| 发表于 2021-9-8 12:00:41 | 显示全部楼层
security 发表于 2021-9-8 11:53
armstrong 在 24 楼说得对,以为在动态链接库有了新的突破,几行代码就实现了。
点进来,却发现不是。
( ...

应该怎么说?这叫啥?

出0入0汤圆

 楼主| 发表于 2021-9-8 12:01:19 | 显示全部楼层
security 发表于 2021-9-8 11:38
只能这么说吧:动态链接库,是成名许久的专有名词,也不是某个公司的。 ...

我还以为是Microsft的注册商标呢

出0入8汤圆

发表于 2021-9-8 13:00:13 | 显示全部楼层
dog 发表于 2021-9-8 12:00
应该怎么说?这叫啥?

叫什么,这个就不知道了,反正不能叫动态链接库就是了。

给你看一个类似的(MCU 中的 ROM API,只不过人家的 API 是放在 ROM 中,不能更新而已):「痞子衡嵌入式:利用i.MXRT1xxx系列ROM提供的FlexSPI driver API可轻松IAP」

出0入0汤圆

 楼主| 发表于 2021-9-8 13:49:23 | 显示全部楼层
security 发表于 2021-9-8 13:00
叫什么,这个就不知道了,反正不能叫动态链接库就是了。

给你看一个类似的(MCU 中的 ROM API,只不过人 ...

你给的这个链接,我不懂具体环境,不做评价。
你可以说出你心中的动态链接库的标准准,你又不说,但你没权力要求我不能用【动态链接库】这个词吧。
好歹我也开发了几十年的Windows软件,还真不是想蹭这个名词热度,
可能只是机缘巧合,叫了这个名字,本身只是分享一个小技巧。
就像你看到的是分散加载,我看到的,只是抬杠。

出40入42汤圆

发表于 2021-9-8 14:18:03 | 显示全部楼层
可以了解一下:ABI(Application Binary Interface,应用程序二进制接口)

出615入1076汤圆

发表于 2021-9-8 14:20:52 来自手机 | 显示全部楼层
dog 发表于 2021-9-8 12:00
应该怎么说?这叫啥?

既然不動,那就叫 靜態庫 唄,完整是 模塊化免連接靜態庫

出0入0汤圆

 楼主| 发表于 2021-9-8 15:07:30 | 显示全部楼层
dukelec 发表于 2021-9-8 14:20
既然不動,那就叫 靜態庫 唄,完整是 模塊化免連接靜態庫

静态库, 一般是指静态链接库, 是指在链接之前给出的编译过的库.
而这个, 是直接调用可执行, 可替换的机器代码.
Coretex MCU的代码是不可以移动位置的, 因为指令带的是相对偏移地址,
在既没有文件系统, 也没有操作系统的情况下,非要拿来和Windows的动态库比, 那它确实是动不了.

出0入8汤圆

发表于 2021-9-8 15:22:38 | 显示全部楼层
本帖最后由 security 于 2021-9-8 15:27 编辑
dog 发表于 2021-9-8 13:49
你给的这个链接,我不懂具体环境,不做评价。
你可以说出你心中的动态链接库的标准准,你又不说,但你没 ...


不是抬杠,只是讨论(或者类似评审)时的一个建议,最终的采纳权在你。

动态链接库的标准,12 楼,armstrong 同学已经说得很清楚了。

至于那个链接,从那个标题「痞子衡嵌入式:利用i.MXRT1xxx系列ROM提供的FlexSPI driver API可轻松IAP」来管中窥豹一下:
1、芯片原厂在 ROM 中预置了 FlexSPI driver API,
2、我们可以调用 ROM 中的  FlexSPI driver API 实现具体应用(IAP 应用)。
是不是跟你的动态链接库很类似,只是 ROM 始终是 ROM,无法更新。

出615入1076汤圆

发表于 2021-9-8 15:26:39 | 显示全部楼层
本帖最后由 dukelec 于 2021-9-8 15:44 编辑
dog 发表于 2021-9-8 15:07
静态库, 一般是指静态链接库, 是指在链接之前给出的编译过的库.
而这个, 是直接调用可执行, 可替换的机器 ...


所以我說了 免連接

要動起來不需要文件系統,也不需要操作系統,gcc 編譯的時候加 -fPIC 參數(position-independent code),
然後你可以把編譯出來的程序動態拷貝到內存運行(寫入空閒的任意 flash 地址運行也可以)
這段程序可以存放在外部 spi flash、通過 uart 通訊下載、存在內部 flash 等等都行

就算編譯到固定的 ram 地址,然後動態拷貝到內存來運行,至少也算動了一下

出0入0汤圆

 楼主| 发表于 2021-9-8 16:27:09 | 显示全部楼层
dukelec 发表于 2021-9-8 15:26
所以我說了 免連接

要動起來不需要文件系統,也不需要操作系統,gcc 編譯的時候加 -fPIC 參數(position ...

如果是统一放置在一个固定的RAM里, 同样的方法, 那也是可以做到的,
只是步骤多一点, 在RAM里面调试.
但我认为, 动态链接库的(动), 不是指代码放的地方可以动, 存储地点动, 可以实现的, 用一个静的地址间接找,或搜,
本质就是这样.
谢谢大神参与讨论.

出0入0汤圆

 楼主| 发表于 2021-9-8 16:28:26 | 显示全部楼层
security 发表于 2021-9-8 15:22
不是抬杠,只是讨论(或者类似评审)时的一个建议,最终的采纳权在你。

动态链接库的标准 ...

嗯嗯,谢谢.

出0入0汤圆

发表于 2021-9-8 20:42:18 | 显示全部楼层
本帖最后由 wurst 于 2021-9-8 20:44 编辑

我早就在产品中应用此方案了,姑且叫 OS层和 APP层。

OS层:提供底层驱动、抽象层、RTOS等。

APP层:纯应用层。

这样至少有个好处,在做OTA时,更新固件体积极小。

出100入85汤圆

发表于 2021-9-8 21:31:06 | 显示全部楼层
wurst 发表于 2021-9-8 20:42
我早就在产品中应用此方案了,姑且叫 OS层和 APP层。

OS层:提供底层驱动、抽象层、RTOS等。

能不能提供一个可以实验的案例,串口+点灯就行

出0入8汤圆

发表于 2021-9-8 21:37:07 来自手机 | 显示全部楼层
wurst 发表于 2021-9-8 20:42
我早就在产品中应用此方案了,姑且叫 OS层和 APP层。

OS层:提供底层驱动、抽象层、RTOS等。

给你取个名字吧:系统和应用分离。分离的程度彻不彻底呢?

出0入0汤圆

 楼主| 发表于 2021-9-9 08:57:37 | 显示全部楼层
security 发表于 2021-9-8 21:37
给你取个名字吧:系统和应用分离。分离的程度彻不彻底呢?

我觉得叫【硬杠】比较好。
只是单片机系统,你非要杠软件工程理想。

出0入0汤圆

 楼主| 发表于 2021-9-9 08:58:42 | 显示全部楼层
whatcanitbe 发表于 2021-9-8 21:31
能不能提供一个可以实验的案例,串口+点灯就行

你如果看懂了,点个房子都行。

出0入0汤圆

 楼主| 发表于 2021-9-9 08:59:17 | 显示全部楼层
wurst 发表于 2021-9-8 20:42
我早就在产品中应用此方案了,姑且叫 OS层和 APP层。

OS层:提供底层驱动、抽象层、RTOS等。

能不能分享一下你具体操作的办法?

出0入8汤圆

发表于 2021-9-9 09:13:50 | 显示全部楼层
本帖最后由 security 于 2021-9-9 09:32 编辑
dog 发表于 2021-9-9 08:57
我觉得叫【硬杠】比较好。
只是单片机系统,你非要杠软件工程理想。


是你敏感了吧。

那只是很普通的向层主请教的语气,愿闻其详。

编辑新增:
1、层主用了 姑且 二字,所以我帮忙取个应该还算切中命题的名字,有什么不妥吗?
2、分离的程度彻不彻底呢?这只在是请教问题(如果带有感情色彩去看,那没招),这关系到好不好用,是这种方案的最大参考评价标准了吧,好用的话,层主又愿意开源分享的,大家都受益,也没什么不妥吧?

出0入0汤圆

 楼主| 发表于 2021-9-9 09:49:32 | 显示全部楼层
security 发表于 2021-9-9 09:13
是你敏感了吧。

那只是很普通的向层主请教的语气,愿闻其详。

你要拿出自己的观点,要达到哪些?才是你心中的彻底。
别引用大神的话,或搬出自己读过的书,凡尔赛似的。
你要质疑或讨论,就把你的要求 一点一点列出来。
否则,你只是在否定别人的,让自己有存在感。

另外,这只是一个简单实用的办法,是否纯净,完美无暇,那要看你自己了。
你非要来扛文字艺术,还给我这贴子取名字,拜托。

出0入0汤圆

发表于 2021-9-9 09:52:10 | 显示全部楼层
LZ善于动脑和思考这点是值得肯定的,但这个实现方式与大家普遍认知的动态链接库还是有不小区别的。
打个比方,嵌入式环境就像自行车,LZ开动脑筋,给这自行车装了4个轮子,并且能骑行,于是告诉大家我实现了嵌入式“汽车”。
呃……于是大家觉得,这叫4轮自行车、4轮人力车等等都可以,也挺有创意,但它肯定不是汽车。

出0入8汤圆

发表于 2021-9-9 09:59:18 | 显示全部楼层
dog 发表于 2021-9-9 09:49
你要拿出自己的观点,要达到哪些?才是你心中的彻底。
别引用大神的话,或搬出自己读过的书,凡尔赛似的 ...


没给你取名字的,那只是给层主的姑且,献丑取一个而已。

我已经至少 7、8 年没弄这玩意了(也懒得去回顾),只是这个评价标准是关键的,一直留在心底,
这边只是看到已经实现的可行方案,有兴趣,就跟很早以前有一个坛友,说的影子函数,但是他不细说分享,很遗憾。

你太敏感了。感觉你要是参加一个评审会议的话,估计会跟人干架。

出0入0汤圆

 楼主| 发表于 2021-9-9 10:17:39 | 显示全部楼层
security 发表于 2021-9-9 09:59
没给你取名字的,那只是给层主的姑且,献丑取一个而已。

我已经至少 7、8 年没弄这玩意了(也懒得去回顾 ...

你又扯远了,打住。

出0入0汤圆

 楼主| 发表于 2021-9-9 10:20:00 | 显示全部楼层
jathenal 发表于 2021-9-9 09:52
LZ善于动脑和思考这点是值得肯定的,但这个实现方式与大家普遍认知的动态链接库还是有不小区别的。
打个比 ...

我赞同你,不过。
然后拿出一个神仙一样的比喻。
这是一个技术贴。

出0入0汤圆

发表于 2021-9-9 16:43:50 | 显示全部楼层
楼主的这套, 其实对于单片ARM这些很实用了.
如果我没记错, nrf系列蓝牙固件就是这样搞的.
很实用.

至于完全动态, 甚至文件这样的形式, 可以对芯片的要求就不一样.
如果没有linux,  上一些重的RTOS, 也没必要
所以要点个赞!

出0入0汤圆

发表于 2021-9-16 17:02:57 来自手机 | 显示全部楼层
arm支持变量和代码位置无关。主要是全局变量起始位置,我记得编程规范应该是用r9传递。代码入口位置一般是通过头部描述段解析,上位机那套是用字符串匹配,对单片机是个笨重操作,虽然只是载入时用到,总感觉风格错位,还有访问变量要反复切换r9内容跳转变量空间。
一段没有main的代码包含全局变量可以编译成lib,编译时指定地址。也可以不指定地址编译成dll,在main载入加载段也就是生成的bin,通过解析头部描述字段动态分配执行段也就是代码和变量空间,提取出函数入口表也就指针,后面再用。   跟楼主静态库比是动态分配代码和变量的空间以及解析提取入口。。。   编译器生成的原始输出文件就含丰富信息,可以直接当dll载入用,mdk提取烧写算法文件就类似这样用法,但是非常庞大笨重,更实用还是生成bin里附一个描述头,将解析工作简化。反正这种笨重用法对单片机用途不大,楼主位分割指派空间是更实用,lib和main空间分割,分割空间不是新大陆,有些单片机内嵌外设库就这样。

出0入0汤圆

发表于 2021-9-16 17:06:49 来自手机 | 显示全部楼层
nxp好像是有些内嵌了boot flash操作函数?就是楼主这样

出0入0汤圆

 楼主| 发表于 2021-9-17 09:52:09 | 显示全部楼层
huangqi412 发表于 2021-9-16 17:06
nxp好像是有些内嵌了boot flash操作函数?就是楼主这样

是的,这种方法,也可以让应用部分调用Boot中的函数。
又不会增加太多开销。

出0入0汤圆

发表于 2023-6-16 11:33:08 | 显示全部楼层
在硬汉那边有位博主已经实现了动态加载,可以看看去;链接:https://www.armbbs.cn/forum.php? ... p;extra=&page=1

出0入0汤圆

发表于 2023-6-16 20:11:47 | 显示全部楼层
落叶知秋 发表于 2021-9-8 14:18
可以了解一下:ABI(Application Binary Interface,应用程序二进制接口)
(引用自37楼)

大佬,Beremiz 编译下载app到控制器上是不是动态加载模块技术呀

出40入42汤圆

发表于 2023-6-17 14:41:34 | 显示全部楼层
rrc 发表于 2023-6-16 20:11
大佬,Beremiz 编译下载app到控制器上是不是动态加载模块技术呀
(引用自61楼)

Beremiz原版带OS的(Win、Linux),是以动态库的形式加载用户逻辑程序(app)的

我在本论坛发的基于stm32f103单片机的,不属于动态库形式,倒是有点类似静态加载,
上位机(ide)编译和下位机(runtime)加载约定了一个共同的地址,存储一些入口函数指针来实现runtime和app之间的资源相互调用

出0入0汤圆

发表于 2023-6-20 11:42:58 | 显示全部楼层

感谢分享经验 thank you

出100入85汤圆

发表于 2023-6-20 23:37:54 来自手机 | 显示全部楼层
落叶知秋 发表于 2023-6-17 14:41
Beremiz原版带OS的(Win、Linux),是以动态库的形式加载用户逻辑程序(app)的

我在本论坛发的基于stm32f10 ...

(引用自62楼)

哪个链接?

出0入0汤圆

发表于 2023-6-21 14:42:06 | 显示全部楼层
落叶知秋 发表于 2023-6-17 14:41
Beremiz原版带OS的(Win、Linux),是以动态库的形式加载用户逻辑程序(app)的

我在本论坛发的基于stm32f10 ...
(引用自62楼)

谢谢大佬解惑,最近在研究动态加载模块和beremiz的编译流程,您发表的几个贴子我都看过了,beremiz资料应该是全网最详细的,很强!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 03:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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