RT-Thread 应用篇 --- STM32添加FinSH控制台

0. 关于FinSH的介绍


1. 工程准备


2. RT-Thread 3.1.1版本添加FinSH

  • 定义一个串口设备,以及串口接收缓冲BUFF
    struct rt_device rtt_console;
    
    char console_receive_buf[10] = {0};
    int console_receive_count = 0;
    int console_read_count = 0;
    
  • 注册串口设备,设备名要与 rtconfig.h 中修改的相同
    rt_device_register(&rtt_console, "usart1", RT_DEVICE_FLAG_ACTIVATED);
    
  • 定义串口设备的读写函数
    rt_size_t rtt_console_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) {
        rt_hw_console_output(buffer);
        
        return size;
    }
    
    rt_size_t rtt_console_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) {
        rt_size_t ret= 0;
        
        if (console_read_count != console_receive_count) {
            *(char *)buffer = console_receive_buf[console_read_count++];
            console_read_count %= 10;
            ret = 1;
        }
        
        return ret;
    }
    
  • 初始化串口设备的ops
    rtt_console.type = RT_Device_Class_Char;
    rtt_console.rx_indicate = NULL;		// shell组件初始化时会修改该接口
    rtt_console.tx_complete = NULL;
    
    rtt_console.write = rtt_console_write;
    rtt_console.read = rtt_console_read;
    
  • 对应串口的中断函数
    void USART1_IRQHandler() {
        uint8_t rch;
        
        rt_interrupt_enter();
        
    	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {		
    		rch = USART_ReceiveData(USART1);
    
            console_receive_buf[console_receive_count++] = rch;
            console_receive_count %= 10;
            rtt_console.rx_indicate(&rtt_console, 1);
    	}
        
        rt_interrupt_leave();
    }
    
  • 编译烧写,测试 list_thread 命令
    在这里插入图片描述
  • 3.1.1 版本工程下载 RT-Thread-3.1.1-FinSH


3. RT-Thread 3.1.3版本添加FinSH

  • 3.1.2版本与3.1.1类似,3.1.3版中去掉了设备模型。在finsh线程中可以看到
    static int finsh_getchar(void)
    {
    	...
        extern char rt_hw_console_getchar(void);
        return rt_hw_console_getchar();
    	...
    }
    
    void finsh_thread_entry(void *parameter)
    {
        int ch;
        ...
    	while (1)
        {
            ch = finsh_getchar();
            ...
        }
    }
    
    所以只需要实现函数 char rt_hw_console_getchar(void) 即可。
  • 创建一个信号量用于通知 rt_hw_console_getchar 取字符。
    struct rt_semaphore rec_sem;
    
    char console_receive_buf[10] = {0};
    int console_receive_count = 0;
    int console_read_count = 0;
    
    rt_sem_init(&rec_sem, "rec_sem", 0, RT_IPC_FLAG_FIFO);
    
  • rt_hw_console_getchar 实现
    char rt_hw_console_getchar(void) {
        char ch = -1;
        
        rt_sem_take(&rec_sem, RT_WAITING_FOREVER);
        
        if (console_read_count != console_receive_count) {
            ch = console_receive_buf[console_read_count++];
            console_read_count %= 10;
        }
        
        return ch;
    }
    
  • 串口的中断函数中释放信号量。
    rt_sem_release(&rec_sem);
    
  • 3.1.3 版本工程下载 RT-Thread-3.1.3-FinSH

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章