目录

【STM32H750】玩转ART-Pi(一)——使用STM32CUBMX生成TouchGFX工程
【STM32H750】玩转ART-Pi(二)——制作MDK的外部QSPI-FLASH烧录算法
【STM32H750】玩转ART-Pi(三)——如何在ART-PI上创建TouchGFX工程
【STM32H750】玩转ART-Pi(四)——添加文件系统
【STM32H750】玩转ART-Pi(五)——添加网络功能
【STM32H750】玩转ART-Pi(六)——添加FTP服务器
【STM32H750】玩转ART-Pi(七)——TouchGFX从文件系统中读取图片
【STM32H750】玩转ART-Pi(八)——添加动态模块

实验平台:

硬件: RT-Thread官方ART-PI H750开发版
软件: RT-Thread Studio 1.1.5

代码下载:

演示代码下载地址:https://download.csdn.net/download/sinat_31039061/13196914

联系作者:

加我微信,备注“加群”,加入技术交流群

动态模块简介

在传统桌面操作系统中,用户空间和内核空间是分开的,应用程序运行在用户空间,内核以及内核模块则运行于内核空间,其中内核模块可以动态加载与删除以扩展内核功能。dlmodule 则是 RT-Thread 下,在内核空间对外提供的动态模块加载机制的软件组件。在 RT-Thread v3.1.0 以前的版本中,这也称之为应用模块(Application Module),在 RT-Thread v3.1.0 及之后,则回归传统,以动态模块命名。

dlmodule 组件更多的是一个 ELF 格式加载器,把单独编译的一个 elf 文件的代码段,数据段加载到内存中,并对其中的符号进行解析,绑定到内核导出的 API 地址上。动态模块 elf 文件主要放置于 RT-Thread 下的文件系统上。
动态模块为 RT-Thread 提供了动态加载程序模块的机制,因为也独立于内核编译,所以使用方式比较灵活。从实现上讲,这是一种将内核和动态模块分开的机制,通过这种机制,内核和动态模块可以分开编译,并在运行时通过内核中的模块加载器将编译好的动态模块加载到内核中运行。

在 RT-Thread 的动态模块中,目前支持两种格式:

  • .mo 则是编译出来时以 .mo 做为后缀名的可执行动态模块;它可以被加载,并且系统中会自动创建一个主线程执行这个动态模块中的 main 函数;同时这个 main(int argc, char**argv) 函数也可以接受命令行上的参数。
  • .so 则是编译出来时以 .so 做为后缀名的动态库;它可以被加载,并驻留在内存中,并提供一些函数集由其他程序(内核里的代码或动态模块)来使用。

当前 RT-Thread 支持动态模块的架构主要包括 ARM 类架构和 x86 架构,未来会扩展到 MIPS,以及 RISC-V 等架构上。RT-Thread 内核固件部分可使用多种编译器工具链,如 GCC, ARMCC、IAR 等工具链;但动态模块部分编译当前只支持 GNU GCC 工具链编译。因此编译 RT-Thread 模块需下载 GCC 工具,例如 CodeSourcery 的 arm-none-eabi 工具链。一般的,最好内核和动态模块使用一样的工具链进行编译(这样不会在 libc 上产生不一致的行为)。另外,动态模块一般只能加载到 RAM 中使用,并进行符号解析绑定到内核导出的 API 地址上,而不能基于 Flash 直接以 XIP 方式运行(因为 Flash 上也不能够再行修改其中的代码段)。

官方动态模块文档介绍:https://www.rt-thread.org/document/site/programming-manual/dlmodule/dlmodule/

添加动态模块

  1. 新建工程

  2. 打开动态模块

  3. 在rtconfig.py 中设置动态模块编译时需要用到的配置参数

M_CFLAGS = CFLAGS + ' -mlong-calls -fPIC '
M_CXXFLAGS = CXXFLAGS + ' -mlong-calls -fPIC'
M_LFLAGS = DEVICE + CXXFLAGS + ' -Wl,--gc-sections,-z,max-page-size=0x4' +\' -shared -fPIC -nostartfiles -nostdlib -static-libgcc'
M_POST_ACTION = STRIP + ' -R .hash $TARGET\n' + SIZE + ' $TARGET \n'
M_BIN_PATH = r'E:\qemu-dev310\fatdisk\root'

相关的解释如下:

  • M_CFLAGS - 动态模块编译时用到的 C 代码编译参数,一般此处以 PIC 方式进行编译(即代码地址支持浮动方式执行);
  • M_CXXFLAGS - 动态模块编译时用到的 C++ 代码编译参数,参数和上面的 M_CFLAGS 类似;
  • M_LFLAGS - 动态模块进行链接时的参数。同样是 PIC 方式,并且是按照共享库方式链接(部分链接);
  • M_POST_ACTIOn - 动态模块编译完成后要进行的动作,这里会对 elf 文件进行 strip 下,以减少 elf 文件的大小;
  • M_BIN_PATH - 当动态模块编译成功时,对应的动态模块文件是否需要复制到统一的地方;

  1. 添加符号表
    内核固件也会通过 RTM(function) 的方式导出一些函数 API 给动态模块使用,这些导出符号可以在 msh 下通过命令:
    list_symbols
    列出固件中所有导出的符号信息。dlmodule 加载器也是把动态模块中需要解析的符号按照这里导出的符号表来进行解析,完成最终的绑定动作。
    这段符号表会放在一个专门的,名字是 RTMSymTab 的 section 中,所以对应的固件链接脚本也需要保留这块区域,而不会被链接器优化移除掉。可以在链接脚本中添加对应的信息:
/* section information for modules */
. = ALIGN(4);
__rtmsymtab_start = .;
KEEP(*(RTMSymTab))
__rtmsymtab_end = .;

然后在工程目录下执行一下命令:scons --target=ua -s,来生成编译动态模块时需要包括的内核头文件搜索路径及全局宏定义。

5. 编译下载
打开map文件,可以看到导出的符号表

在 msh 下通过list_symbols命令,可以查看导出的API列表:

编译动态模块

在 github 上有一份独立仓库: rtthread-apps ,这份仓库中放置了一些和动态模块,动态库相关的示例。
其目录结构如下:

可以把这份 git clone 到本地,然后在命令行下以 scons 工具进行编译,如果是 Windows 平台,推荐使用 RT-Thread/ENV 工具。

进入控制台命令行后,进入到这个 rtthread-apps repo 所在的目录(同样的,请保证这个目录所在全路径不包含空格,中文字符等字符),并设置好两个变量:

  • RTT_ROOT - 指向到 RT-Thread 代码的根目录;
  • BSP_ROOT - 指向到 BSP 的工程目录;

Windows 下可以使用 (例如本工程):

添加文件系统

参考【STM32H750】玩转ART-Pi(四)——添加文件系统

运行hello.mo

把编译出来的hello.mo文件拷贝到文件系统中,然后运行它:

关注公众号,后续有精彩内容会第一时间发送给您!

【STM32H750】玩转ART-Pi(八)——添加动态模块相关推荐

  1. 用Canvas为网页添加动态背景

    用Canvas为网页添加动态背景 作者:uedtianji 最近刚刚接到为微信公众帐号"玩转三里屯"制作首页的任务.考虑到页面只在手机中浏览,而且手机对canvas的支持又非常好, ...

  2. 如何html中添加动态图片,把动态图片添加到视频画面中 视频添加自定义动态图片 视频加动态logo...

    我前面也编写过关于视频添加动态图片的教程.前面所说的给是视频添加的动态图片是软件中自带的素材,虽然软件中带的动态图片种类繁多,但是不外乎有些时候软件中并没有我们要用的动态图片,这个时候我们就需要重外部 ...

  3. 通通玩blend美工(8)——动态绘制路径动画,画出个萌妹子~

    通通玩blend美工(8)--动态绘制路径动画,画出个萌妹子~ 原文:通通玩blend美工(8)--动态绘制路径动画,画出个萌妹子~ 2年前我在玩Flex的时候就一直有一个疑问,就是如何来实现一个蚊香 ...

  4. 手机怎么用外嵌字幕_怎么给视频添加动态歌词字幕?原来用微信就能完成,涨知识了...

    现在很多人都喜欢玩音乐短视频,像抖音,就是一个音乐视频的平台.如果我们想要给视频添加字幕或者是动态的歌词效果需要怎么制作呢?其实,用微信就可以完成这一系列的操作,如果你不相信的话,那就一起来看看吧! ...

  5. 怎么给视频添加动态歌词字幕?原来用微信就能完成,涨知识了

    现在很多人都喜欢玩音乐短视频,像抖音,就是一个音乐视频的平台.如果我们想要给视频添加字幕或者是动态的歌词效果需要怎么制作呢?其实,用微信就可以完成这一系列的操作,如果你不相信的话,那就一起来看看吧! ...

  6. ArcGIS JS先添加动态图层,再添加切片图层后不显示

    场景: 现在要在一个地图上添加动态服务图层和切片服务图层,当创建好图层之后,使用map.addLayer()方法,先把动态图层加到地图上,再把切片图层加到地图上,出现一个现象:只能看到加载的动态图层, ...

  7. Qt Creator添加动态dynamics

    Qt Creator添加动态 添加动态 制作动画 添加连接 加States 添加动态 您可以为UI组件的属性设置动画,并在它们之间创建连接以使它们能够相互通信. 制作动画 您可以在"时间轴& ...

  8. vue 分享微信传参_vue实现微信分享链接添加动态参数的方法

    微信分享时 分享链接携带参数可能不是固定的 需要在分享的前一刻才知道 这里就是动态设置分享链接的基本写法 代码不是那么详尽 但大致流程如下 1.安装引用jssdk npm install --save ...

  9. js 给动态li添加动态点击事件

    一.给动态li添加动态点击事件 试了网上的on,live,bind绑定,都不起作用.最后看到https://bbs.csdn.net/topics/390414057 上的代码.试了一遍,demo o ...

  10. Android使用Opengl录像时添加(动态)水印

    最近需要开发一个类似行车记录仪的app,其中需要给录制的视频添加动态水印.我使用的是OpenGL开发的,刚开始实现的是静态水印,后面才实现的动态水印. 先上效果图,左下角的是静态水印,中间偏下的是时间 ...

最新文章

  1. BootStrap网格布局
  2. wireshark使用教程 linux,Linux入门教程:ubuntu下安装wireshark(以及配置非root),这个强大的工具可以捕...
  3. html语言对齐是什么意思,html – 对齐RTL语言的元素
  4. Linux文件查看/编辑方法介绍
  5. mybatisPlus中的updateById无法更新null值的字段
  6. LeetCode - Easy - 191. Number of 1 Bits
  7. Android 第一篇
  8. python队列怎么用_如何在Python中使用多处理队列? - python
  9. delphi 实现屏幕旋转代码_代码检查 | 如何用Processing实现3D世界
  10. ESXi 5.1 安装 Mac OSX Lion 10.7
  11. linux 停止仿真命令,如何通过命令行关闭Android模拟器
  12. python super().__init__()参数_python类中super()和__init__()的区别
  13. 通过Discuz!搭建一个主题社区
  14. JAVA压缩、解压,使用Apache Common Compress包下载链接
  15. Mybatis 返回Map数据
  16. 奇瑞新能源硬实力 全铝车身奇瑞大蚂蚁
  17. java web学习_JavaWeb学习路线
  18. Python 生成微信头图
  19. bos平台 Java_Bos平台修改发布业务单元的jdk版本
  20. android 4.2 dropbox,android 下用脚本备份文档到dropbox的实现

热门文章

  1. java der 解码_JAVA解析各种编码密钥对(DER、PEM、openssh公钥)
  2. MAUI 跨平台应用开发实战
  3. 【附源码】计算机毕业设计java音乐鉴赏网站前端开发设计与实现
  4. php strtok函数,strtok函数的使用示例
  5. 技术美术面试问题总结——数字天空
  6. syslinux linux 启动盘,syslinux启动盘制作
  7. 微信公众号配置失败问题解决方法
  8. Eclipse中文版的,怎么变成英文版
  9. 批处理文件——BAT学习
  10. 感觉丧的时候,读一读曾国藩