AliOS-Things+STM32 (二)一个带命令行的helloworld

上一篇简要的整理了一下环境搭建。一般调嵌入式代码,最好配好命令行输入,这样就能在调试的时候,方便执行固定的测试命令。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的一些核心常用的模块,进行比较细致的分析。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值