作者?|?Nrush
命令行交互在上位機軟件比較常見,在單片機中實現命令交互也有很多案例,這里分享一個開源的命令行工具:nr_micro_shell. ?
1、介紹
在進行調試和維護時,常常需要與單片機進行交互,獲取、設置某些參數或執行某些操作,nr_micro_shell正是為滿足這一需求,針對資源較少的MCU編寫的基本命令行工具。
雖然RT_Thread組件中已經提供了強大的finsh命令行交互工具,但對于ROM、RAM資源較少的單片機,finsh還是略顯的龐大,在這些平臺上,若仍想保留基本的命令行交互功能,nr_micro_shell是一個不錯的選擇。
nr_micro_shell具有以下優點
1.占用資源少,使用簡單,靈活方便。使用過程只涉及兩個shell_init()和shell()兩個函數,無論是使用RTOS還是裸機都可以方便的應用該工具,不需要額外的編碼工作。
2.交互體驗好。完全類似于linux shell命令行,當串口終端支持ANSI(如Hypertrm終端)時,其不僅支持基本的命令行交互,還提供Tab鍵命令補全,查詢歷史命令,方向鍵移動光標修改功能。
3.擴展性好。nr_micro_shell為用戶提供自定義命令的標準函數原型,只需要按照命令編寫命令函數,并注冊命令函數,即可使用命令。
nr_micro_shell和相同配置下的finsh?(finsh不使用msh)占用資源對比
? | 原始工程 | 添加nr_micro_shell增加量 | 添加finsh增加量 |
---|---|---|---|
ROM | 63660 | +3832 | +26908 |
RAM | 4696 | +1104 | +1304 |
兩者配置都為
最多3條歷史命令。
支持Tab補全 。
命令行最大長度為100。
最多10個命令參數。
命令行線程堆棧為512字節。
nr_micro_shell演示效果如下
1.1 目錄結構
名稱 | 說明 |
---|---|
docs | 文檔目錄,包含演示的GIF圖片等 |
examples | 例子目錄,包括命令函數示例:nr_micro_shell_commands.c?和RT_Thread下使用示例?nr_micro_shell_thread.c |
inc | 頭文件目錄 |
src | 源代碼目錄 |
1.2 許可證
nr_micro_shell package 遵循 MIT 許可,詳見?LICENSE?文件。
1.3 依賴
無依賴
2、RT_Thread 下 ENV 工具使用
RT_Thread 使用 nr_micro_shell package package 需要在 RT-Thread 的包管理器中選擇它,具體路徑如下:
RT-Thread?online?packages ????tools?packages?--->? ????????[*]?nr_micro_shell:Lightweight?command?line?interaction?tool.?--->
相關的設置在按下sapce鍵選中后,按enter可進行相關參數配置。然后讓 RT-Thread 的包管理器自動更新,或者使用?pkgs --update?命令更新包到 BSP 中。
若您需要運行示例,請保證RT_Thread配置中的Using console for kt_printf.選項是被打開的,kt_printf可以正常工作,且Use components automatically initialization.選項打開。編譯直接下載或仿真便可以使用nr_micro_shell。命令行空白時按Tab,可顯示所有支持的命令,測試示例命令可見doc/pic下的使用示例動圖。自定義命令過程,參照下文
3. 裸機下使用nr_micro_shell package中的方法。
3、裸機下使用
3.1 配置:
所有配置工作都可以在?nr_micro_shell_config.h?中完成。有關詳細信息,請參見文件中的注釋。
3.2 用法:
確保所有文件都已添加到項目中。
確保?nr_micro_shell_config.h?中的宏函數"shell_printf(),ansi_show_char()"可以在項目中正常使用。
使用示例如下
#include?"nr_micro_shell.h" int?main(void) { ????/*?初始化?*/ ????shell_init(); ????while(1) ????{ ????????if(USART?GET?A?CHAR?'c') ????????{ ????????????/*?nr_micro_shell接收字符?*/ ????????????shell(c); ????????} ????} }
建議直接使用硬件輸入前,建議使用如下代碼(確保可以正常打印信息),驗證nr_micro_shell是否可以正常運行
#include?"nr_micro_shell.h" int?main(void) { ????unsigned?int?i?=?0; ????//匹配好結束符配置?NR_SHELL_END_OF_LINE?0 ????char?test_line[]?=?"test?1?2?3 " ????/*?初始化?*/ ????shell_init(); ???? ????/*?初步測試代碼?*/ ????for(i?=?0;?i?3.3 添加自己的命令
STEP1:
您需要在nr_micro_shell_commands.c*中實現一個命令函數。命令函數的原型如下
void?your_command_funtion(char?argc,?char?*argv) { ????..... }argc是參數的數目。argv存儲每個參數的起始地址和內容。如果輸入字符串是
test?-a?1
則argc為3,argv的內容為
------------------------------------------------------------- 0x03|0x08|0x0b|'t'|'e'|'s'|'t'|''|'-'|'a'|''|'1'|''| -------------------------------------------------------------如果想知道第一個或第二個參數的內容,應該使用
/*?"-a"?*/ printf(argv[argv[1]]) /*?"1"?*/ printf(argv[argv[2]])STEP2: 在使用命令前需要注冊命令,共有兩種方法注冊命令
1.當配置文件中NR_SHELL_USING_EXPORT_CMD未被定義,在static_cmd[]表中寫入
const?static_cmd_st?static_cmd[]?= { ???..... ???{"your_command_name",your_command_funtion}, ???..... ???{"",NULL} };注意:不要刪除{"",NULL}!
2.當配置文件中NR_SHELL_USING_EXPORT_CMD被定義,且NR_SHELL_CMD_EXPORT()支持使用的編譯器時,可以使用以下方式注冊命令
NR_SHELL_CMD_EXPORT(your_command_name,your_command_funtion);
4、linux下使用nr_micro_shell仿真
在工程./examples/simulator/目錄下存放著nr_micro_shell仿真代碼,仍在./examples/nr_micro_shell_commands.c文件中按上述方式添加自定義命令,添加完成后可以使用make命令編譯源碼,生產的可執行文件為./examples/simulator/out/nr_micro_shell或./examples/simulator/out/nr_micro_shell_db。可使用的make命令如下
#?編譯可執行文件 make #?編譯可仿真執行文件 make?debug #?清除編譯生成文件 make?clean5、注意事項
根據你的使用習慣使用NR_SHELL_USING_EXPORT_CMD選擇命令注冊方式。
使用注冊表注冊命令時,確保您的工程中存在注冊表
const?static_cmd_st?static_cmd[]?= { ???..... ???{"",NULL} };使用NR_SHELL_CMD_EXPORT()時確保,NR_SHELL_CMD_EXPORT()支持使用的編譯器,否則會報錯。
nr_micro_shell 不支持ESC鍵等控制鍵(控制符)。
編輯:黃飛
?
評論
查看更多