大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全家桶1年46,售后保障稳定
文章主要参考:https://blog.csdn.net/killercode11/article/details/104290949,借鉴了
rt_hw_console_getchar()
的定义。
本文不介绍 RT-Thread 的串口配置,如有需要,可以参考:重映射串口到 rt_kprintf 函数
将 FinSH源码添加到工程
FinSH源码在 RT-Thread 源码目录的 components\finsh\
目录下,
将其导入到工程中,具体操作这里不做介绍,记得要把头文件包含进来,
开启 FinSH
修改 rtconfig.h
,开启 finsh config
,下面是使用 Configuration Wizard
向导进行图形化配置,
其实就是将 finsh_fonfig.h
头文件包含到工程中,这个头文件里有 FisSH 的基本参数配置,
定义终端读取函数
移植完 FinSH 源码后,初次编译一般会报一个错误,需要将弱化函数 rt_hw_console_getchar()
里的 #error 这行屏蔽掉(记得先把该文件的只读属性关闭)
接着我们在 board.c
文件手动重新定义 rt_hw_console_getchar()
函数,函数内容如下,这是标准库版本,如果需要 HAL库版本,可以参考文章最前面的链接。
char rt_hw_console_getchar(void)
{
/* Note: the initial value of ch must < 0 */
int ch = -1;
if(USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) != RESET)
{
//USART_ClearITPendingBit(USART_DEBUG, USART_FLAG_RXNE);
ch = USART_ReceiveData(DEBUG_USARTx) & 0xFF;
}
else
{
if(USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_ORE) != RESET)
{
USART_ClearITPendingBit(DEBUG_USARTx, USART_FLAG_ORE);
}
rt_thread_mdelay(10);
}
return ch;
}
体验 FinSH
我使用 SSCOM 来作为终端,效果还不错,命令直接在显示窗口里输入。
或许有人会问为什么不用 PuTTy、XShell 这类常用的终端软件,我也想用,但连接上这类终端软件后,开发板就不运行了。
遇到的问题
1.段错误
导致这种错误的原因有很多种,比如 RT_MAIN_THREAD_STACK_SIZE
太小,而我是因为 RT_THREAD_PRIORITY_MAX
设置得太小(只设置为 8),小于 FINSH_THREAD_PRIORITY
的默认值 21,所以解决办法就是将 FINSH 的线程优先级(数值)改小或者将系统优先级最大值(数值范围)改大。
2.终端工具无法打印
使用 PuTTy、XShell,终端没反应,且开发板会卡住。初步分析的原因是 “正点原子一键下载电路和终端工具冲突”(网上他人结论),所以只能用串口调试助手来操作 Finsh 了。
3.程序不运行
这个问题可能的原因也很多,但需要注意的是:如果要使用 FinSH,就不能开启串口中断,至于为什么,我目前也没去了解。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/210436.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...