开发者学堂课程【HaaS 物联网应用开发课程:3_2_AliOS Things 命令行介绍】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/801/detail/13827
3_2_AliOS Things 命令行介绍
内容介绍
一、CLI 原理介绍
二、常用 CLI 命令介绍
三、添加 CLI 命令
一、CLI 原理介绍
本节课程的主题是 AliOS Things 命令行,在本节课中会给大家介绍一下命令行的原理,然后接下来给大家介绍AliOS Things 常用的命令行,然后第三个是如何添加一个自己的命令行指令。
首先是命令行的交互原理,CommandLine Interface 是 CLI 的缩写,它是命令行交互接口,操作系统提供的命令行交互功能一般都是通过 UART 或者是 USB 作为用户输入输出的接口,接收用户输入的指令解析指令并且对其进行执行,AliOS Things 操作系统的 cli 组件也可以通过 UART 或者是 USB 或者其他方式和用户进行交互,那在 Haas EDU K1 上是通过 UARTO 作为通道和用户进行交互的。
第一是组建或者是应用在启动的时候,它向 CUI 模块注册自己所关注的一个测试指令,注册之后 CUI 组件就会把这个指令以及对应指令的处理程序记录在自己的模块内部,然后第二步是用户通过 UART 输入了一个测试指令,那 CUL 组件会对这个测试指令进行解析解析,然后会和自己记录的 CUL 指令进行匹配,如果匹配成功,则会呼叫对应 CUL 指令的一个处理函数,然后呼叫处理函数的时候,也就是会呼叫到组建实现的 API 或者是应用实现的 API 里面,对这个命令进行处理那个函数,这个函数里边做什么样的事情就是有组建或者是应用来处理的。
AliOS Things CLI 的源代码是位于 core/cli 这个目录下边,然后如果需要使用 CLI 的功能,需要添加依赖关系或者是在应用的 aos.mk 中添加:$(NAME)_COMPONENTS += cli,然后或者是说在应用的 Config.in 中添加:select AOS_COMP_CLI 来选择 CLI 组件,选择好之后进行编译烧录,然后系统再启动的时候,在串口工具里边敲入回车,机会出现#提示符,则代表 cli 组件正常运行了。
二、常用 CLI 命令介绍
接下来对常见 CLI 做一个介绍,在敲入 help 指令之后, CLI 组件会把当前系统所支持的所有的指令给打印出来,然后看一下它 help 的输出,首先第一行它提示说 #同时支持4条 cli 指令,也就是说同时可以输入4条 cli 指令,并且只要用分号隔开,然后 cli 模块就会按顺序的执行这四条指令,ystem version 是打印系统版本号、reboot system是系统重启、system time 是打印系统启动时间、msleep 是让CLI 延时一段时间,它的单位是毫秒、cpuusage 是周期性显示CPU使用频率,默认时间间隔为1秒一次、show debug info 是显示系统的调试信息、P和m这两个也比较有用,在出现问题的时候,可以动态的去修改 memory 的一些值,然后改编程序的运行行为来做调试, run a function 是手动执行一个函数。Console show pc addr 是显示当前 PC 地址、 Console trigger system hung 是触发系统hang机的动作,尤其是在出现系统不响应或者是什么情况下,如果想查看当前系统的一些寄存器的状态的时候,可以使用 hang 这条指令,手动触发死机这样的动作,然后使用调试工具里面的一些测试指令,对系统进行调试。Tasklist 是显示当前系统的所有 task 信息、dumpsys 是打印系统内存及 heap 分配情况、udp 则是向指定 IP:PORT 发送 UDP data。后边还有很多就不再一一介绍了。
接下来对阿里云性质当中用的比较多的指令做一个演示,这边是一个工程环境,为了延迟方便不让系统默认打印很多 log ,把 hello world 这句给它注释掉,然后刚刚其实已经编译了,然后编译已经下载成功了。
接下来就来看一下它的输出日志是否还存在,这个时候看到它已经没有再输出任何日志了,再来看一下 Help 打印出来的就是现在系统里边支持的所有的命令都显示在这个地方,所以就针对刚刚所说的那几条,然后一个一个的做演示。
首先是 dumpsys 可以打印现在内存的状态统计信息,dumpsys 有两个,一个是 dumpsys mm,一个是 dumpsys heap 。现在来演示一下 dump mm ,可以看到这边的 heap 的 total size 指的是系统可以供 vlog 使用的动态内存的总大小,free size 是系统当前空闲内存的大小,use size 是当前已经分配的内存的大小,然后 minimum free size 是系统空闲内存的历史最小值,然后 maximum free block size 是指系统的最大动力空闲块。
再来看一下一条指令是 task list,可以通过这些人可以看到当前 os 启动了多少条 task ,然后每个 task 的优先级是怎么样的?它当前的状态是怎么样的?每个 task 的 size 设定的是多大,然后在整个 task 运行过程当中,它的历史 task size 最小值是怎么样的?然后它运行的时间有多长?
然后其他占用的 CPU 的 loading 是多大?接下来是 CPU usage,这个地方提示说已经开始去统计 CPU 的利用率了,它现在是以每秒打印一次的频率来打印当前 CPU 的占用率,可以看到当前刚刚 task list 里面列出来的,然后它现在因为没有什么事情在做,所以就基本上只有占用99.6%的 CPU,然后 CPU 占有的很少,输入之后看看它周期性的打印,所以这个时候输入 ctrl c ,它就不会再继续打印了。
接下来演示一下读取和修改当前内存数据的两条指令,一个是 p,一个是 m 。p 是 printn 的意思,假如说要修改一个内存地址为0x340 27770地址的值的时候,先打印一下它的值0x340 27770,然后可以看到这个寄存器开始的这些内存里面的值都是零,那现在用 m 来修改一下X34027770,给它改成零x12345678,这样然后它就会打印一条 log ,在这个地址原来的只是0x ,然后现在修改到 x12345678了,之后再使用 P0x34027770,然后打印一下它里面的值,看看它里面的值有没有改过来,现在可以看到这个地址的值已经改成12345678了,最后再来演示一下 reboot , CLI 再收到 reboot 之后就会做系统重启的动作,可以看到现在系统已经重启成功了 。
三、添加 CLI 命令
下面内容最后来介绍一下如何添加一个 CLI 指令,首先对 CLI 接口的一个重要数据结构做一个说明,这段数据结构它的结构声明是在 include/aos /cli.h 里边,它有一个名字叫 struct cli_command 的一个结构体,它里面总共有三个变量,第一个是 name,第二个是 help,第三个是 function,这个 name 其实就是命令行里边提示命令的一个名字,然后 help 就是刚刚敲 help 指令的时候前面会显示命令的名字,后面有一连串说明的字串,这个字串就是从 help 这个地方打印出来的,下面就是定义一个 function 处理函数,这里边的参数就不详细介绍了。
然后看一下使用 CLI 的一个步骤,首先要包含刚刚的 cli.h 这个文件,第二步要实现自己的命令行处理的函数,第三步是在组建或者是应用初始化函数中需要去呼叫 aos_cli_register_commands把这一条指定注册的 cli 模块中去,第四步编译烧录,第五步系统启动之后,然后用 help 来看添加的测试指令,第六步可以执行新增测试指令。
这就是那几步的展开说明,首先要包含 aos /cli.h 的头文件,然后要实现自己的命令行处理函数,假如说名字叫led_switch ,那要声明一下自己的这条命令对应一个重要数据结构叫 struct cli ,名字叫 led switch command,这条测试程序的一个测试指令名字就叫 LED switch,然后 help 里边输入说假如说 help 后面带着 on ,然后就会打印 turn on ,如果带 off 再打 turn off led to ,然后点 function 就是 led switch 这个函数的 point ,那 led_switch 里面实现的功能是怎么样的?
那先来看一下假如说参数为空,那就可以直接报错返回就可以了。接下来对第一个参数进行检查,假如说这个参数和 on 匹配并且跟 on 完全匹配,然后则打印 LED ON command received,然后如果跟 on 不完全匹配,则打印LED OFF command received,然后接下来要在组建或者是应用的始化函数中呼叫
aos_cli_register_commands ,然后把 led_switch_command 这条注册到 cli 组建中去,然后编译烧录之后系统启动插入 help ,然后就可以看到 LED switch 这条指令以及 LED switch 的一个说明了。假如说输入的是 LED switch on,它会打印 LED_ON command received 。
假如输入 led_switch off 则会打印 LED OFF command received。假如输入的是 led_switch o ,因为 o 与 on 不完全匹配,所以也会打印 LED OFF command received 。接下来对这个过程进行一下演示,还是用刚刚新创建的那个Neo components,进到该代码的下面,为了效率更快把刚刚的测试代码然后放到 cli _test.c 这个文件里面,来看这边生成了一个 led_switch,然后把这个 cli_switch_command 的结构体写在这个地方,然后实现 led_switch 的处理函数,如果检测到输入的参数是 on 就打印下来,这个地方写了一个函数去呼叫 aos_ cli_register_command,然后把它注册的 cli 指令模块当中去。接下来要在 aos.mk 里面把 cli test上的 .c 放到文件里面去,这样系统在编译的时候才会编译到这个文件。
然后再来看一下 new component.c 里边在刚刚的 new component welcome 里面去呼叫 component_cli_test_init,它就是刚刚注册 cli 指令的那个函数。
接下来就去看一下 workspace 里面去呼叫这个 new_comp 函数的地方,它呼叫这个 new component welcome 的时候,然后就会去向 cli 注册一条指令,这样来进行一下编译,同样是先执行一下 make,然后执行 helloworld_demo@haaseduk1-c config,等编译完成之后通过aos upload 将 helloworld_demo 这个应用程序收入到板子当中去。
这个时候再选择一个 port ,然后就开始进行。这边销售完成之后再新起一个窗口,然后来看一下第一个前面的串口是叫什么?启动 picocom ,现在这个时候来交流一下 help ,看一下新增加的指令 led switch已经添加到这个地方了,然后它后边的 help 写的是 on turn to turn off two ,然后来执行一下 led _switch,然后它打开 led_switch off,然后再输入一个,这样它提示的也是 LED off received,程序设计的逻辑是一样的。