SimonLiu的ESP8266与AliOS Things 学习教程系列之八:定时器实现

版权声明:本文为博主(SimonLiu)原创文章,未经博主允许不得转载。 https://blog.csdn.net/toopoo/article/details/87895998

欢迎加入交流群:ESP8266 AliOS Things 群 号: 107723112
系列文章目录:
SimonLiu的ESP8266与AliOS Things 学习教程系列目录

关于AliOS的定时器,网上现在还没有专门的文章阐述,但是关于yloop异步框架的文章有些涉及。SimonLiu阅读了一下AliOS Things的AliOS Things API KERNEL Guide 相关内容,得出的结论是AliOS Things实现定时器的方法有两种:第一种方式是利用yloop框架实现,第二种方式是通过aos的定时器api实现。

这里SimonLiu重新写了一个例程timertest(点击查看和下载源码),同时使用两种定时器的方法来打印信息。

1. 通过yloop异步框架实现定时器

实际上,在helloworld例程和SimonLiu的GPIO_LED例程UART例程中,都使用了yloop异步框架来实现定时执行某些函数。
本文例程代码如下:

int application_start(int argc, char *argv[])
{
/*这部分省略*/                         

    aos_post_delayed_action(1000, printMessage, NULL);
    
    aos_loop_run();

    return 0;
}
}

主程序入口application_start里面做了这件事:

  1. 调用aos_post_delayed_action创建了一个1000毫秒的一次性定时器(Yloop里面只有一次性定时器),1000毫秒后运行printMessage()
  2. 调用aos_loop_run进入事件循环

1秒后,定时器触发,printMessage()被调用,而printMessage()里面又做了2件事:

static void printMessage(void *arg)
{
    printf("[%06d]messager from  yloop\r\n" ,(unsigned)aos_now_ms());
    aos_post_delayed_action(1000, printMessage, NULL);
}

  1. 打印信息
  2. 再次创建一个1000毫秒的定时器,到时间执行printMessage()。这样每次运行printMessage()都会创建一个定时器,1000毫秒后运行,从而实现定时器。

2. 通过AliOS Things kernel api实现定时器

AliOS Things 的kernel api页面:AliOS Things API KERNEL Guide 列出了定时器的相关函数 :

31 aos_timer_new
32 aos_timer_free
33 aos_timer_start
34 aos_timer_stop
35 aos_timer_change

熟悉ESP8266 non_os SDK的朋友,应该对其中的定时器不陌生,AliOS Things的定时器api使用方法和ESP8266 non_os SDK定时器差不多,步骤如下:

  • 声明一个定时器变量
  • 声明定时器回调函数
  • 定时器回调函数实现
  • 创建定时器
  • 启动定时器
//声明一个定时器变量
aos_timer_t timer1; 

//声明定时器回调函数
void timer1_cb(void); 

//定时器回调函数实现
void timer1_cb(void)  
{
    printf("[%06d]messager from  timer\r\n" ,(unsigned)aos_now_ms());
}

然后在主程序入口中,创建并启动定时器:

   //创建定时器
    aos_timer_new(&timer1, timer1_cb, NULL, 1000, 1);   
    //启动定时器
    aos_timer_start(&timer1);         

猜你喜欢

转载自blog.csdn.net/toopoo/article/details/87895998