freertos软件定时器
哈喽,这篇文章是freertos解析的最后一篇文章.我们将会讲解一个利用任务延时实现的软件定时器.
1.创建
timer结构体和创建一目了然,看看初始化函数
是不是有点熟悉.timer的管理有点类似任务的管理.
如果是第一次创建则初始化timer列表和timer队列,队列结构体如下图
到这里是不是有点不知所然,不要着急接着往下看
2.开始
#define xTimerStart( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) )
哦豁,原来是一个宏定义,大胆猜测这里使用了队列发送消息
果然如此,封装了一个DaemonTaskMessage_t的message,然后发送队列消息.发送到哪里去了,一定是timer任务.
顺着思路看下timer的任务都处理什么事情.
3任务体
任务就是在处理timer的消息,所有都是围绕着超时时间和队列进行.看一眼
获取timer列表的最近一次超时时间.第一次当然是0
1.如果列表不空并且timer超时,则进行超时处理
2.否则等待消息,.
先看1,如下
1.把timer从列表中移除
2.如果是定时timer,则重新插入列表
3.调用timer注册的回调函数
再看2,如下
1.加入timer的等待接收列表
2.timer任务加入等待列表
综上,进行上下文切换,任务调度
4.命令处理
处理命令.两种情况运行到这里,timer超时或者timer接收到命令
最后又回到了获取timer任务体的开始.
5.思考与总结
timer任务利用列表和队列实现了软件定时器.回想下刚才的过程,其实思路还是很清晰的.
亲爱的朋友,恭喜你,你已经完全掌握了freertos系统知识.
现在你可以自信的开始一段旅程了