摘要: 怎么才能在RTOS系统中,经过 串口shell控制LED的开关。linux
在平常嵌入式开发中,咱们常常会用串口命令来使设备进入某种特定的状态,或执行某个特定的操做。如系统自检,模拟运行,或者进入手动模式进行设备点动。linux下有强大的shell工具,可让用户和片上系统进行交互,而在传统的单片机系统中,用户每每须要自行实现一套相似的交互工具。AliOS-Things原生带有一套名为cli(command-line interface)的命令行交互工具,在提供基本的系统交互命令的基础上,也支持用户自定义命令。本文将介绍如何自定义cli命令并执行。ios
咱们经过在《【AliOS Things学习笔记】在Developerkit开发板上运行blink例程》基础上,注册一个cli命令,经过命令行的方式控制LED的亮灭的例子,来演示一个带有参数的cli命令如何被注册以及调用。shell
首先,咱们先保证Developerkit的原有cli功能可用。将开发板经过USB链接线和PC链接。windows
windows用户经过设备管理器确认开发板所虚拟出的串口号,MAC和linux用户可用在终端中输入以下命令来查看USB串口是否已正确链接。数组
ls /dev/tty.*
若是出现以下设备列表,则表示链接正确。usbmodem后的数字可能会由于计算机不一样而不一样。缓存
/dev/tty.usbmodem14103
此时,可用打开PC上的串口调试工具,设置对应的串口,波特率默认为115200bps。建议串口调试助手具有终端功能,这样会在cli的使用中有更好的体验。接下来我将以植入VScode中的aos-cube工具的串口监视器功能为例进行演示。打开VScode,确保已经按照alios-studio和aos-cube插件。点击alios-studio工具条中的“插头”按钮,启动串口monitorapp
若是工具没能正确地打开串口,也能够尝试在控制台中使用命令行的方式启动串口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命令oop
# 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函数具备固定的形式和参数,参考上述函数实现,用户只须要修改函数名,请保持参数与上述函数一致,参数的意义以下:
参数名称 |
参数描述 |
char *pwbuf |
当函数执行完成返回时,经过控制台打印出来的字符串指针。能够不传入。 |
int blen |
上述字符串长度 |
int argc |
命令调用时传入的参数长度,没有参数传入时为1 |
char **argv |
传入参数缓存,字符串。第一个有效参数的角标从1开始。 |
接下来填写注册用结构体,以便将命令信息传递给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功能吧!