上一篇简要的整理了一下环境搭建。一般调嵌入式代码,最好配好命令行输入,这样就能在调试的时候,方便执行固定的测试命令。Alios-Things里面已经有现成的CLI命令输入框架,只要打开相应的宏就能够直接用,我们在app/example/helloworld/Config.in中,加上select AOS_COMP_CLI,再像上一章那样,导出keil工程,编译就可以了。
--- a/app/example/helloworld/Config.in
+++ b/app/example/helloworld/Config.in
@@ -1,6 +1,7 @@
config AOS_APP_HELLOWORLD
bool "HelloWorld"
select AOS_COMP_OSAL_AOS
+ select AOS_COMP_CLI
help
Hello World
Alios-Things里默认给STM32配串口的code中(board\stm32f103rb-nucleo\startup\board.c)的输出在uart2口上,并且code中有个bug,就是无法响应串口输入信号,我调试后,发现配置串口GPIO的代码有点问题,将RX端的IO配成输出了,需要做如下修改(这个修改我已经弄成pull request提给Alios-things官方了,但可惜的是Alios-things在github上建的自动化验证平台配置有问题,所以导致我的pull request没有成功合入 - _- ||| , https://github.com/alibaba/AliOS-Things/pull/1115 ):
diff --git a/board/stm32f103rb-nucleo/drivers/stm32f1xx_hal_msp.c b/board/stm32f103rb-nucleo/drivers/stm32f1xx_hal_msp.c
index fb1a916..ca592d0 100644
--- a/board/stm32f103rb-nucleo/drivers/stm32f1xx_hal_msp.c
+++ b/board/stm32f103rb-nucleo/drivers/stm32f1xx_hal_msp.c
@@ -127,11 +127,15 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
PA2 ------> USART2_TX
PA3 ------> USART2_RX
*/
- GPIO_InitStruct.Pin = USART_TX_Pin|USART_RX_Pin;
+ GPIO_InitStruct.Pin = USART_TX_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ GPIO_InitStruct.Pin = USART_RX_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
这段修改后,编译烧录helloworld到STM32板子上接上串口,我们就可以输入了:
#
#
# Welcome to AliOS Things
nano entry here!
# help
====Build-in Commands====
====Support 4 cmds once, seperate by ; ====
help : print this
sysver : system version
reboot : reboot system
time : system time
ota : system ota
p : print memory
m : modify memory
echo : echo for command
exit : close CLI
devname : print device name
====User Commands====
tasklist : list all thread info
dumpsys : dump system info
loglevel : set sync log level
# tasklist
------------------------------------------------------------------------
Name State Prio StackSize MinFreesize Runtime %CPU Candidate
------------------------------------------------------------------------
dyn_mem_proc_task PEND 6 512 364 0 0.00 N
idle_task RDY 61 128 56 0 0.00 N
DEFAULT-WORKQUEUE PEND 20 512 396 0 0.00 N
timer_task PEND 5 512 348 0 0.00 N
main_task SLP 32 4096 3684 0 0.00 N
cli RDY 60 2048 1524 0 0.00 Y
------------------------------------------------------------------------
# dumpsys mm
---------------------------------------------------------------------------
[HEAP]| TotalSz | FreeSz | UsedSz | MinFreeSz | MaxFreeBlkSz |
| 0x00003818 | 0x000016E0 | 0x00002138 | 0x00001340 | 0x000012E0 |
---------------------------------------------------------------------------
[POOL]| PoolSz | FreeSz | UsedSz | BlkSz | MaxFreeBlkSz |
| 0x00000400 | 0x00000400 | 0x00000000 | 0x00000020 | 0x00000020 |
---------------------------------------------------------------------------
上面这些就是根据tasklist和dumpsys mm的输出,分别打印出的是当前进程,与堆内存的信息,后面章节我们会详细分析。
现在我们来添加一个自定义的命令。my_cmd xiaoming,命令中打印一个 " Hello,this is my cli cmd![xiaoming] "的打印。将helloworld.c代码修改如下:
#include <stdio.h>
#include <aos/kernel.h>
#include "cli/cli_api.h" //导入cli 头文件
static void my_cmd_func(char *buf, int len, int argc, char **argv)
{
printf("Hello, this is my cli cmd! [%s]\r\n", argv[1]);
}
struct cli_command_st my_cli_cmd[] = {
//添加命令名字,help说明,以及cmd入口函数,如果要加别的命令,可以在这个数组加多个对象
{ "my_cmd", "add my cmd to test", my_cmd_func },
};
int application_start(int argc, char *argv[])
{
int count = 0;
printf("nano entry here!\r\n");
int32_t num = sizeof(my_cli_cmd) / sizeof(struct cli_command_st);
cli_register_commands(&my_cli_cmd[0], num);
while(1) {
//为了删除烦人的每隔一秒打印,所以注释掉这里
//printf("hello world! count %d \r\n", count++);
aos_msleep(1000);
};
}
# help
====Build-in Commands====
====Support 4 cmds once, seperate by ; ====
help : print this
sysver : system version
reboot : reboot system
time : system time
ota : system ota
p : print memory
m : modify memory
echo : echo for command
exit : close CLI
devname : print device name
====User Commands====
tasklist : list all thread info
dumpsys : dump system info
loglevel : set sync log level
my_cmd : add my cmd to test
#
# my_cmd xiaoming
Hello, this is my cli cmd! [xiaoming]
#
如上,我们就添加了我们自定义的cmd,并且还能够传参进去。那么,基本的平台介绍我们分两章讲完了,后面我们会对Alios-things的一些核心常用的模块,进行比较细致的分析。