本帖最后由 夜声 于 2022-8-13 08:36 编辑
#申请原创#@21小跑堂 @安小芯
一、Finsh介绍
嵌入式设备通常需要将开发板与 PC 机连接起来通讯,常见连接方式包括:串口、USB、以太网、Wi-Fi 等。一个灵活的 shell 也应该支持在多种连接方式上工作。有了 shell,就像在开发者和计算机之间架起了一座沟通的桥梁,开发者能很方便的获取系统的运行情况,并通过命令控制系统的运行。特别是在调试阶段,有了 shell,开发者除了能更快的定位到问题之外,也能利用 shell 调用测试函数,改变测试函数的参数,减少代码的烧录次数,缩短项目的开发时间。
FinSH 是 RT-Thread 的命令行组件,就是基于上面这种思想而诞生的。FinSH执行流程如下所示:
二、创建静态线程
这里使用静态的方式创建一个线程,目的是可以用来一会测试一下finsh是否移植成功。
static struct rt_thread thread1;
static char thread1_stack[512];
void Thread_entry1(void *p)
{
while(1)
{
LED_Toggle(LED3_GPIO_PORT, LED3_GPIO_PIN);
rt_thread_mdelay(300);
// rt_kprintf("Thread_entry1 is running !\r\n");
// rt_thread_mdelay(500);
}
}
int rt_thread1(void)
{
rt_err_t key_ret = RT_NULL;
key_ret = rt_thread_init(&thread1,"Thread1",Thread_entry1, RT_NULL, &thread1_stack[0],sizeof(thread1_stack), 10, 10);
if(key_ret <0)
{
rt_kprintf(" init ERROR\r\n");
return RT_ERROR;
}
else {
rt_kprintf("Thead1 succeed....\n");
}
rt_thread_startup(&thread1);
}
三、添加shell
首先添加shell源码
接下来打开finsh_config.h这个宏定义
接下来添加操作系统的打印功能。
int uart_init(void)
{
//#error "TODO 2: Enable the hardware uart and config baudrate."
bsp_uart_init();
return 0;
}
void uart_send_byte(u8 data)
{
while (USART_Flag_Status_Get(USART1, USART_FLAG_TXDE) == RESET);
USART_Data_Send(USART1, data);
}
void rt_hw_console_output(const char *str)
{
rt_size_t i = 0, size = 0;
char a = '\r';
size = rt_strlen(str);
for(i = 0; i < size; i++)
{
if(*(str + i) == '\n')
{
uart_send_byte(a); //发送数据
}
uart_send_byte(*(str+i)); //发送数据
}
//#error "TODO 3: Output the string 'str' through the uart."
}
这部分完成后可以复位一下,看一下是否能输出下面内容
接下开始完成shell读取输入的部分代码,在finsh_port.c这个文件中
int ch = -1;
//#error "TODO 4: Read a char from the uart and assign it to 'ch'."
if( USART_Flag_Status_Get(USART1,USART_FLAG_RXDNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
ch = USART_Data_Receive(USART1) & 0xff;
}
else
{
if( USART_Flag_Status_Get(USART1, USART_FLAG_OREF) != RESET) //
{
USART_Flag_Clear(USART1, USART_FLAG_RXDNE);
}
rt_thread_mdelay(10);
}
return ch;
接下来打开终端,使用MobaXterm,这个工具比较好用,平时调试Linux用的也比较多。新建一个节点,选择serial,把波特率改为115200。
复位开发板,查看终端数据。
当出现msh>说明shell已经添加成功,接下来按TAB键查看全部信息。
根据提示输入相应的命令,比如输入list_thread
在上图中可以看到刚才创建的线程Thead1,还有一个shell线程,idle线程以及main主函数。同时还可看到的信息,使用起来非常的方便,特别是在开发调试的时候。
工程:
rt-thread nano.zip
(7.8 MB)
|