Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread动态模块
发布于 2025-03-19 15:26:13 浏览:24
订阅该版
[tocm] # 动态模块简介 >动态模块是 RT-Thread 的一个重要特性,它允许在运行时动态加载和卸载模块,从而实现模块的热插拔。 ## 版本支持 RT-Thread 3.1.0 及以上版本支持。 ## 模块类型 RT-Thread 的动态模块有两种: - mo:可以被加载,系统中会自动创建一个主线程执行这个动态模块中的 main 函数 - so:可以被加载,驻留在内存中,提供一些函数由其它程序来调用 # 动态模块编译 ## 编译固件 当要在系统中使用动态模块时,需要先编译一份支持动态模块的固件。 RT-Thread 项目中提过了非常多的硬件BSP:https://github.com/RT-Thread/rt-thread/tree/master/bsp - 使用 menuconfig 打开如下配置: ```c RT-Thread Components ---> POSIX layer and C standard library ---> [*] Enable dynamic module with dlopen/dlsym/dlclose featur ``` ```c RT-Thread Components ---> Device virtual file system ---> [*] Using device virtual file system ``` - BSP 对应的 rtconfig.py 中设置动态模块编译时需要用到的配置参数: ```c # 动态模块编译时用到的 C 代码编译参数,一般此处以 PIC 方式进行编译 M_CFLAGS = CFLAGS + ' -mlong-calls -fPIC ' # 动态模块编译时用到的 C++ 代码编译参数 M_CXXFLAGS = CXXFLAGS + ' -mlong-calls -fPIC' # 动态模块进行链接时的参数,同样是 PIC 方式,并且是按照共享库方式链接 M_LFLAGS = DEVICE + CXXFLAGS + ' -Wl,--gc-sections,-z,max-page-size=0x4' +\' -shared -fPIC -nostartfiles -nostdlib -staticlibgcc' # 动态模块编译完成后要进行的动作 M_POST_ACTION = STRIP + ' -R .hash $TARGET\n' + SIZE + ' $TARGET \n' # 当动态模块编译成功时,对应的动态模块文件放置的位置 M_BIN_PATH = r'/apps/dev/bsp/qemu-dev310/fatdisk/root' ``` - 在 BSP 工程目录下使用 scons 生成固件: 安装 scons:pip install scons ```c # 生成编译动态模块时需要包括的内核头文件搜索路径及全局宏定义 > scons --target=ua -s ``` # 编译动态模块 下载 rtthread-apps:https://github.com/RT-Thread/rtthread-apps ##目录结构 cxx:在动态模块中使用 C++ 进行编程的示例 - hello:hello world 示例 - lib:动态库示例 - md5:文件 md5 值 - tools:编译动态模块时需要用到的 Python / SConscript 脚本 - ymodem:通过串口以 YModem 协议下载文件到文件系统上 - coremark:MCU/CPU 性能测试小工具 - devicetest:硬件测试 - memperf:内存测试软件包 ## 环境变量 - RTT_ROOT:指向到 RT-Thread 代码的根目录 - BSP_ROOT:指向到 BSP 的工程目录 ## 编译 编译 mo: `> scons --app=hello` 编译成功后,它会在 rtthread-apps/hello 目录下生成 hello.mo 文件。 - 编译 so: `> scons --lib=lib` 编译成功后,它会在 rtthread-apps/lib 目录下生成 lib.so 文件。 # 动态模块使用 ## 执行 我们可以把这些 mo 文件放到 RT-Thread 文件系统上,在 msh 中: ```c msh />hello msh />Hello, world ``` ## 加载 RT-Thread 提供的动态模块 API 来加载或卸载动态模块: ```c // 加载动态模块 struct rt_dlmodule *dlmodule_load(const char* pgname); // 执行动态模块 struct rt_dlmodule *dlmodule_exec(const char* pgname, const char* cmd, int cmd_size); // 退出动态模块 void dlmodule_exit(int ret_code); // 查找动态模块 struct rt_dlmodule *dlmodule_find(const char *name); // 返回动态模块 struct rt_dlmodule *dlmodule_self(void); // 查找符号 rt_uint32_t dlmodule_symbol_find(const char *sym_str); ``` RT-Thread 也支持 POSIX 标准的 libdl API 来加载或卸载动态模块: ```c #include
// 打开动态库 void * dlopen (const char * pathname, int mode); // 查找符号 void* dlsym(void *handle, const char *symbol); // 关闭动态库 int dlclose (void *handle); ```
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
jinchanchan
这家伙很懒,什么也没写!
文章
12
回答
0
被采纳
0
关注TA
发私信
相关文章
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
rt-smart
RTC
FAL
I2C_IIC
ESP8266
UART
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
GD32
定时器
ADC
flashDB
编译报错
socket
中断
rt_mq_消息队列_msg_queue
Debug
keil_MDK
SFUD
msh
ulog
C++_cpp
MicroPython
本月问答贡献
lchnu
3
个答案
2
次被采纳
张世争
1
个答案
2
次被采纳
a1012112796
9
个答案
1
次被采纳
三世执戟
8
个答案
1
次被采纳
crystal266
4
个答案
1
次被采纳
本月文章贡献
jinchanchan
9
篇文章
13
次点赞
ssdd45555
3
篇文章
2
次点赞
聚散无由
1
篇文章
4
次点赞
rvcore
1
篇文章
1
次点赞
lvdongchina
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部