爲你的AliOS Things應用增長自定義cli命令

摘要: 怎麼才能在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

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 versionapp

輸入「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 Noop

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函數具備固定的形式和參數,參考上述函數實現,用戶只須要修改函數名,請保持參數與上述函數一致,參數的意義以下:

圖片描述

接下來填寫註冊用結構體,以便將命令信息傳遞給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功能吧!

相關文章
相關標籤/搜索