完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
简介
RT-Thread 动态模块组件 dlmodule 提供了动态加载程序模块的机制。dlmodule 组件更多的是一个 ELF 格式加载器,把单独编译的一个 elf 文件的代码段,数据段加载到内存中,并对其中的符号进行解析,绑定到内核导出的 API 地址上。动态模块 elf 文件主要放置于 RT-Thread 下的文件系统上。 RT-Thread 的动态模块组件目前支持两种格式:
动态模块组件部分源代码编译当前只支持 GNU GCC 工具链编译,暂不支持 MDK 或者 IAR。 使能动态模块组件 配置工程 在 Env 控制台切换到 qemu-vexpress-a9 BSP 根目录,然后输入 menuconfig 命令打开配置菜单。 进入“ RT-Thread Components → POSIX layer and C standard library”菜单,按下图箭头所示打开 libc 和动态模块的配置选项。 进入“RT-Thread Components → Device virtual file system”菜单打开文件系统的配置选项。退出 menuconfig 并保存配置。 编译工程 使用 scons 命令编译工程。 运行动态模块命令 编译完成后使用 qemu.bat 命令运行工程。按 Tab 键查看所有命令可以看到动态模块的两个命令 list_module 和 list_symbols,表明动态模块组件配置成功。
生成动态模块编译依赖环境 关闭运行的程序,在 Env 控制台使用 scons --target=ua -s 命令生成编译动态模块时需要包括的内核头文件搜索路径及全局宏定义。 运行动态模块 运行最简单的动态模块 创建动态模块 获取示例 下载 RT-Thread 动态模块工具库 rtthread-apps,rtthread-apps 的 tools 目录放置了编译动态模块需要使用到的 Python 和 SConscript 脚本。hello 目录下的 main.c 是一个简单的动态模块使用示例,源代码如下所示。 #include 设置环境变量 在 Env 控制台切换到 rtthread-apps 根目录(目录所在全路径不包含空格和中文字符),然后通过下面 2 条命令设置环境变量。
编译动态模块 使用 scons --app=hello 命令编译动态模块。 在 rtthread-apps/hello 目录下会生成动态模块文件 hello.mo。 将动态模块放入文件系统 编译好的动态模块 hello.mo 需要放到文件系统下。qemu-vexpress-a9 BSP 会使用一个虚拟的 sd 卡设备 sd.bin,我们需要把动态模块放到这个虚拟的 sd 卡里面。对于物理设备来说,直接将动态模块添加到文件系统管理的存储设备中就可以。这里需要使用到 Env 工具里面的一个小工具 fatdisk,它位于 Env 的 tools 目录下,里面也提供了一份 fatdisk 的使用说明。这里使用 fatdisk 用于把 PC 上本地的一个目录转换成 sd.bin 映像文件,这个映像文件是做为一个 fat 文件系统而存在。 新建目录 在 fatdisk 目录下新建一个 sd 目录,并复制刚刚编译的动态模块 hello.mo 文件到 sd 目录。 修改配置文件 按照下面的配置修改 fatdisk 目录下的配置文件 fatdisk.xml。
在 Env 控制台切换到 fatdisk 根目录,运行 fatdisk 命令则会按照配置文件 fatdisk.xml 中的配置,把里面指定的目录转换成 flash 映像文件。 运行成功则会在 fatdisk 目录生成一个 sd.bin 文件,大小为 5MB。 生成的映像文件 sd.bin 需要复制到 qemu-vexpress-a9 BSP 目录。 运行动态模块 在 Env 控制台切换到 qemu-vexpress-a9 BSP 根目录输入 qemu.bat 命令运行工程。
动态模块的初始化和清理函数 动态模块组件提供了2个扩展的函数供用户使用,分别是module_init()和module_cleanup()。
示例代码 基于前面简单的动态模块示例代码 main.c 增加module_init()和module_cleanup()函数的使用,示例代码如下所示。 #include
运行结果 在 Env 控制台切换到 qemu-vexpress-a9 BSP 根目录输入 qemu.bat 命令运行工程。
创建动态库 获取示例 下载 RT-Thread 动态模块工具库 rtthread-apps,rtthread-apps 的 lib 目录下有一个简单的动态库示例的 lib.c,源代码如下所示,它实现了 2 个简单的函数供使用。 #include 编译动态库之前需要先设置环境变量。然后使用 scons --lib=lib 命令编译动态库。 在 rtthread-apps/lib 目录下会生成动态库文件 lib.so。 请参考前面小节将动态库文件 lib.so 放到文件系统里,并将生成的映像文件 sd.bin 复制到 qemu-vexpress-a9 BSP 目录。 运行动态库 添加示例代码 将以下示例代码添加到 qemu-vexpress-a9 BSP applications 目录下的 main.c 里。 #include 运行动态库 在 Env 控制台切换到 qemu-vexpress-a9 BSP 根目录,输入 scons 命令重新编译工程。编译完成后输入 qemu.bat 命令运行工程。按 Tab 键可以看到新增的示例代码命令 dlmodule_Sample。 使用 ls 命令可以看到根目录下的动态库文件 lib.so,输入 dlmodule_sample 命令就可以运行动态库示例代码。
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1033 浏览 0 评论
2877 浏览 0 评论
图腾柱PFC无法上升至400V,且电感电流为正弦波形,但是幅值极小
9386 浏览 0 评论
飞凌嵌入式ElfBoard-Vim编辑器之静态链接和动态链接
2898 浏览 0 评论
使用 LinkBoy 将程序导出为 C 语言代码并烧录至 Arduino ESP32 开发板
2302 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 21:48 , Processed in 0.722362 second(s), Total 72, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2323