使用STM32运行RTT动态模块

发布于 2020-07-14 22:17:43

平台:正点原子H7开发板

参考文章

动态模块
使用 QEMU 运行动态模块组件

过程记录

编译过程分两部分,1 编译能支持动态模块的固件,2 编译动态模块

  • 首先,根据参考文章中的说明,编译支持运行动态模块的固件,主要是开启动态模块的支持和开启SD卡的驱动,因为最终编译的动态模块需要在文件系统中。进入到bsp目录,使用env工具配置如下:
    image.png
    image.png
    为了支持动态模块的运行,修改 bsp 对应的 rtconfig.py 中编译动态模块时需要用到的配置参数,拷贝参考文章中的参数如下:
    image.png
    编译的固件中会导出符号表供动态模块使用,放在名字是 RTMSymTab 的段中,连接脚本中添加相关信息,如下图:
    image.png
    执行 scons 编译,出现错误如下,这是因为刚刚赋值到python脚本中的参数使用了TAB键
    image.png
    将TAB键修改为空格,保存,再次编译,出现如下错误,脚本中没有 strip 命令
    image.png
    添加命令,保存,
    image.png
    再次编译
    image.png
    编译成功,生成bin文件。执行 scons --target=ua -s 来生成编译动态模块时需要包括的内核头文件搜索路径及全局宏定义
    将bin文件下载到开发板,运行
    image.png
    可以看到,SD卡挂载成功,动态模块对应的命令也正确生成。
  • 编译动态模块
    首先下载动态模块资源库,进入到对应目录设置如下变量:
    RTT_ROOT - 指向到 RT-Thread 代码的根目录;
    BSP_ROOT - 指向到 BSP 的工程目录;
    image.png
    然后,执行 scons --app=hello 出现如下错误
    image.png
    可以看出,错误的原因是命令行参数中没有空格,导致不能识别,修改python脚本中的相应命令参数。
    在参数' -mlong-calls -fPIC'前加空格,保存重新编译,出现 puts 未定义,这个函数应该是libc组件中的啊,前面配置了的,为什
    么显示未定义呢?
    image.png
    在串口控制台中执行命令 list_symbols 打印导出的符号
    image.png
    符号明明导出了啊!!!为什么不识别呢???
    经过各种测试最终发现,每个参数的前面都加一个空格就好了!
    image.png
    再次编译,终于出现动态模块的.mo文件了。
    image.png
    设置输出目录也有了
    image.png
    将生成的文件拷贝到SD卡中,重新上电
    image.png
    终于打印出来了。

总结:

  1. 折腾的比较久的地方就是 puts 未定义这个错误,实际上从脚本中可以看出,参数之间都有空格的。
  2. 调试过程中会产生 hello.exe 文件,这个是环境变量RTT_ROOT和BSP_ROOT未设置对。
    image.png
  3. 动态模块现在只支持gcc编译,所有的操作都在env环境下,编译器用的就是gcc。
2 条评论

发布
问题