简介
本章实现重复性定时器和一次性定时器。
通过智能汽车来实现以上两种定时器,重复性定时器应用在每100ms的传感器检测,一次性定时器应用在关闭汽车后备箱门上。
API:
xTimerCreate //创建时间
xTimerStart //时间开始
到时间后,会运行callback函数
软件定时器的实现一般需要经历三个步骤:1.定时器任务的创立;2.定时器开始计时;3.达到定时时间后运行回调函数
程序实现
首先,创建两个句柄,lockHandle, checkHandle。
TimerHandle_t lockHandle, checkHandle;
在setup()函数内创建锁车定时器,以及创建锁车任务
xTaskCreate(carKey,
"Check If Owner Press Lock Button",
1024 * 1,
NULL,
1,
NULL);
lockHandle = xTimerCreate("Lock Car",
2000,
pdFALSE,
(void *)0, //任务ID
lockCarCallback);
编写锁车任务的函数
void carKey(void *ptParam) {
byte lockPin = 23;
pinMode(lockPin, INPUT_PULLUP);
for (;;) {
if (digitalRead(lockPin) == LOW) {
//timeout 3000 ticks
//xTimerStart 只是开启时间而已,而不是创造时间对象
//所以如果多次按按钮的话,不会有多个时间对象生成
//多次按按钮相当于每次对timer进行reset xTimerReset()
if (xTimerStart(lockHandle, 3000) == pdPASS) {
Serial.println("About to lock the car");
} else {
Serial.println("Unable to lock the car");
};
vTaskDelay(100); //very rude Button Debounce
}
}
}
定时器计时2S完成后,运行回调函数
void lockCarCallback(TimerHandle_t xTimer) {
Serial.println("Timer CallBack: Car is Locked");
}
在setp()函数内创建传感器检测定时器,并开启定时器计时
checkHandle = xTimerCreate("Sensors Check",
100,
pdTRUE,
(void *)1,
checkCallback);
//必须要在 portMAX_DELAY 内开启 timer start
//portMAX_DELAY is listed as value for waiting indefinitely
//实际上0xFFFFFFFF 2^32-1 49天 7周
//在此期间,此task进入Block状态
xTimerStart(checkHandle, portMAX_DELAY);
创建传感器检测定时器回调函数,实现打印出当前的Tick时间
void checkCallback(TimerHandle_t xTimer) {
// ------- 很复杂的检测汽车Sensors的方法,时间不定 ---------
Serial.print(xTaskGetTickCount());Serial.println(" - All Sensors are working."); vTaskDelay(random(10, 90));
}
运行环境
网址:软件定时器