1.问题产生
首先是一段Ticker的标准代码
#include <Ticker.h>
Ticker t1;
void callback()
{
}
void setup()
{
t1.attach(1,callback);
}
void loop()
{
}
解释:每间隔1秒钟调用callback函数
在现实情况中,我们往往需要多个时钟中断,但是新的attach会覆盖旧的attach。
t1.attach(1,callback01);
t1.attach(1,callback02);
此时只会执行callback02,而callback01回调被覆盖。
因此,需要一种更便捷有效的方式实现多个回调函数的中断
2.代码思路
①构建addAlarm
函数用来实现计时器添加
②通过queue队列
,实现存储addAlarm添加的Ticker对象。
③addAlarm函数入口参数,seconds
和callback
,前者存储要计时的秒数,后者是回调函数指针
3.源代码
#include <Ticker.h>
#include <queue>
#include <iostream>
std::queue<Ticker> alarmline; //闹钟对象的队列
void addAlarm(unsigned long seconds, void(*callback)(void))
{
Ticker t;
alarmline.push(t);
alarmline.back().attach(seconds,callback);
//必须push到队列里,否则函数退出实例化的Ticker会被回收
}
void setup()
{
Serial.begin(115200);
Serial.println('\n');
addAlarm(1, [](){ Serial.println("Alarm 1"); });
//这里纯属为了方便用了lamdba表达式
addAlarm(3, [](){ Serial.println("Alarm 2"); });
}
void loop()
{
}
4.结语
使用队列为管理计时器提供了很好的方案,后续便于删除(pop),以及检索。(代码中未呈现)