rt-thread学习一:导出自己的命令到msh命令列表中

yuanguanghui yuanguanghui     2023-04-04     289

关键词:

RT-Thread简介,摘自RT-Thread官网www.rt-thread.org:

RT-Thread是一个集实时操作系统(RTOS)内核、中间件组件和开发者社区于一体的技术平台,由熊谱翔先生带领并集合开源社区力量开发而成,RT-Thread也是一个组件完整丰富、高度可伸缩、简易开发、超低功耗、高安全性的物联网操作系统。RT-Thread具备一个IoT OS平台所需的所有关键组件,例如GUI、网络协议栈、安全传输、低功耗组件等等。经过11年的累积发展,RT-Thread已经拥有一个国内最大的嵌入式开源社区,同时被广泛应用于能源、车载、医疗、消费电子等多个行业,累积装机量超过两千万台,成为国人自主开发、国内最成熟稳定和装机量最大的开源RTOS。

RT-Thread拥有良好的软件生态,支持市面上所有主流的编译工具如GCC、Keil、IAR等,工具链完善、友好,支持各类标准接口,如POSIX、CMSIS、C++应用环境、Javascript执行环境等,方便开发者移植各类应用程序。商用支持所有主流MCU架构,如ARM Cortex-M/R/A, MIPS, X86, Xtensa, C-Sky, RISC-V,几乎支持市场上所有主流的MCU和Wi-Fi芯片。

 RT-Thread的学习基于正点原子的潘多拉IoT Board物联网开发板STM32L475,板上集成了ST-Link V2.1调试器,方便程序下载和调试。同时具有丰富的外设,如SDIO WIFI模块,TFT显示屏,音频解码芯片,六轴传感器,温湿度传感器,贴片电机等。可用于物联网及RT-Thread的入门学习。板子的上手指南可以参考https://www.rt-thread.org/document/site/tutorial/quick-start/iot_board/quick-start/。

FinSH是 RT-Thread 的命令行组件(shell),通过RT-Thread配置使用MSH(module shell)模式时,FinSH 与传统 shell(dos/bash)执行方式一致,例如,可以通过 cd / 命令将目录切换至根目录。

msh 通过解析,将输入字符分解成以空格区分开的命令和参数。其命令执行格式如下所示:

command [arg1] [arg2] [...]

其中 command 既可以是 RT-Thread 内置的命令,也可以是可执行的文件。

FinSH 内置命令

在 RT-Thread 中默认内置了一些 FinSH 命令,在 FinSH 中输入 help 后回车或者直接按下 Tab 键,就可以打印当前系统支持的所有命令。C-Style 和 msh 模式下的内置命令基本一致,这里就以 msh 为例。

msh 模式下,按下 Tab 键后可以列出当前支持的所有命令。默认命令的数量不是固定的,RT-Thread 的各个组件会向 FinSH 输出一些命令。例如,当打开 DFS 组件时,就会把 ls,cp,cd 等命令加到 FinSH 中,方便开发者调试。

以下为按下 Tab 键后打印出来的当前支持的所有显示 RT-Thread 内核状态信息的命令,左边是命令名称,右边是关于命令的描述:

RT-Thread shell commands:
version - show RT-Thread version information
list_thread - list thread
list_sem - list semaphore in system
list_event - list event in system
list_mutex - list mutex in system
list_mailbox - list mail box in system
list_msgqueue - list message queue in system
list_timer - list timer in system
list_device - list device in system
exit - return to RT-Thread shell mode.
help - RT-Thread shell help.
ps - List threads in the system.
time - Execute command with time.
free - Show the memory usage in the system.
这里列出输入常用命令后返回的字段信息,方便开发者理解返回的信息内容。

自定义 msh 命令

自定义的 msh 命令,可以在 msh 模式下被运行,将一个命令导出到 msh 模式可以使用如下宏接口:

MSH_CMD_EXPORT(name, desc);

参数 描述
name 要导出的命令
desc 导出命令的描述
这个命令可以导出有参数的命令,也可以导出无参数的命令。导出无参数命令时,函数的入参为 void,示例如下:

void hello(void)

rt_kprintf("hello RT-Thread! ");


MSH_CMD_EXPORT(hello , say hello to RT-Thread);
导出有参数的命令时,函数的入参为 int argc 和 char**argv。argc 表示参数的个数,argv 表示命令行参数字符串指针数组指针。导出有参数命令示例如下:

static void atcmd(int argc, char**argv)

……


MSH_CMD_EXPORT(atcmd, atcmd sample: atcmd <server|client>);
 

更为详细的FINSH和MSH介绍可参考官方文档https://www.rt-thread.org/document/site/programming-manual/finsh/finsh/。

知道了怎么添加自定义的MSH命令后,我们试着添加一个命令,如打印cpu时钟信息的命令:

/* 系统时钟信息查看 */
void clockinfo(void)

volatile uint32_t rcc_cr = RCC->CR; //读取RCC_CR寄存器值
rt_kprintf("RCC_CR:%#X. ",rcc_cr);

/* System Clock source */
if(__HAL_RCC_GET_SYSCLK_SOURCE()==RCC_SYSCLKSOURCE_STATUS_MSI)

rt_kprintf("SYSCKL source: MSI. ");

else if(__HAL_RCC_GET_SYSCLK_SOURCE()==RCC_SYSCLKSOURCE_STATUS_HSI)

rt_kprintf("SYSCKL source: HSI. ");

else if(__HAL_RCC_GET_SYSCLK_SOURCE()==RCC_SYSCLKSOURCE_STATUS_HSE)

rt_kprintf("SYSCKL source: HSE. ");

else if(__HAL_RCC_GET_SYSCLK_SOURCE()==RCC_SYSCLKSOURCE_STATUS_PLLCLK)

rt_kprintf("SYSCKL source: PLL. ");


/* PLL Clock source */
if (__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSI)

/* PLL source is HSI oscillator */
rt_kprintf("PLL source:HSI oscillator. ");

else if (__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSE)

/* PLL source is HSE bypass oscillator */
rt_kprintf("PLL source:HSE bypass oscillator. ");

else if (__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_MSI)

/* PLL source is MSI oscillator */
rt_kprintf("PLL source:MSI oscillator. ");


/* Clock Frequency */
rt_kprintf("SystemClockFreq:%lu. ",HAL_RCC_GetSysClockFreq());
rt_kprintf("HCLKFreq:%lu. ",HAL_RCC_GetHCLKFreq());
rt_kprintf("PCLK1Freq:%lu. ",HAL_RCC_GetPCLK1Freq());
rt_kprintf("PCLK2Freq:%lu. ",HAL_RCC_GetPCLK2Freq());

/* Peripheral Clock Frequency */ //各个外设时钟频率
rt_kprintf("RTC ClockFreq:%lu. ",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_RTC)); //RTC
rt_kprintf("ADC ClockFreq:%lu. ",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_ADC)); //ADC
rt_kprintf("I2C1 ClockFreq:%lu. ",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C1));//I2C1
rt_kprintf("I2C2 ClockFreq:%lu. ",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C2));//I2C2
rt_kprintf("I2C3 ClockFreq:%lu. ",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C3));//I2C3
rt_kprintf("LPTIM1 ClockFreq:%lu. ",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_LPTIM1)); //LPTIM1
rt_kprintf("LPTIM2 ClockFreq:%lu. ",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_LPTIM2)); //LPTIM2
rt_kprintf("LPUART1 ClockFreq:%lu. ",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_LPUART1));//LPUART1
rt_kprintf("RGN ClockFreq:%lu. ",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_RNG)); //RNG
rt_kprintf("SAI1 ClockFreq:%lu. ",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SAI1));//SAI1
rt_kprintf("SDMMC1 ClockFreq:%lu. ",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SDMMC1)); //SDMMC1
rt_kprintf("SWPMI1 ClockFreq:%lu. ",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SWPMI1)); //SWPMI1
rt_kprintf("USART1 ClockFreq:%lu. ",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_USART1)); //USART1
rt_kprintf("USART2 ClockFreq:%lu. ",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_USART2)); //USART2
rt_kprintf("USART3 ClockFreq:%lu. ",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_USART3)); //USART3
rt_kprintf("UART4 ClockFreq:%lu. ",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_UART4)); //UART4
rt_kprintf("UART5 ClockFreq:%lu. ",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_UART5)); //UART5
rt_kprintf("USB ClockFreq:%lu. ",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_USB)); //USB

/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(clockinfo, display system clock info);
 也可以使用别名导出,这样函数名和命令名可以不一致:

MSH_CMD_EXPORT_ALIAS(clockinfo,showclock, display system clock info.);
这样导出后可以使用命令showclock执行时钟信息查看命令。在MSH命令行界面按TAB键查看命令列表,可以看到导出的命令及其帮助信息。
————————————————
版权声明:本文为CSDN博主「yangsmithcool123」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yangsmithcool123/java/article/details/88022647

一起学习下rt-thread的c语言编码规范(代码片段)

作者:架构师李肯前言最近博主在学习RT-Thread这个开源项目,开始慢慢学习和理解它的开源代码,慢慢开始接触了它的代码规范。我个人认为,参与一个开源项目的第一步,就是要好好理解它的规范,其中... 查看详情

社区人物志专访马龙伟:轮子不好用,那就自己造!

Hi~RT-Thread社区开发者们:【社区人物志】是RT-Thread社区推出的新栏目,人物志将关注每一个对RT-Thread社区做出过贡献的小伙伴,会定期从RT-Thread社区小伙伴中选出一位活跃的开发者进行专访,分享开发者们与RT-Thre... 查看详情

学习分享记录开源小白的第一次pr(代码片段)

本文由RT-Thread论坛用户@yanlineng原创发布:https://club.rt-thread.org/ask/article/5a3155877b44066c.html大家好,我是一枚开源小白。之前没有过开源经历,没有实际体验过开源过程,也没有参加过开源活动。凭借好奇和学习... 查看详情

学习分享记录开源小白的第一次pr(代码片段)

本文由RT-Thread论坛用户@yanlineng原创发布:https://club.rt-thread.org/ask/article/5a3155877b44066c.html大家好,我是一枚开源小白。之前没有过开源经历,没有实际体验过开源过程,也没有参加过开源活动。凭借好奇和学习... 查看详情

一起学习下rt-thread的c语言编码规范(代码片段)

作者:架构师李肯前言最近博主在学习RT-Thread这个开源项目,开始慢慢学习和理解它的开源代码,慢慢开始接触了它的代码规范。我个人认为,参与一个开源项目的第一步,就是要好好理解它的规范,其中... 查看详情

学习如何学习emacs

此时你应该看到help菜单里有一项快速教程,过一遍自带教程,打开教程可以从菜单里面选,毕竟是第一次,知识匮乏,不要嫌丢人。看教程时跟着做,不用担心自己记不住里面的所有内容,因为一般凡人都无法第一次就全部记... 查看详情

再来学习一下rt-thread的软件架构|文末赠书5本《软件架构实践》

再来学习一下RT-Thread的软件架构摘要:学习和使用了RT-Thread有2年多了的时间,最近一直在研究开源项目Matter相关的软件架构设计,趁此机会,再来温习一下rt-thread的软件架构设计。文章目录1写在前面2RT-Thread的软... 查看详情

rt-thread学习笔记--rt-thread内存管理学习总结

RT-Thread内存管理学习总结在单片机芯片上,如果不考虑出厂固化的ROM空间的话,通常开发者能接触到的存储空间主要分两种:掉电可保存数据的片内FLASH和掉电不可保存数据的片内RAM。片内RAM(通常理解为内存ÿ... 查看详情

rt-thread移植与使用笔记(代码片段)

RT-Thread移植笔记最近工作需要重新捡起rtt使用.之前使用的时候都是智能车比赛要求使用,用的也是逐飞科技移植好的工程,我自己都没有移植过.后来工作需要时发现自己一点都不懂,一脸懵逼.折磨一遍后再回顾,感觉其实也挺简单... 查看详情

rt-thread移植与使用笔记(代码片段)

RT-Thread移植笔记最近工作需要重新捡起rtt使用.之前使用的时候都是智能车比赛要求使用,用的也是逐飞科技移植好的工程,我自己都没有移植过.后来工作需要时发现自己一点都不懂,一脸懵逼.折磨一遍后再回顾,感觉其实也挺简单... 查看详情

linux字符模式下的ls命,怎么样才可以看到没显示的部份

...A那是因为列表太长了,显示不下的原因。你可以把列表导出到txt文件文件来查看。sudodir>1.txt导出到1.txt在文件系统下写东西需要加sudo,否则可能没有权限。 参考技术Bls-a就会显示所有的文件或文件夹。 参考技术C上...[lrj@hostlr... 查看详情

课后任务

1,学习文件操作命令,完成以下任务:a,切换到自己的主目录,在自己的主目录下创建d文件夹,然后d下创建d2,d3两个文件夹;b,切换到d2文件夹下创建一个空文件f2,然后将他重命名为f3;c,将f3拷贝到d下,然后再将d下的f3剪切到d3下... 查看详情

rt-thread多串口调试

文章目录前言一、遇到的困难(UART1串口中断无法进入)二、发现问题三、解决问题1.修改FinSH1.1配置STM32CubeMX1.2修改Kconfig文件1.3打开ENV进行设置2.配置串口2四、代码部分前言本人大三通信工程小白一枚,近期学习RTOS&#... 查看详情

rt-thread学习笔记如何优雅地退出qemu模拟器(代码片段)

本文由RT-Thread论坛用户@recan原创发布:https://club.rt-thread.org/ask/article/3136.html1问题场景相信很多人也跟我一样,刚接触RT-Thread不久,正在学习RT-Thread的路上,然而学习一款嵌入式实时操作系统,没有一个硬件... 查看详情

rt-thread移植与使用笔记(代码片段)

RT-Thread移植笔记最近工作需要重新捡起rtt使用.之前使用的时候都是智能车比赛要求使用,用的也是逐飞科技移植好的工程,我自己都没有移植过.后来工作需要时发现自己一点都不懂,一脸懵逼.折磨一遍后再回顾,感觉其实也挺简单... 查看详情

周虽旧邦,其命维新(学习日志)

闲话说到学习,小时候根深蒂固的被灌输的一些习惯真的是害死人。例如,某些人经过刻苦学习取得某某成就。大多学生不经过思辨就真的这样认为了,既然痛苦那就愉快的玩耍吧。其实这就如同历史书上的故事,不管你信不信... 查看详情

学习linux命令的正确姿势

...套这样的课程,来帮助想学或者正在学Linux命令的同学。学习命令百度一下就好?有些人可能会说,现在互联网这么发达,碰到要用什么命令,直接某度一搜不就什么都有了吗?我在直播的时候,也经常有小伙伴提出这样的疑问... 查看详情

rt-thread多串口调试

文章目录前言一、遇到的困难(UART1串口中断无法进入)二、发现问题三、解决问题1.修改FinSH1.1配置STM32CubeMX1.2修改Kconfig文件1.3打开ENV进行设置2.配置串口2四、代码部分前言本人大三通信工程小白一枚,近期学习RTOS&#... 查看详情