在单片机上实现动态加载功能

发布者:心灵之舞最新更新时间:2024-02-23 来源: elecfans关键字:单片机  STM32 手机看文章 扫描二维码
随时随地手机看文章

本项目是一个在单片机(如:STM32)上实现动态加载功能的函数库,与Windows中的dll,Linux中的so类似,可以将代码动态地从其他的存储介质,动态加载到RAM中。


软件架构

本项目文件夹有三个,其中common存储了用于生成可重定位的.axf文件的工程与动态加载器工程交互用的函数,src提供动态加载器的源码,rel_axf_project_template提供了一个简单的可重定位的.axf文件的工程示例,example.c是一个简单的使用示例,所有文件的主要功能如下:

/common/dl_extern_lib.h 描述了app程序用于调用host程序的函数向量表的基地址,以及相关的一些宏定义

/common/dl_stdio_lib.h 描述了app程序调用C库stdio.h中函数时,对应的函数在函数向量表中的索引

/common/dl_stdlib_lib.h 描述了app程序调用C库stdlib.h中函数时,对应的函数在函数向量表中的索引

/common/dl_time_lib.h 描述了app程序调用C库time.h中函数时,对应的函数在函数向量表中的索引

/rel_axf_project_template/app/dl_stdio_lib.c 对于app程序调用到的C库stdio.h中的函数进行重定向

/rel_axf_project_template/app/dl_stdlib_lib.c 对于app程序调用到的C库stdlib.h中的函数进行重定向

/rel_axf_project_template/app/dl_time_lib.c 对于app程序调用到的C库time.h中的函数进行重定向

/src/dl_arch.c 用于进行代码数据重定向与cache刷新,与芯片架构有关

/src/dl_elf.h 用于elf格式文件解码

/src/dl_lib.c 动态加载实现源码

/src/dl_lib.h 动态加载供给应用程序使用的函数

/src/dl_port.c 动态加载主机底层需要实现的函数接口,移植时主要修改的文件

/src/dl_port.h 动态加载主机底层需要实现的函数声明,包含一些宏定义,移植时需要根据自己的芯片修改

/src/dl_vector.c host程序供给app程序使用的函数声明,需要app调用的函数在这里声明

安装教程

首先确定好自己的硬件平台是否适配,目前本程序仅使用了Coretex-M7内核的STMH743单片机进行测试,理论上arm的Coretex-M系列可以直接使用,其他的arm系列芯片可能在重定位指令与Cache的支持的不够好

确定自己的芯片中是否使用了Cache,若使用了Cache,请将/source/host/dl_port.h中的宏定义DL_CACHE_USE置为1

根据自己的软件平台,修改/src/dl_port.c中相关函数的实现,本项目以FatFs文件系统作为例子进行实现,若文件系统不同需要修改函数实现

移植完成后,使用rel_axf_project_template生成app程序的elf文件,默认编译生成的elf文件路径为rel_axf_project_template/Objects/dll_generate.axf

使用诸如fromelf等工具确定生成的elf文件没问题后,就可以愉快的进行动态加载了

使用说明

在代码中首先使用DL_Handler定义一个句柄,类似Windows的dll的句柄

将生成的dll_generate.axf加载到内存中

在代码中包含dl_lib.h头文件,同时使用dl_load_lib将dll_generate.axf文件加载到句柄中同时确任返回值是否为DL_NO_ERR

加载成功后,可使用dl_get_func通过函数名获得库中对应函数的首地址

可使用dl_get_entry直接获得elf文件中的dl_main函数

动态加载的程序执行完成后,可使用dl_destroy_lib释放句柄


关键字:单片机  STM32 引用地址:在单片机上实现动态加载功能

上一篇:RTOS实现双核MCU消息通信
下一篇:直流无刷电机的工作原理及Matlab/Simulink仿真分析

推荐阅读最新更新时间:2024-10-13 17:45

单片机实现三导联远程心电监护系统
1 引 言 随着人们生活水平的提高、生活节奏的加快,心血管疾病的发病率迅速上升,已成为威胁人类身体健康的主要因素之一。而心电图则是治疗此类疾病的主要依据,具有诊断可靠,方法简便,对病人无损害的优点,在现代医学中,变得越来越重要。常规心电图是病人在静卧情况下由心电图仪记录的心电活动,历时仅为几s~1 m,只能获取少量有关心脏状态的信息,所以在有限时间内即使发生心率失常,被发现的概率也是很低的。因此有必要通过相应的监护装置对患者进行长时间的实时监护,记录患者的心电数据。又由于心脏病的发生具有突发性的特点,患者不可能长时间地静卧在医院,但又需实时得到医护人员的监护,所以研发相应的便携式无线心电监护产品就显得更加重要。 目前虽说国内
[单片机]
用<font color='red'>单片机</font>实现三导联远程心电监护系统
使用32位MCU解决RFID智能标签/智能卡系统设计难题
无线射频识别 (RFID) 将成为第一种与条码技术并存并最终将在低成本识别和个人数据存储领域取代条码技术的新兴技术。 与条码技术相比,它具有多种优势,包括: 1.) 可以存储更多数据,2.) 可以在标签中集成一定智能,3.) 可以在一定距离外扫描,以及 4.) 可以减少人为干预。 所有这一切皆因MCU 的使用而成为可能。   EPC 技术对智能标签的影响   在消费层的部署中,下一代标签系统必须发展一种新的复杂级别,以应对新应用和全球互操作性所带来的复杂性。   就像统一产品编码 (UPC) 是条码技术的基本标识一样,一个名为 EPCglobal 的企业联盟也为 RFID 创建了电子产品编码 (EPC)。 EPC 代码为 64
[单片机]
STM32 | 一种简单、实用的测量程序运行时间的方法
前言 平时我们可能很少去关注程序运行的时间,但是在一些情况下可能需要对程序进行一个整体的复盘、优化。 那么,程序运行的时间就是一个可以考虑的方面,可以测一下某些代码块、函数、算法的运行时间,然后整体考虑看看有没有必要进行优化。 之前在某工控类项目中,我就有接到一个任务去测试程序中关键代码的执行时间,并输出报告。当时是使用一个GPIO+示波器进行测试的,也可以使用逻辑分析仪来测。 当时测量的方法很简单: 在要测试的代码块/函数之前设置该GPIO的电平为高电平,在要测试的代码块/函数之后设置该GPIO为低电平,使用示波器测高电平的时间,就知道了这一代码块/函数的运行时间。 下面就通过实例来介绍一下这种简单而有效的方法。
[单片机]
<font color='red'>STM32</font> | 一种简单、实用的测量程序运行时间的方法
单片机c语言教程:运算符和表达式(位运算符)
学过汇编的朋友都知道汇编对位的处理能力是很强的,但是单片机C语言也能对运算对象进行按位操作,从而使单片机C语言也能具有一定的对硬件直接进行操作的能力。位运算符的作用是按位对变量进行运算,但是并不改变参与运算的变量的值。如果要求按位改变变量的值,则要利用相应的赋值运算。还有就是位运算符是不能用来对浮点型数据进行操作的。单片机c语言中共有6种位运算符。位运算一般的表达形式如下: 变量 1 位运算符 变量 2 位运算符也有优先级,从高到低依次是:“~”(按位取反)→“ ”(左移) →“ ”(右 移) →“&”(按位与)→“^”(按位异或)→“|”(按位或) 表 8-1 是位逻辑运算符的真值表,X 表示变量 1,Y 表示变量 2
[单片机]
基于51单片机红外编码解码的C语言程序
当学习键按下后,红外接收头便可将接受到的信号存储到单片机中。在接受到通用遥控器发出的信号后,如果按下发射键,单片机将调出刚刚储存的信息,通过红外发射头发射出和遥控器一样的信号来达到控制的作用。 #include reg52.h #include intrins.h #define uchar unsigned char #define uint unsigned int sbit studylamp=P2^7; sbit lamp=P2^6; sbit studykey=P3^2; sbit remotein=P1^1;
[单片机]
STM32实现电机的正反转
2019年7月22日 今天是做小车过程中的第二天,今天写一下单纯的实现电机的正反转。(但是还是不会实现PWM调速)代码如下: /***********************************************/ .H 代码 #ifndef __MOTOR1_H #define __MOTOR1_H #include “stm32f10x.h” //#include “stm32f10x_gpio.h” #define High 1 //宏定义 高为1 #define Low 0 //宏定义 低为0 #define IN1(a) if (a) GPIO_SetBits(GPIOA,GPIO_Pin_4); //如果真
[单片机]
STM32 USB SD读卡器(SDIO)
这次是做一个SD卡的USB读卡器的功能,我们就在上次NAND Flash模拟出的U盘的工程上修改了,这样的话只要修改一小部分了。 工程的绝大部分不需要修改,只要将fsmc_nand.c文件移除工程,添加上官方的关于SDIO的SD卡的驱动代码文件stm32_eval_sdio_sd.c,我讨厌出现eval,所以将该文件直接改为sdio_sdcard.c。同时,既然我们使用SDIO来驱动SD卡,所以在外设库文件组里要添加stm32_sdio.c文件,否则会出现很多未定错误。 我们接下去修改的就只有mass_mal.c这个文件了。更NAND Flash工程一样,我们改成简洁点: uint32_t Mass_Memory_Si
[单片机]
<font color='red'>STM32</font> USB SD读卡器(SDIO)
车用MCU是从1到N的长期主义过程
汽车产业正在经历着巨大的变革,并体现出高速的增长势头。在这场变革中,背后对应着两个底层逻辑,第一是全球化从1到N的需求;第二,平台化才是性价的保证。兆易创新科技集团股份有限公司汽车产品部负责人何芳指出,一款芯片能否满足客户的需求,取决于这几个阶梯,第一阶梯是可靠性,这是从1到N的关键;第二阶梯是OTA,产品设计时需要定义如何支持未来10-15年汽车性能的OTA功能;第三阶梯是可拓展性,帮助客户更好地实现功能增加;第四阶梯是平台化,这是保证性价比、出口体系的关键一环。 然而,国内企业由于发展历程积累相较国外企业还比较短,同样规格的产品在性价比上优势不高,那要如何找到适合自己的0到1?何芳指出:“首先要了解客户未来在电子电气
[汽车电子]
车用<font color='red'>MCU</font>是从1到N的长期主义过程
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved