1

STM32 移植 RT-Thread 标准版的 FinSH 组件 - 浇筑菜鸟

 1 year ago
source link: https://www.cnblogs.com/jzcn/p/16426289.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一、移植准备

  1. 开发版STM32F10xC8T6

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

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

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

    2406897-20220630103530199-1003506948.png

二、移植FinSH源码

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

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

    2406897-20220630104145979-1787304547.png
    2406897-20220630104415597-594088387.png
  3. 在工程中添加finsh源码,如下图所示:

    2406897-20220630104608608-1118617896.png
    2406897-20220630104632732-2092720595.png
  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函数为定义,如下图所示:
    2406897-20220630105103240-598442795.png

三、定义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;
}

完成后如下图所示:

2406897-20220630105917926-598225005.png

四、FinSH功能测试

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

2406897-20220630110441807-773117279.png
2406897-20220630110626277-1238367182.png

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

2406897-20220630110817285-396950858.png

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

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

五、FinSH使用

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

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

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

    2406897-20220630111720448-1342046923.png

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 键可以看到导出的命令,如下图所示:

2406897-20220630113325504-123739271.png

运行 hello_msh 命令,运行结果如下图所示:
2406897-20220630113451223-1657315447.png

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK