打印
[活动专区]

【N32G430开发板试用】+shell终端

[复制链接]
691|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是否移植成功。

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)




使用特权

评论回复
沙发
hudi008| | 2022-8-16 22:23 | 只看该作者
利用 shell 调用测试函数不错。   

使用特权

评论回复
评论
夜声 2022-8-18 21:27 回复TA
对,调试比较方便,使用完整版的更舒服 
板凳
myiclife| | 2022-8-17 16:26 | 只看该作者
必须使用rtt系统吗

使用特权

评论回复
评论
夜声 2022-8-18 21:28 回复TA
咋其他系统上没试过 
地板
bestwell| | 2022-8-18 17:37 | 只看该作者
shell使用的是什么协议?   

使用特权

评论回复
5
deliahouse887| | 2022-8-18 19:39 | 只看该作者
能够远程控制实现吗   

使用特权

评论回复
评论
夜声 2022-8-18 21:30 回复TA
你指的远程实现是怎样操作?没太懂意思 
夜声 2022-8-18 21:29 回复TA
这个没试过 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

85

帖子

2

粉丝