來源 | HaaS技術社群
1、診斷調試系統簡介
AliOS Things 自帶了調試診斷功能,提供了常見的CLI調試指令(可輸入help檢視),如:
- tasklist: 查詢系統任務狀态
- dumpsys mm: 查詢系統記憶體使用狀态
- cpuusage: 查詢cpu使用率
- p/m: 查詢/修改記憶體記憶體值
診斷調試系統依賴 cli 元件和debug元件,下面分别介紹這兩個元件的功能。
2、AliOS Things cli元件
在日常嵌入式開發中,使用者經常需要一套類似Linux Shell的互動工具,通過序列槽來執行一些預置的指令,如查詢系統的某種狀态、執行某個特定的操作、系統自檢,模拟測試運作等。AliOS Things原生實作了一套名為CLI(command-line interface)的指令行互動工具,在提供基本的系統互動指令的基礎上,也支援使用者自定義指令。
2.1、CLI 元件如何使用
以運作helloworld_demo為例,在helloworld_demo元件的package.yaml中添加cli元件。
- depends:
- - cli: rel_3.3.0 # helloworld_demo中添加cli元件
然後重新編譯燒錄上電即可,系統啟動後,操作方法與其他的常用shell類似,按回車有#符号列印,輸入help可檢視系統自帶的一些cli指令。
2.2、如何增加自定義的CLI指令
AliOS Things支援使用者增加自己的CLI指令,使用下面的接口。
2.2.1、包含頭檔案
#include "aos/cli.h"
2.2.2、方式1:注冊單個指令
API | 入參 | 傳回值 |
aos_cli_register_command | cli_command* | 0執行成功;其他:失敗 |
調用示例
- /*參考代碼*/
- int ret;
- void test_cmd(char *buf, int32_t len, int32_t argc, char **argv)
- {
- /*test_cmd 指令實作*/
- }
- const struct cli_command cmd = { "test", "show test info", test_cmd };
- ret = aos_cli_register_command(&cmd);
- if (ret) {
- /*錯誤處理*/
2.2.3、方式2:注冊多個指令
aos_cli_register_commands | 1. cli_command* 2. 入參個數 |
- void test1_cmd(char *buf, int32_t len, int32_t argc, char **argv)
- /*test1_cmd 指令實作*/
- void test2_cmd(char *buf, int32_t len, int32_t argc, char **argv)
- /*test2_cmd 指令實作*/
- const struct cli_command cmds[] = {
- { "test1", "show test1 info", test1_cmd },
- { "test2", "show test2 info", test2_cmd },
- };
- ret = aos_cli_register_commands(&cmds, sizeof(cmds) / sizeof(struct cli_command));
2.2.4、方式3:通過宏注冊單個指令
- void test3_cmd(int32_t argc, char **argv)
- /* test3_cmd 指令實作 */
- /* 宏的參數說明:
- * 參數1. cmd具體實作
- * 參數2. 在序列槽下輸入的指令
- * 參數3. cmd的描述資訊
- */
- ALIOS_CLI_CMD_REGISTER(test3_cmd, test3, show test3 info)
注意:這種方式不需要判斷傳回值,若注冊失敗,系統在初始化過程中會輸出相應資訊
3、AliOS Things debug元件
系統支援的調試指令包含在debug元件中。
3.1、debug元件如何使用
以運作helloworld_demo為例,在helloworld_demo元件的package.yaml中添加cli元件和debug元件。
- - cli: rel_3.3.0 # helloworld_demo中添加cli元件
- - debug: rel_3.3.0 # helloworld_demo中添加debug元件
重新編譯燒錄上電,系統啟動後,輸入help可檢視系統自帶的一些調試指令,如圖:

3.2、常見的調試診斷指令介紹
3.2.1、任務資訊統計
tasklist
圖中跑的是helloworld_demo下,目前系統建立的幾個任務。tasklist指令分别列出了每個任務的:
- 任務ID
- 任務狀态:ready/pend/suspend/sleep等
- 任務優先級:數值越小,優先級越高
- 任務棧大小:機關是Bytes
- 任務棧使用極限值:若在系統運作時這個值比較小,就會有棧溢出風險,可以考慮加大任務棧
- 目前任務訓示:Y表示目前正在運作的任務
3.2.2、記憶體狀态統計
dumpsys mm
上面截圖中各字段的解釋為:
HEAP中的内容含義:
- TotalSz:系統可供malloc的動态記憶體總大小;
- FreeSz:系統目前空閑記憶體大小;
- UsedSz:系統目前已經配置設定的記憶體大小,即UsedSz = TotalSz – FreeSz;
- MinFreeSz:系統空閑記憶體的曆史最小值,即TotalSz – MinFreeSz 便是記憶體曆史使用量峰值;
- MaxFreeBlkSz:系統最大空閑塊Size,表示系統此時可供配置設定出來的記憶體最大值。
3.2.3、任務負載統計 cpuusage
執行指令
cpuusage
預設以1s為間隔,周期性列印系統目前所有任務的cpuusage
cpuusage指令使用說明
cpuusage [-d n] [-t m] 指令啟動CPU使用率統計,結果輸出到序列槽終端
其中:-d 選項用于指定統計周期,機關為ms,預設為1 s;
-t 選項用于指定統計時長,機關為ms,預設為連續運作。
舉例說明:
(1) cpuusage -- 啟動一個cpuusage任務,該任務預設每隔1s執行一次統計;
(2) cpuusage -d 3000 -- 啟動一個cpuusage任務,該任務預設每隔3s(3000ms)執行一次統計;
(3) cpuusage -d 2000 -t 10000 -- 啟動一個cpuusage任務,該任務預設每隔2s(2000ms)執行一次統計,統計到
10s(10000ms)後停止;
(4) cpuusage -e -- 停止統計
3.2.4、顯示/修改記憶體資料的p/m指令
這個指令可以查詢、修改系統記憶體
舉例說明:需要得到HaaS100系統外設中斷的優先級,我們查到資料手冊得知0xE000E400為系統外設中斷優先級的寄存器位址,可以通過p指令通路系統寄存器或者記憶體:
p 0xE000E400
當需要修改一個記憶體值(或者一個寄存器的值),可以通過m指令,如:下面示範了将位于
0x34027770的位址的值,從0x12345678修改為0xffffffff的過程
3.2.5、系統複位指令reboot
reboot是系統熱複位指令,指令是通過調用了闆級的reboot接口來實作。
4、總結
HaaS100的診斷調試功能不止于上面介紹的cli /debug 元件帶來的調試指令,後續将為大家帶來更多基于AliOS Things 的診斷調試方法。
歡迎大家持續關注HaaS!
開發者支援
HaaS解決方案中心:
https://haas.iot.aliyun.com/HaaS技術社群:
https://blog.csdn.net/HaaSTech開發者釘釘群和公衆号見下圖,開發者釘釘群每天都有技術支援同學值班。