STM32 移植 RT-Thread 标准版的 FinSH 组件
一、移植准备
-
开发版STM32F10xC8T6
-
准备好移植RT-Thread的移植工程
没动手移植过RT-Thread的小伙伴,可以看RT-Thread移植到stm32
-
我这里是将控制台信息打印到串口的,所以需要确认RT-Thread可以将控制台信息通过串口输出。有疑问的话可以看我之前的文章,RTThread 重定义rt_hw_console_output函数。
控制台能正常打印信息后,如下图所示:
二、移植FinSH源码
-
在项目中添加finsh源码
FinSH 源码位于 components/finsh 目录下,如下图所示: -
将finsh文件拷贝至工程项目的RT_Thread\components路劲下,如下图所示:
-
在工程中添加finsh源码,如下图所示:
-
在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使用
-
在 RT-Thread 中默认内置了一些 FinSH 命令,在 FinSH 中输入 help 后回车或者直接按下 Tab 键,就可以打印当前系统支持的所有命令。如下图所示:
-
RT-Thread的FinSH组件具有自动补全功能,只需要输入相应的内容后,按下 Tab 键便会自动补全指令或进行提示。
-
使用 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