歡迎加入交流群:ESP8266 AliOS Things 群 號: 107723112
所有教程請看 AliOS Things 入門教程系列
此教程在SimonLiu的CSDN博客同步更新莫湘。
關(guān)于AliOS的定時器尤蒿,網(wǎng)上現(xiàn)在還沒有專門的文章闡述幅垮,但是關(guān)于yloop異步框架的文章有些涉及腰池。SimonLiu閱讀了一下AliOS Things的AliOS Things API KERNEL Guide 相關(guān)內(nèi)容,得出的結(jié)論是AliOS Things實現(xiàn)定時器的方法有兩種:第一種方式是利用yloop框架實現(xiàn)示弓,第二種方式是通過aos的定時器api實現(xiàn)。
這里SimonLiu重新寫了一個例程timertest
(點擊查看和下載源碼)奏属,同時使用兩種定時器的方法來打印信息。
1. 通過yloop異步框架實現(xiàn)定時器
實際上囱皿,在helloworld例程和SimonLiu的GPIO_LED例程和UART例程中,都使用了yloop異步框架來實現(xiàn)定時執(zhí)行某些函數(shù)嘱腥。
本文例程代碼如下:
int application_start(int argc, char *argv[])
{
/*這部分省略*/
aos_post_delayed_action(1000, printMessage, NULL);
aos_loop_run();
return 0;
}
}
主程序入口application_start
里面做了這件事:
- 調(diào)用
aos_post_delayed_action
創(chuàng)建了一個1000毫秒的一次性定時器(Yloop里面只有一次性定時器),1000毫秒后運行printMessage()
齿兔。 - 調(diào)用
aos_loop_run
進(jìn)入事件循環(huán)
1秒后,定時器觸發(fā)分苇,printMessage()
被調(diào)用,而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);
}
- 打印信息
- 再次創(chuàng)建一個1000毫秒的定時器医寿,到時間執(zhí)行
printMessage()
。這樣每次運行printMessage()
都會創(chuàng)建一個定時器糟红,1000毫秒后運行乌叶,從而實現(xiàn)定時器盆偿。
2. 通過AliOS Things kernel api實現(xiàn)定時器
AliOS Things 的kernel api頁面:
AliOS Things API KERNEL Guide 列出了定時器的相關(guān)函數(shù) :
aos_timer_new
aos_timer_free
aos_timer_start
aos_timer_stop
aos_timer_change
熟悉ESP8266 non_os SDK
的朋友准浴,應(yīng)該對其中的定時器不陌生,AliOS Things的定時器api
使用方法和ESP8266 non_os SDK
定時器差不多乐横,步驟如下:
- 聲明一個定時器變量
- 聲明定時器回調(diào)函數(shù)
- 定時器回調(diào)函數(shù)實現(xiàn)
- 創(chuàng)建定時器
- 啟動定時器
//聲明一個定時器變量
aos_timer_t timer1;
//聲明定時器回調(diào)函數(shù)
void timer1_cb(void);
//定時器回調(diào)函數(shù)實現(xiàn)
void timer1_cb(void)
{
printf("[%06d]messager from timer\r\n" ,(unsigned)aos_now_ms());
}
然后在主程序入口中,創(chuàng)建并啟動定時器:
//創(chuàng)建定時器
aos_timer_new(&timer1, timer1_cb, NULL, 1000, 1);
//啟動定時器
aos_timer_start(&timer1);