欢迎加入交流群:ESP8266 AliOS Things 群 号: 107723112
所有教程请看 AliOS Things 入门教程系列
此教程在SimonLiu的CSDN博客同步更新。
关于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
里面做了这件事:
- 调用
aos_post_delayed_action
创建了一个1000毫秒的一次性定时器(Yloop里面只有一次性定时器),1000毫秒后运行printMessage()
。 - 调用
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);
}
- 打印信息
- 再次创建一个1000毫秒的定时器,到时间执行
printMessage()
。这样每次运行printMessage()
都会创建一个定时器,1000毫秒后运行,从而实现定时器。
2. 通过AliOS Things kernel api实现定时器
AliOS Things 的kernel api页面:
AliOS Things API KERNEL Guide 列出了定时器的相关函数 :
aos_timer_new
aos_timer_free
aos_timer_start
aos_timer_stop
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);