参考连接:
https://blog.csdn.net/baseball214/article/details/131341722
移植的前提是,你已经有一个可以使用的nano功能.
1.将rtthread-nano-master\rt-thread\components文件复制到工程.
2.添加Finsh中的.c以及相关.h头文件路径
3.注释掉finsh_config.h文件中以下两个宏定义,因为这个在rtconfig.h文件中已经定义,提示重复定义.
#define FINSH_THREAD_PRIORITY 21
#define FINSH_THREAD_STACK_SIZE 1024
4.注释掉finsh_port.c中
RT_WEAK char rt_hw_console_getchar(void)
{
/* Note: the initial value of ch must < 0 */
int ch = -1;
//#error "TODO 4: Read a char from the uart and assign it to 'ch'."
return ch;
}
5.实现rt_hw_console_getchar(参考Nano 移植控制台/FinSH (rt-thread.org))
我使用的是将中断接收到的数据加到队列中, 然后从队列读出来.
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1) /* 如果是串口1 */
{
HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
InQue(rx_que, g_rx_buffer[0]);
}
}
void USART1_IRQHandler(void)
{
HAL_UART_IRQHandler(&g_uart1_handle); /* 调用HAL库中断处理公用函数 */
}
char rt_hw_console_getchar(void)
{
int ch = -1;
uint8_t val;
rt_thread_mdelay(30);
if(OutQue(rx_que,&val))
{
ch = val;
}
return ch;
}
6.在rtconfig.h中加#define RTE_USING_FINSH
移植成功,就可以开心的使用了
使用Mobaxterm时,发现出现如下, 需要右键命令框,如下设置
添加命令
// 清屏函数
static long clear(void)
{
rt_kprintf("\x1b[2J\x1b[H");
return 0;
}
MSH_CMD_EXPORT(clear, clear the screen);
// 多参数测试函数添加
static long test(int argc, char** argv)
{
int i;
for(i = 0; i < argc; i++)
{
rt_kprintf("display %d string: %s\r\n", i, argv[i]);
}
return 0;
}
MSH_CMD_EXPORT(test, test function);