/*
作为实时操作系统的FreeRTOS给我们提供了一个软件实现的定时器。
很多朋友,也许没有使用过Timer。
这主要是开发板上硬件Timer太少了,轮不到我们最终用户使用。
FreeRTOS给我们打来了新的大门,只要内存允许,想要多少个Timer 就有多少个Timer。
本节课讲会通过智能汽车来给大家介绍两种Timer:重复性的和一次性的Timer
*/
/*
程序:Software Timer
API: xTimerCreate //创建时间
xTimerStart //时间开始
到时间后,会运行callback函数
*/
TimerHandle_t lockHandle, checkHandle;
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);
}
}
}
void lockCarCallback(TimerHandle_t xTimer) {
Serial.println("Timer CallBack: Car is Locked");
}
void checkCarCallback(TimerHandle_t xTimer){
//很复杂的检测汽车Sensors的方法,时间不定
Serial.print(xTaskGetTickCount());Serial.println(" - All Sensors are working."); vTaskDelay(random(10, 90));
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
xTaskCreate(carKey,
"Check If Owner Press Lock Button",
1024 * 1,
NULL,
1,
NULL);
lockHandle = xTimerCreate("Lock Car",
2000, //时间 2000tick=2s
pdFALSE, //一次性事件
(void *)0,
lockCarCallback);
checkHandle = xTimerCreate("Sensors Check",
100, //时间 2000tick=2s
pdTRUE, //一次性事件
(void *)1,
checkCarCallback);
//必须要在 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);
}
void loop() {
}