[活动专区] 【N32G430开发板试用】+shell终端

[复制链接]
888|8
 楼主| 夜声 发表于 2022-8-12 17:30 | 显示全部楼层 |阅读模式
本帖最后由 夜声 于 2022-8-13 08:36 编辑

#申请原创#@21小跑堂 @安小芯


一、Finsh介绍
       嵌入式设备通常需要将开发板与 PC 机连接起来通讯,常见连接方式包括:串口、USB、以太网、Wi-Fi 等。一个灵活的 shell 也应该支持在多种连接方式上工作。有了 shell,就像在开发者和计算机之间架起了一座沟通的桥梁,开发者能很方便的获取系统的运行情况,并通过命令控制系统的运行。特别是在调试阶段,有了 shell,开发者除了能更快的定位到问题之外,也能利用 shell 调用测试函数,改变测试函数的参数,减少代码的烧录次数,缩短项目的开发时间。
      FinSH 是 RT-Thread 的命令行组件,就是基于上面这种思想而诞生的。FinSH执行流程如下所示:
finsh通信框架.jpg
二、创建静态线程
    这里使用静态的方式创建一个线程,目的是可以用来一会测试一下finsh是否移植成功。

  1. static struct rt_thread thread1;
  2. static char thread1_stack[512];

  3. void Thread_entry1(void *p)
  4. {
  5.     while(1)
  6.     {
  7.                 LED_Toggle(LED3_GPIO_PORT, LED3_GPIO_PIN);
  8.                 rt_thread_mdelay(300);
  9. //      rt_kprintf("Thread_entry1 is running !\r\n");
  10. //        rt_thread_mdelay(500);
  11.     }
  12. }

  13. int rt_thread1(void)
  14. {
  15.     rt_err_t key_ret = RT_NULL;

  16.    
  17.     key_ret = rt_thread_init(&thread1,"Thread1",Thread_entry1, RT_NULL, &thread1_stack[0],sizeof(thread1_stack), 10, 10);
  18.     if(key_ret <0)
  19.     {
  20.         rt_kprintf(" init ERROR\r\n");
  21.         return RT_ERROR;
  22.     }
  23.     else {
  24.         rt_kprintf("Thead1  succeed....\n");
  25.     }

  26.     rt_thread_startup(&thread1);
  27. }
三、添加shell
首先添加shell源码

添加shell源码jpg.jpg
接下来打开finsh_config.h这个宏定义
打开finsh这个宏定义.jpg
接下来添加操作系统的打印功能。
  1. int uart_init(void)
  2. {
  3. //#error "TODO 2: Enable the hardware uart and config baudrate."
  4.    
  5.     bsp_uart_init();
  6.     return 0;
  7. }


  8. void uart_send_byte(u8 data)
  9. {
  10.          while (USART_Flag_Status_Get(USART1, USART_FLAG_TXDE) == RESET);

  11.         USART_Data_Send(USART1, data);
  12. }


  13. void rt_hw_console_output(const char *str)
  14. {
  15.         rt_size_t i = 0, size = 0;
  16.         char  a = '\r';
  17.         
  18.         size = rt_strlen(str);
  19.         for(i = 0; i < size; i++)
  20.         {
  21.                 if(*(str + i) == '\n')
  22.                 {
  23.                         uart_send_byte(a);                                                                        //发送数据
  24.                 }
  25.                 uart_send_byte(*(str+i));                                                                        //发送数据
  26.         }

  27.         
  28. //#error "TODO 3: Output the string 'str' through the uart."
  29. }
这部分完成后可以复位一下,看一下是否能输出下面内容
console输出.jpg
接下开始完成shell读取输入的部分代码,在finsh_port.c这个文件中
  1. int ch = -1;

  2. //#error "TODO 4: Read a char from the uart and assign it to 'ch'."
  3.         
  4.         if( USART_Flag_Status_Get(USART1,USART_FLAG_RXDNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  5.         {
  6.                 ch = USART_Data_Receive(USART1) & 0xff;
  7.         }
  8.         else
  9.         {
  10.                 if( USART_Flag_Status_Get(USART1, USART_FLAG_OREF) != RESET)  //
  11.                 {
  12.                          USART_Flag_Clear(USART1, USART_FLAG_RXDNE);
  13.                 }
  14.                 rt_thread_mdelay(10);
  15.         }
  16.         return ch;
接下来打开终端,使用MobaXterm,这个工具比较好用,平时调试Linux用的也比较多。新建一个节点,选择serial,把波特率改为115200。
终端.jpg
复位开发板,查看终端数据。
信息.jpg
当出现msh>说明shell已经添加成功,接下来按TAB键查看全部信息。
全部信息.jpg
根据提示输入相应的命令,比如输入list_thread
list——.jpg
在上图中可以看到刚才创建的线程Thead1,还有一个shell线程,idle线程以及main主函数。同时还可看到的信息,使用起来非常的方便,特别是在开发调试的时候。
工程:
rt-thread nano.zip (7.8 MB, 下载次数: 6)




hudi008 发表于 2022-8-16 22:23 | 显示全部楼层
利用 shell 调用测试函数不错。   

评论

对,调试比较方便,使用完整版的更舒服  发表于 2022-8-18 21:27
myiclife 发表于 2022-8-17 16:26 | 显示全部楼层
必须使用rtt系统吗

评论

咋其他系统上没试过  发表于 2022-8-18 21:28
bestwell 发表于 2022-8-18 17:37 | 显示全部楼层
shell使用的是什么协议?   
deliahouse887 发表于 2022-8-18 19:39 | 显示全部楼层
能够远程控制实现吗   

评论

你指的远程实现是怎样操作?没太懂意思  发表于 2022-8-18 21:30
这个没试过  发表于 2022-8-18 21:29
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

89

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部