当前位置: 首页 > news >正文

STM32 - Embedded IDE - GCC - rt_thread_nano的终端msh>不工作的排查与解决

导言


解决方案来自该csdn博文:https://blog.csdn.net/a183635870/article/details/126556614

明明在board.c已经实现了函数rt_hw_console_output()rt_hw_console_getchar(),但是终端msh>没有正常工作。
在这里插入图片描述

一、解决方案


在这里插入图片描述

    /* section information for finsh shell */. = ALIGN(4);__fsymtab_start = .;KEEP(*(FSymTab))__fsymtab_end = .;. = ALIGN(4);__vsymtab_start = .;KEEP(*(VSymTab))__vsymtab_end = .;. = ALIGN(4);/* section information for initial. */. = ALIGN(4);__rt_init_start = .;KEEP(*(SORT(.rti_fn*)))__rt_init_end = .;

在这里插入图片描述
如上所示,重新编译程序。
在这里插入图片描述
如上所示,终端msh>恢复正常了!

二、问题根源


2.1、FSymTab与VSymTab

RT-Thread的finsh shell系统依赖于符号表机制来发现和执行命令。当你使用宏如MSH_CMD_EXPORT、FINSH_FUNCTION_EXPORT等导出命令时,这些宏会将命令信息存储在特定的段中:

  1. FSymTab段 - 存储函数符号表
  2. VSymTab段 - 存储变量符号表

链接脚本的作用
这段代码:

	/* section information for finsh shell */. = ALIGN(4);__fsymtab_start = .;KEEP(*(FSymTab))__fsymtab_end = .;. = ALIGN(4);__vsymtab_start = .;KEEP(*(VSymTab))__vsymtab_end = .;. = ALIGN(4);

起到了关键作用:

  1. 定义符号表边界:__fsymtab_start__fsymtab_end标记函数符号表的开始和结束位置
  2. 收集符号:KEEP(*(FSymTab))确保所有FSymTab段的内容都被保留在链接后的可执行文件中
  3. 提供地址引用:RT-Thread在运行时通过这些符号来遍历所有注册的命令

RT-Thread如何使用这些符号
从源码可以看到,在shell.cfinsh_system_init()函数中:
在这里插入图片描述
系统会调用这些函数来初始化符号表,让shell知道有哪些命令可用。

为什么没有这段代码会失败
如果链接脚本中没有定义这些段和符号:

  1. 符号丢失:链接器可能会丢弃FSymTab和VSymTab段的内容
  2. 边界未定义:__fsymtab_start等符号未定义,导致RT-Thread无法找到符号表
  3. 命令无法注册:所有通过MSH_CMD_EXPORT等宏导出的命令都无法被发现
  4. shell无法工作:msh>提示符出现,但输入任何命令都会提示"command not found"
    这就是为什么添加这段代码后RT-Thread的msh>终端就能正常工作了!

2.2、.rti_fn*

还有最后一段

    /* section information for initial. */. = ALIGN(4);__rt_init_start = .;KEEP(*(SORT(.rti_fn*)))__rt_init_end = .;

这段代码同样是不可缺少的,它与RT-Thread的自动初始化系统密切相关。删除这段代码会导致msh>无法正常工作:
RT-Thread自动初始化系统的工作原理

  1. RT-Thread使用一套自动初始化机制,通过宏来自动注册初始化函数:
  2. INIT_BOARD_EXPORT(fn) - 板级初始化
  3. INIT_DEVICE_EXPORT(fn) - 设备初始化
  4. INIT_COMPONENT_EXPORT(fn) - 组件初始化
  5. INIT_ENV_EXPORT(fn) - 环境初始化
  6. INIT_APP_EXPORT(fn) - 应用初始化

这段代码的作用是:

  1. 收集初始化函数:KEEP(*(SORT(.rti_fn*)))收集所有.rti_fn段的内容
  2. 按优先级排序:SORT()确保初始化函数按正确的顺序执行
  3. 定义边界符号:__rt_init_start__rt_init_end标记初始化函数表的边界

2.3、总结

总结:

  • 第一段代码(FSymTab/VSymTab)负责命令发现和注册
  • 第二段代码(.rti_fn*)负责系统自动初始化

两者缺一不可,共同保证RT-Thread系统的正常运行!


文章转载自:

http://iscMSjuM.ppbrq.cn
http://2s68FQXI.ppbrq.cn
http://0wZV7lwh.ppbrq.cn
http://m74BHYZR.ppbrq.cn
http://GGiJsYqR.ppbrq.cn
http://iVWBIEAb.ppbrq.cn
http://a6hQ9acO.ppbrq.cn
http://hYmqXMlB.ppbrq.cn
http://3gBlNfnH.ppbrq.cn
http://YZFL9z8O.ppbrq.cn
http://6uy96HXB.ppbrq.cn
http://KYL87gVD.ppbrq.cn
http://ShjPd6bR.ppbrq.cn
http://dWsPr1Qa.ppbrq.cn
http://Ax63hwUN.ppbrq.cn
http://9CO9CPSa.ppbrq.cn
http://XaeOw3rq.ppbrq.cn
http://tkJyaq7u.ppbrq.cn
http://dhfoVwDG.ppbrq.cn
http://yS86Il7r.ppbrq.cn
http://xnUY1qM6.ppbrq.cn
http://Bsjmnvg1.ppbrq.cn
http://wiuSKFDH.ppbrq.cn
http://5vPhtIwB.ppbrq.cn
http://NcFKofy5.ppbrq.cn
http://yGpQgSSo.ppbrq.cn
http://Gn2p8zYa.ppbrq.cn
http://tROY4nO4.ppbrq.cn
http://0BftjDh9.ppbrq.cn
http://Ef8AvMkc.ppbrq.cn
http://www.dtcms.com/a/373955.html

相关文章:

  • 房屋安全鉴定报告有效期多久
  • Redux的使用
  • 深入理解 Redis:特性、应用场景与实践指南
  • Linux应用(3)——进程控制
  • (Arxiv-2025)MOSAIC:通过对应感知的对齐与解缠实现多主体个性化生成
  • 制造业多数据库整合实战:用 QuickAPI 快速生成 RESTful API 接入 BI 平台
  • outOfMemory内存溢出
  • Pandas数据结构(DataFrame,字典赋值)
  • 谈谈对this的理解
  • CVE-2025-2502 / CNVD-2025-16450 联想电脑管家权限提升漏洞
  • 用 Trae 玩转 Bright Data MCP 集成
  • CiaoTool 批量钱包 多对多转账实战:跨链应用全解析
  • Decision Tree Model|决策树模型
  • 由浅及深:扫描电子显微镜(Scanning Electron Microscope,SEM)
  • CTFHub靶场之SSRF Gopher POST请求(python脚本法)
  • OpenWrt | 在 PPP 拨号模式下启用 IPv6 功能
  • 代码随想录算法训练营第六天 - 哈希表2 || 454.四数相加II / 383.赎金信 / 15.三数之和 / 18.四数之和
  • Java 中 wait 与 notify 的详解:线程协作的关键机制
  • Linux下编译Gmsh
  • api-ms-win-crt-runtime-l1-0.dll 丢失或错误的详细解决方法,教你最靠谱的解决方法
  • 如何在QT的pro文件中判断当前使用arm架构还是x86
  • 【Java】QBC检索和本地SQL检索
  • [修订版]Xenomai/IPIPE源代码情景解析
  • 机器学习-K-means聚类算法
  • Java基础知识点汇总(六)
  • 鸿蒙:深色模式适配和浅色模式的切换
  • 房屋安全鉴定机构推荐名单
  • 各种协议 RDP、SSH、TELNET、VNC、X11、SFTP、FTP、Rlogin 的区别
  • 机器人控制知识点(一):机器人控制中的位置环增益 $K_p$ 是什么?
  • 米勒平台开通和关断过程分析