STM32+FreeRtos 移植letter-shell工具
前言
? ? ? ? Rt-thread系統有非常好用的FinSH調試工具,考慮在FreeRtos也移植一款類似的嵌入式Shell工具,經過資料查找,開源的letter-shell庫滿足此需求,搞起。
1、平臺
???????開發環境:vscode+STM32CubeMX+MDKV5
? ? ? ? 芯片:STM32F429
? ? ? ? 操作系統:FreeRTOS
? ? ? ? STM32庫:HAL
2、串口初始化
通過STM32CubeMX軟件直接生成,配置參數如下:
huart7.Instance = UART7;huart7.Init.BaudRate = 9600;huart7.Init.WordLength = UART_WORDLENGTH_8B;huart7.Init.StopBits = UART_STOPBITS_1;huart7.Init.Parity = UART_PARITY_NONE;huart7.Init.Mode = UART_MODE_TX_RX;huart7.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart7.Init.OverSampling = UART_OVERSAMPLING_16;3、源碼移植
源碼下載:
letter-shell: letter shell一個嵌入式小型shell,特別適用于單片機系統。https://gitee.com/zhang-ge/letter-shell.git解壓得到下列文件
文件移植
?把文件添加如MDK工程里面
?參照作者的移植步驟,我們重點修改shell_port.c文件:
- 定義shell對象
- 定義shell讀,寫函數
- 申請一片緩沖區
- 定義互斥鎖
- 實現上鎖解鎖功能
- 初始化函數實現
- 配置文件修改
去掉了shell伴生對象配置和設置命令觸發條件(0x0d)
/*** @file shell_cfg.h* @author Letter (nevermindzzt@gmail.com)* @brief shell config* @version 3.0.0* @date 2019-12-31* * @copyright (c) 2019 Letter* */#ifndef __SHELL_CFG_H__ #define __SHELL_CFG_H__#include "stm32f4xx_hal.h" #include "FreeRTOS.h" #include "portable.h"/*** @brief 是否使用默認shell任務while循環,使能宏`SHELL_USING_TASK`后此宏有意義* 使能此宏,則`shellTask()`函數會一直循環讀取輸入,一般使用操作系統建立shell* 任務時使能此宏,關閉此宏的情況下,一般適用于無操作系統,在主循環中調用`shellTask()`*/ #define SHELL_TASK_WHILE 1/*** @brief 是否使用命令導出方式* 使能此宏后,可以使用`SHELL_EXPORT_CMD()`等導出命令* 定義shell命令,關閉此宏的情況下,需要使用命令表的方式*/ #define SHELL_USING_CMD_EXPORT 1/*** @brief 是否使用shell伴生對象* 一些擴展的組件(文件系統支持,日志工具等)需要使用伴生對象*/ #define SHELL_USING_COMPANION 0/*** @brief 支持shell尾行模式*/ #define SHELL_SUPPORT_END_LINE 1/*** @brief 是否在輸出命令列表中列出用戶*/ #define SHELL_HELP_LIST_USER 0/*** @brief 是否在輸出命令列表中列出變量*/ #define SHELL_HELP_LIST_VAR 0/*** @brief 是否在輸出命令列表中列出按鍵*/ #define SHELL_HELP_LIST_KEY 1/*** @brief 是否在輸出命令列表中展示命令權限*/ #define SHELL_HELP_SHOW_PERMISSION 1/*** @brief 使用LF作為命令行回車觸發* 可以和SHELL_ENTER_CR同時開啟*/ #define SHELL_ENTER_LF 0/*** @brief 使用CR作為命令行回車觸發* 可以和SHELL_ENTER_LF同時開啟*/ #define SHELL_ENTER_CR 1/*** @brief 使用CRLF作為命令行回車觸發* 不可以和SHELL_ENTER_LF或SHELL_ENTER_CR同時開啟*/ #define SHELL_ENTER_CRLF 0/*** @brief 使用執行未導出函數的功能* 啟用后,可以通過`exec [addr] [args]`直接執行對應地址的函數* @attention 如果地址錯誤,可能會直接引起程序崩潰*/ #define SHELL_EXEC_UNDEF_FUNC 0/*** @brief shell命令參數最大數量* 包含命令名在內,超過16個參數并且使用了參數自動轉換的情況下,需要修改源碼*/ #define SHELL_PARAMETER_MAX_NUMBER 8/*** @brief 歷史命令記錄數量*/ #define SHELL_HISTORY_MAX_NUMBER 5/*** @brief 雙擊間隔(ms)* 使能宏`SHELL_LONG_HELP`后此宏生效,定義雙擊tab補全help的時間間隔*/ #define SHELL_DOUBLE_CLICK_TIME 200/*** @brief 管理的最大shell數量*/ #define SHELL_MAX_NUMBER 5/*** @brief shell格式化輸出的緩沖大小* 為0時不使用shell格式化輸出*/ #define SHELL_PRINT_BUFFER 128/*** @brief shell格式化輸入的緩沖大小* 為0時不使用shell格式化輸入* @note shell格式化輸入會阻塞shellTask, 僅適用于在有操作系統的情況下使用*/ #define SHELL_SCAN_BUFFER 128/*** @brief 獲取系統時間(ms)* 定義此宏為獲取系統Tick,如`HAL_GetTick()`* @note 此宏不定義時無法使用雙擊tab補全命令help,無法使用shell超時鎖定*/ #define SHELL_GET_TICK() HAL_GetTick()/*** @brief 使用鎖* @note 使用shell鎖時,需要對加鎖和解鎖進行實現*/ #define SHELL_USING_LOCK 1/*** @brief shell內存分配* shell本身不需要此接口,若使用shell伴生對象,需要進行定義*/ #define SHELL_MALLOC(size) pvPortMalloc(size)/*** @brief shell內存釋放* shell本身不需要此接口,若使用shell伴生對象,需要進行定義*/ #define SHELL_FREE(obj) vPortFree(obj)/*** @brief 是否顯示shell信息*/ #define SHELL_SHOW_INFO 1/*** @brief 是否在登錄后清除命令行*/ #define SHELL_CLS_WHEN_LOGIN 1/*** @brief shell默認用戶*/ #define SHELL_DEFAULT_USER "letter"/*** @brief shell默認用戶密碼* 若默認用戶不需要密碼,設為""*/ #define SHELL_DEFAULT_USER_PASSWORD ""/*** @brief shell自動鎖定超時* shell當前用戶密碼有效的時候生效,超時后會自動重新鎖定shell* 設置為0時關閉自動鎖定功能,時間單位為`SHELL_GET_TICK()`單位* @note 使用超時鎖定必須保證`SHELL_GET_TICK()`有效*/ #define SHELL_LOCK_TIMEOUT 0 * 60 * 1000#endif4、測試
測試代碼如下:
void TestEasyTask(void const *argument) {userShellInit();while(1){osDelay(1000);}}void shell_test(uint32_t num) {printf("shell:%d",num); }SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), func, shell_test, test);打開Mobaxterm軟件,設備上電即有信息打印出來?
按下”TAB“鍵,調出幫助信息
如圖輸入命令,得到結果
?我們即可通過串口測試shell_test函數
總結
?letter shell是一個C語言編寫的,可以嵌入在程序中的嵌入式shell,主要面向嵌入式設備,以C語言函數為運行單位,可以通過命令行調用,運行程序中的函數。通過移植這個工具,方便我們進行模塊的單元測試。
總結
以上是生活随笔為你收集整理的STM32+FreeRtos 移植letter-shell工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多组测试数据01字典树「模板」
- 下一篇: Chrome 调试动态加载的js