摘要: 怎麼才能在RTOS系統中,經過 串口shell控制LED的開關。linux
在平常嵌入式開發中,咱們常常會用串口命令來使設備進入某種特定的狀態,或執行某個特定的操做。如系統自檢,模擬運行,或者進入手動模式進行設備點動。linux下有強大的shell工具,可讓用戶和片上系統進行交互,而在傳統的單片機系統中,用戶每每須要自行實現一套相似的交互工具。AliOS-Things原生帶有一套名爲cli(command-line interface)的命令行交互工具,在提供基本的系統交互命令的基礎上,也支持用戶自定義命令。本文將介紹如何自定義cli命令並執行。
咱們經過在《【AliOS Things學習筆記】在Developerkit開發板上運行blink例程》基礎上,註冊一個cli命令,經過命令行的方式控制LED的亮滅的例子,來演示一個帶有參數的cli命令如何被註冊以及調用。
首先,咱們先保證Developerkit的原有cli功能可用。將開發板經過USB鏈接線和PC鏈接。ios
windows用戶經過設備管理器確認開發板所虛擬出的串口號,MAC和linux用戶可用在終端中輸入以下命令來查看USB串口是否已正確鏈接。
ls /dev/tty.*
若是出現以下設備列表,則表示鏈接正確。usbmodem後的數字可能會由於計算機不一樣而不一樣。
/dev/tty.usbmodem14103
此時,可用打開PC上的串口調試工具,設置對應的串口,波特率默認爲115200bps。建議串口調試助手具有終端功能,這樣會在cli的使用中有更好的體驗。接下來我將以植入VScode中的aos-cube工具的串口監視器功能爲例進行演示。打開VScode,確保已經按照alios-studio和aos-cube插件。點擊alios-studio工具條中的「插頭」按鈕,啓動串口monitor
若是工具沒能正確地打開串口,也能夠嘗試在控制檯中使用命令行的方式啓動串口monitor。命令格式以下:
aos monitor /dev/tty.usbmodem14103 115200 #mac linux下命令
aos monitor com5 115200 #windows 下命令
成功進入串口monitor後,會從終端中打印出幫助信息。輸入回車,會出現「#」提示符,此時就能夠輸入命令了。
--- Miniterm on /dev/tty.usbmodem14103 115200,8,N,1 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---shell
輸入「help」回車,會看到當前支持的cli命令windows
====Build-in Commands====
====Support 4 cmds once, seperate by ; ====
help : print this
p : print memory
m : modify memory
echo : echo for command
exit : close CLI
devname : print device name
sysver : system version
reboot : reboot system
time : system time
ota : system ota數組
====User Commands====
loglevel : set log level
tasklist : list all thread info
dumpsys : dump system info
udp : [ip] [port] [string data] send udp data
wifi_debug: wifi debug mode
mac : get/set mac
kv : kv [set key value | get key | del key | list]
version : show versionapp
輸入「tasklist」,能夠看到現有的任務運行狀況函數
cpu usage period = 25工具
dyn_mem_proc_task PEND 6 256 216 22 0.00 N
idle_task RDY 61 200 177 745102697 98.11 N
DEFAULT-WORKQUEUE PEND 20 768 738 23 0.00 N
timer_task PEND 5 300 254 25 0.00 N
aos-init PEND 32 1536 1389 1419569 1.38 Noop
到此,咱們已經驗證了cli功能在Developerkit開發板上,接下咱們開始註冊和使用本身的cli命令。
咱們依然打開blink.c文件,在其中添加代碼實現。首先,cli命令的註冊,依賴於一個名爲cli_command結構體,結構體描述以下:
struct cli_command {學習
const char *name; // 命令體,字符串 const char *help; // 命令的幫助說明文本,字符串 void (*function)(char *pcWriteBuffer, int xWriteBufferLen, int argc, char **argv); // 命令被執行時實際調用的功能函數
};
在本例中,咱們將cli命令命名爲「led_switch」,幫助文本字符串爲「[on] turn on led2;[off] trun off led2」
接下來咱們來實現cli命令的功能函數。將下面函數直接加入blink.c文件中。
static void led_switch(char pwbuf, int blen, int argc, char *argv)
{
if(argc == 1) // 若是參數爲空,則報錯返回 { LOG("參數錯誤"); return; } if(strcmp(argv[1],"on") == 0) // 若是輸入參數爲「on」,則點亮led { hal_gpio_output_low(&led); // GPIO輸出低,點亮LED2 } else { hal_gpio_output_high(&led); // GPIO輸出高,熄滅LED2 }
}
cli函數具備固定的形式和參數,參考上述函數實現,用戶只須要修改函數名,請保持參數與上述函數一致,參數的意義以下:
接下來填寫註冊用結構體,以便將命令信息傳遞給cli服務。按照前所講的設計,註冊結構體信息以下,將結構體拷貝到blink.c文件中。
struct cli_command led_switch_command[] = {
{ .name = "led_switch", // 命令名稱 .help = "[on] turn on led2;[off] trun off led2",// 幫助文本 .function = led_switch // 命令具體執行的函數指針 }
};
將cli命令註冊到系統中。cli命令註冊只須要一個函數以下:
aos_cli_register_commands(&led_switch_command[0],1);
函數須要傳入兩個參數,參數1爲剛剛建立的命令信息體的結構體指針;參數2,爲本次須要註冊的命令數,也就是說能夠一次性註冊多個命令,只須要在命令信息結構體中,用數組的方式同時填入幾個命令的信息便可。
將上述函數調用加入到blink.c文件application_start函數的以下位置:
aos_cli_register_commands(&led_switch_command[0],1); // 註冊cli命令函數 aos_loop_run();
至此,一個cli命令的實現和註冊的代碼編寫部分就完成了。編譯並下載至開發板中運行。在cli控制檯輸入help,看到led_switch命令已註冊成功。
====Build-in Commands====
====Support 4 cmds once, seperate by ; ====
help : print this
p : print memory
m : modify memory
echo : echo for command
exit : close CLI
devname : print device name
sysver : system version
reboot : reboot system
time : system time
ota : system ota
====User Commands====
loglevel : set log level
tasklist : list all thread info
dumpsys : dump system info
udp : [ip] [port] [string data] send udp data
wifi_debug: wifi debug mode
mac : get/set mac
kv : kv [set key value | get key | del key | list]
version : show version
led_switch: [on] turn on led2;[off] trun off led2
測試命令是否執行,在命令提示符下輸入以下命令,並回車:
led2點亮
測試參數有效性判斷,輸入以下指令,不帶參數。命令按設計返回錯誤報警。
[1291080]<V> 參數錯誤趕快試試,加入本身的cli功能吧!