一、移植準備
-
開發版STM32F10xC8T6
-
準備好移植RT-Thread的移植工程
沒動手移植過RT-Thread的小夥伴,可以看RT-Thread移植到stm32
-
我這裡是將控制檯資訊列印到串列埠的,所以需要確認RT-Thread可以將控制檯資訊通過串列埠輸出。有疑問的話可以看我之前的文章,RTThread 重定義rt_hw_console_output函式。
控制檯能正常列印資訊後,如下圖所示:
二、移植FinSH原始碼
-
在專案中新增finsh原始碼
FinSH 原始碼位於 components/finsh 目錄下,如下圖所示: -
將finsh檔案拷貝至工程專案的RT_Thread\components路勁下,如下圖所示:
-
在工程中新增finsh原始碼,如下圖所示:
-
在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使用
-
在 RT-Thread 中預設內建了一些 FinSH 命令,在 FinSH 中輸入 help 後回車或者直接按下 Tab 鍵,就可以列印當前系統支援的所有命令。如下圖所示:
-
RT-Thread的FinSH元件具有自動補全功能,只需要輸入相應的內容後,按下 Tab 鍵便會自動補全指令或進行提示。
-
使用 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