STM32 移植 RT-Thread 標準版的 FinSH 元件

澆築菜鳥發表於2022-06-30

一、移植準備

  1. 開發版STM32F10xC8T6

  2. 準備好移植RT-Thread的移植工程
    沒動手移植過RT-Thread的小夥伴,可以看RT-Thread移植到stm32

  3. 我這裡是將控制檯資訊列印到串列埠的,所以需要確認RT-Thread可以將控制檯資訊通過串列埠輸出。有疑問的話可以看我之前的文章,RTThread 重定義rt_hw_console_output函式

    控制檯能正常列印資訊後,如下圖所示:

二、移植FinSH原始碼

  1. 在專案中新增finsh原始碼
    FinSH 原始碼位於 components/finsh 目錄下,如下圖所示:

  2. 將finsh檔案拷貝至工程專案的RT_Thread\components路勁下,如下圖所示:

  3. 在工程中新增finsh原始碼,如下圖所示:

  4. 在rtconfig.h檔案中定義finsh相關的巨集

    /**
     * FinSH
     */ 
    
    /* 定義該巨集可開啟系統 FinSH 除錯工具的使用,未定義則關閉 */
    #define RT_USING_FINSH
    
    /* 開啟系統 FinSH 時:將該執行緒名稱定義為 tshell */
    #define FINSH_THREAD_NAME "tshell"
    
    /* 開啟系統 FinSH 時:使用歷史命令 */
    #define FINSH_USING_HISTORY
    
    /* 開啟系統 FinSH 時:對歷史命令列數的定義 */
    #define FINSH_HISTORY_LINES 5
    
    /* 開啟系統 FinSH 時:定義該巨集開啟使用 Tab 鍵,未定義則關閉 */
    #define FINSH_USING_SYMTAB
    
    /* 開啟描述功能 */
    #define FINSH_USING_DESCRIPTION
    
    /* 開啟系統 FinSH 時:定義該執行緒的優先順序 */
    #define FINSH_THREAD_PRIORITY 20
    
    /* 開啟系統 FinSH 時:定義該執行緒的棧大小 */
    #define FINSH_THREAD_STACK_SIZE 4096
    
    /* 開啟系統 FinSH 時:定義命令字元長度 */
    #define FINSH_CMD_SIZE 80
    
    /* 開啟系統 FinSH 時:定義該巨集開啟 MSH 功能 */
    #define FINSH_USING_MSH
    
    /* 開啟系統 FinSH 時:開啟 MSH 功能時,定義該巨集預設使用 MSH 功能 */
    #define FINSH_USING_MSH_DEFAULT
    
    /* 開啟系統 FinSH 時:定義該巨集,僅使用 MSH 功能 */
    #define FINSH_USING_MSH_ONLY
    
    

    完成後編譯會提示rt_hw_console_getchar函式為定義,如下圖所示:

三、定義rt_hw_console_getchar函式

只需要在任意C檔案中實現rt_hw_console_getchar函式即可,為了提高程式碼的可讀性,建議將函式放在宣告串列埠(usart.c)的檔案中,內容如所示:

/**
 * Redefine "rt\u hw\u console\u getchar" function to realize finsh function
 */
char rt_hw_console_getchar(void)
{
	int ch = -1;			
	
	if (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) != RESET)
	{
		ch = (char)USART_ReceiveData(DEBUG_USARTx);
	}
	else
	{
		if (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_ORE) != RESET)
		{
			USART_ClearFlag(DEBUG_USARTx, USART_FLAG_TC);
		}
		rt_thread_mdelay(10);    // 防止finsh執行緒優先順序太高,需要適當掛起一下
	}
	
	return ch;
}

完成後如下圖所示:

四、FinSH功能測試

完成以上流程後,編譯程式並下載至開發板中,進行測試。這裡我使用的控制檯軟體是MobaXterm,新增串列埠如下圖所示:

下載程式後,控制檯便會列印相應的資訊,如下圖所示:

如上圖所示,按回車後,會有相應的反應變說明新增FinSH元件已經成功了。

注意:在使用串列埠的時候注意串列埠的接線。

五、FinSH使用

  1. 在 RT-Thread 中預設內建了一些 FinSH 命令,在 FinSH 中輸入 help 後回車或者直接按下 Tab 鍵,就可以列印當前系統支援的所有命令。如下圖所示:

  2. RT-Thread的FinSH元件具有自動補全功能,只需要輸入相應的內容後,按下 Tab 鍵便會自動補全指令或進行提示。

  3. 使用 ps 或者 list_thread 命令來列出系統中的所有執行緒資訊,包括執行緒優先順序、狀態、棧的最大使用量等。如下圖所示:

4.工作指令可以去官網檢視,FinSH 控制檯

六、自動定義msh命令

示例程式碼如下所示,程式碼中建立了 hello 函式,然後通過 MSH_CMD_EXPORT 命令即可將 hello 函式匯出到 FinSH 命令列表中。

#include <rtthread.h>

void hello_msh(void)
{
    rt_kprintf("hello RT-Thread!\n");
}

MSH_CMD_EXPORT(hello_msh , say hello to RT-Thread);

完成後,在 FinSH 控制檯按 tab 鍵可以看到匯出的命令,如下圖所示:

執行 hello_msh 命令,執行結果如下圖所示:

參考文獻

stm32 移植 rt-thread:https://blog.csdn.net/qq_36958104/article/details/111604665

相關文章