freertos软件定时器

哈喽,这篇文章是freertos解析的最后一篇文章.我们将会讲解一个利用任务延时实现的软件定时器.

 

1.创建

freertos软件定时器

freertos软件定时器

timer结构体和创建一目了然,看看初始化函数

freertos软件定时器

freertos软件定时器

是不是有点熟悉.timer的管理有点类似任务的管理.

如果是第一次创建则初始化timer列表和timer队列,队列结构体如下图

到这里是不是有点不知所然,不要着急接着往下看

freertos软件定时器

 

2.开始

#define xTimerStart( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) )

哦豁,原来是一个宏定义,大胆猜测这里使用了队列发送消息

freertos软件定时器

果然如此,封装了一个DaemonTaskMessage_t的message,然后发送队列消息.发送到哪里去了,一定是timer任务.

顺着思路看下timer的任务都处理什么事情.

 

3任务体

freertos软件定时器

任务就是在处理timer的消息,所有都是围绕着超时时间和队列进行.看一眼

freertos软件定时器

获取timer列表的最近一次超时时间.第一次当然是0

freertos软件定时器

1.如果列表不空并且timer超时,则进行超时处理

2.否则等待消息,.

先看1,如下

freertos软件定时器

1.把timer从列表中移除

2.如果是定时timer,则重新插入列表

3.调用timer注册的回调函数

再看2,如下

freertos软件定时器

1.加入timer的等待接收列表

2.timer任务加入等待列表

综上,进行上下文切换,任务调度

 

4.命令处理

freertos软件定时器

freertos软件定时器

处理命令.两种情况运行到这里,timer超时或者timer接收到命令

最后又回到了获取timer任务体的开始.

 

5.思考与总结

timer任务利用列表和队列实现了软件定时器.回想下刚才的过程,其实思路还是很清晰的.

亲爱的朋友,恭喜你,你已经完全掌握了freertos系统知识.

现在你可以自信的开始一段旅程了