1. 程式人生 > >為你的AliOS Things應用增加自定義cli命令

為你的AliOS Things應用增加自定義cli命令

摘要: 怎麼才能在RTOS系統中,通過 串列埠shell控制LED的開關。

在日常嵌入式開發中,我們經常會用串列埠命令來使裝置進入某種特定的狀態,或執行某個特定的操作。如系統自檢,模擬執行,或者進入手動模式進行裝置點動。linux下有強大的shell工具,可以讓使用者和片上系統進行互動,而在傳統的微控制器系統中,使用者往往需要自行實現一套類似的互動工具。AliOS-Things原生帶有一套名為cli(command-line interface)的命令列互動工具,在提供基本的系統互動命令的基礎上,也支援使用者自定義命令。本文將介紹如何自定義cli命令並執行。
我們通過在《【AliOS Things學習筆記】在Developerkit開發板上執行blink例程》基礎上,註冊一個cli命令,通過命令列的方式控制LED的亮滅的例子,來演示一個帶有引數的cli命令如何被註冊以及呼叫。
首先,我們先保證Developerkit的原有cli功能可用。將開發板通過USB連線線和PC連線。

為你的AliOS Things應用增加自定義cli命令

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
為你的AliOS Things應用增加自定義cli命令


如果工具沒能正確地開啟串列埠,也可以嘗試在控制檯中使用命令列的方式啟動串列埠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 ---

#
#
輸入“help”回車,會看到當前支援的cli命令

help

====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

#
輸入“tasklist”,可以看到現有的任務執行情況

tasklist


cpu usage period = 25
CPU usage : 1.89

Name State Prio StackSize MinFreesize Runtime %CPU Candidate

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 N
cli RDY 60 512 271 491760 0.47 Y

到此,我們已經驗證了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函式具有固定的形式和引數,參考上述函式實現,使用者只需要修改函式名,請保持引數與上述函式一致,引數的意義如下:
為你的AliOS Things應用增加自定義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命令已註冊成功。

help

====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
測試命令是否執行,在命令提示符下輸入如下命令,並回車:
#led_switch on
led2點亮
測試引數有效性判斷,輸入如下指令,不帶引數。命令按設計返回錯誤報警。

led_switch

[1291080]<V> 引數錯誤
趕快試試,加入自己的cli功能吧!