RT-Thread学习一:导出自己的命令到MSH命令列表中
Posted yuanguanghui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RT-Thread学习一:导出自己的命令到MSH命令列表中相关的知识,希望对你有一定的参考价值。
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学习一:导出自己的命令到MSH命令列表中的主要内容,如果未能解决你的问题,请参考以下文章
RT-Thread学习笔记 --RT-Thread内存管理学习总结
如何在 CGAL 中将三角测量对象(Constrained_Delaunay_triangulation_2)保存到文件(vtk、vtu、msh 等)