【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!\n");
}

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.\r\n",rcc_cr);
  
  /* System Clock source */
  if(__HAL_RCC_GET_SYSCLK_SOURCE()==RCC_SYSCLKSOURCE_STATUS_MSI)
  {
    rt_kprintf("SYSCKL source: MSI.\r\n");
  }
  else if(__HAL_RCC_GET_SYSCLK_SOURCE()==RCC_SYSCLKSOURCE_STATUS_HSI)
  {
    rt_kprintf("SYSCKL source: HSI.\r\n");
  }
  else if(__HAL_RCC_GET_SYSCLK_SOURCE()==RCC_SYSCLKSOURCE_STATUS_HSE)
  {
    rt_kprintf("SYSCKL source: HSE.\r\n");
  }
  else if(__HAL_RCC_GET_SYSCLK_SOURCE()==RCC_SYSCLKSOURCE_STATUS_PLLCLK)
  {
    rt_kprintf("SYSCKL source: PLL.\r\n");
  }
  
  /* PLL Clock source */
  if (__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSI)
  {
    /* PLL source is HSI oscillator */
    rt_kprintf("PLL source:HSI oscillator.\r\n");
  }
  else if (__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSE)
  {
    /* PLL source is HSE bypass oscillator */
    rt_kprintf("PLL source:HSE bypass oscillator.\r\n");
  }
  else if (__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_MSI)
  {
    /* PLL source is MSI oscillator */
    rt_kprintf("PLL source:MSI oscillator.\r\n");
  }
  
  /* Clock Frequency */
  rt_kprintf("SystemClockFreq:%lu.\r\n",HAL_RCC_GetSysClockFreq());
  rt_kprintf("HCLKFreq:%lu.\r\n",HAL_RCC_GetHCLKFreq());
  rt_kprintf("PCLK1Freq:%lu.\r\n",HAL_RCC_GetPCLK1Freq());
  rt_kprintf("PCLK2Freq:%lu.\r\n",HAL_RCC_GetPCLK2Freq());
  
  /* Peripheral Clock Frequency */   //各个外设时钟频率
  rt_kprintf("RTC\tClockFreq:%lu.\r\n",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_RTC));  //RTC
  rt_kprintf("ADC\tClockFreq:%lu.\r\n",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_ADC));  //ADC
  rt_kprintf("I2C1\tClockFreq:%lu.\r\n",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C1));//I2C1
  rt_kprintf("I2C2\tClockFreq:%lu.\r\n",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C2));//I2C2
  rt_kprintf("I2C3\tClockFreq:%lu.\r\n",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C3));//I2C3
  rt_kprintf("LPTIM1\tClockFreq:%lu.\r\n",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_LPTIM1));  //LPTIM1
  rt_kprintf("LPTIM2\tClockFreq:%lu.\r\n",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_LPTIM2));  //LPTIM2
  rt_kprintf("LPUART1\tClockFreq:%lu.\r\n",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_LPUART1));//LPUART1
  rt_kprintf("RGN\tClockFreq:%lu.\r\n",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_RNG));  //RNG
  rt_kprintf("SAI1\tClockFreq:%lu.\r\n",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SAI1));//SAI1
  rt_kprintf("SDMMC1\tClockFreq:%lu.\r\n",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SDMMC1));  //SDMMC1
  rt_kprintf("SWPMI1\tClockFreq:%lu.\r\n",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SWPMI1));  //SWPMI1
  rt_kprintf("USART1\tClockFreq:%lu.\r\n",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_USART1));  //USART1
  rt_kprintf("USART2\tClockFreq:%lu.\r\n",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_USART2));  //USART2
  rt_kprintf("USART3\tClockFreq:%lu.\r\n",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_USART3));  //USART3
  rt_kprintf("UART4\tClockFreq:%lu.\r\n",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_UART4));    //UART4
  rt_kprintf("UART5\tClockFreq:%lu.\r\n",HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_UART5));    //UART5
  rt_kprintf("USB\tClockFreq:%lu.\r\n",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键查看命令列表,可以看到导出的命令及其帮助信息。

  • 9
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值