本帖最后由 夜声 于 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, 下载次数: 6)
|