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:注册多个命令
API | 入参 | 返回值 |
aos_cli_register_commands | 1. cli_command* 2. 入参个数 | 0执行成功;其他:失败 |
调用示例
int ret;
/*参考代码*/
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));
if (ret) {
/*错误处理*/
}
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组件。
depends:
- 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
开发者钉钉群和公众号见下图,开发者钉钉群每天都有技术支持同学值班。