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

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