STM32 移植 RT-Thread 标准版的 FinSH 组件

一、移植准备

  1. 开发版STM32F10xC8T6

  2. 准备好移植RT-Thread的移植工程
    没动手移植过RT-Thread的小伙伴,可以看RT-Thread移植到stm32

  3. 我这里是将控制台信息打印到串口的,所以需要确认RT-Thread可以将控制台信息通过串口输出。有疑问的话可以看我之前的文章,RTThread 重定义rt_hw_console_output函数

    控制台能正常打印信息后,如下图所示:

二、移植FinSH源码

  1. 在项目中添加finsh源码
    FinSH 源码位于 components/finsh 目录下,如下图所示:

  2. 将finsh文件拷贝至工程项目的RT_Thread\components路劲下,如下图所示:

  3. 在工程中添加finsh源码,如下图所示:

  4. 在rtconfig.h文件中定义finsh相关的宏

    /**
     * FinSH
     */ 
    
    /* 定义该宏可开启系统 FinSH 调试工具的使用,未定义则关闭 */
    #define RT_USING_FINSH
    
    /* 开启系统 FinSH 时:将该线程名称定义为 tshell */
    #define FINSH_THREAD_NAME "tshell"
    
    /* 开启系统 FinSH 时:使用历史命令 */
    #define FINSH_USING_HISTORY
    
    /* 开启系统 FinSH 时:对历史命令行数的定义 */
    #define FINSH_HISTORY_LINES 5
    
    /* 开启系统 FinSH 时:定义该宏开启使用 Tab 键,未定义则关闭 */
    #define FINSH_USING_SYMTAB
    
    /* 开启描述功能 */
    #define FINSH_USING_DESCRIPTION
    
    /* 开启系统 FinSH 时:定义该线程的优先级 */
    #define FINSH_THREAD_PRIORITY 20
    
    /* 开启系统 FinSH 时:定义该线程的栈大小 */
    #define FINSH_THREAD_STACK_SIZE 4096
    
    /* 开启系统 FinSH 时:定义命令字符长度 */
    #define FINSH_CMD_SIZE 80
    
    /* 开启系统 FinSH 时:定义该宏开启 MSH 功能 */
    #define FINSH_USING_MSH
    
    /* 开启系统 FinSH 时:开启 MSH 功能时,定义该宏默认使用 MSH 功能 */
    #define FINSH_USING_MSH_DEFAULT
    
    /* 开启系统 FinSH 时:定义该宏,仅使用 MSH 功能 */
    #define FINSH_USING_MSH_ONLY
    
    

    完成后编译会提示rt_hw_console_getchar函数为定义,如下图所示:

三、定义rt_hw_console_getchar函数

只需要在任意C文件中实现rt_hw_console_getchar函数即可,为了提高代码的可读性,建议将函数放在声明串口(usart.c)的文件中,内容如所示:

/**
 * Redefine "rt\u hw\u console\u getchar" function to realize finsh function
 */
char rt_hw_console_getchar(void)
{
	int ch = -1;			
	
	if (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) != RESET)
	{
		ch = (char)USART_ReceiveData(DEBUG_USARTx);
	}
	else
	{
		if (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_ORE) != RESET)
		{
			USART_ClearFlag(DEBUG_USARTx, USART_FLAG_TC);
		}
		rt_thread_mdelay(10);    // 防止finsh线程优先级太高,需要适当挂起一下
	}
	
	return ch;
}

完成后如下图所示:

四、FinSH功能测试

完成以上流程后,编译程序并下载至开发板中,进行测试。这里我使用的控制台软件是MobaXterm,添加串口如下图所示:

下载程序后,控制台便会打印相应的信息,如下图所示:

如上图所示,按回车后,会有相应的反应变说明添加FinSH组件已经成功了。

注意:在使用串口的时候注意串口的接线。

五、FinSH使用

  1. 在 RT-Thread 中默认内置了一些 FinSH 命令,在 FinSH 中输入 help 后回车或者直接按下 Tab 键,就可以打印当前系统支持的所有命令。如下图所示:

  2. RT-Thread的FinSH组件具有自动补全功能,只需要输入相应的内容后,按下 Tab 键便会自动补全指令或进行提示。

  3. 使用 ps 或者 list_thread 命令来列出系统中的所有线程信息,包括线程优先级、状态、栈的最大使用量等。如下图所示:

4.工作指令可以去官网查看,FinSH 控制台

六、自动定义msh命令

示例代码如下所示,代码中创建了 hello 函数,然后通过 MSH_CMD_EXPORT 命令即可将 hello 函数导出到 FinSH 命令列表中。

#include <rtthread.h>

void hello_msh(void)
{
    rt_kprintf("hello RT-Thread!\n");
}

MSH_CMD_EXPORT(hello_msh , say hello to RT-Thread);

完成后,在 FinSH 控制台按 tab 键可以看到导出的命令,如下图所示:

运行 hello_msh 命令,运行结果如下图所示:

参考文献

stm32 移植 rt-thread://blog.csdn.net/qq_36958104/article/details/111604665

Tags: