FreeRTOS软件定时器的使用

先贴上一个创建的代码,先声明一个句柄

TimerHandle_t  pump_wakeup_timer_handle = NULL;

创建定时器和启动定时器,第三个参数,pdFALSE是只定时一次,pdTRUE是自动重载定时器,也就是一直循环。

if(pump_wakeup_timer_handle == NULL)
            {
                //定时器的第一个参数,字符串,定时器的名字
                //第二个参数,是定时时间,毫秒级别
                //第三个参数,只定时一次,还是自动加载
                //第4个参数吗,定时器的ID,一般为0
                //第5个参数,定时到了的回调函数
                pump_wakeup_timer_handle = xTimerCreate(NULL, (15000), pdFALSE, NULL, pump_wakeup_timeout_callback);
                //启动定时器
                //reset这个定时器
                if(xTimerStart(pump_wakeup_timer_handle, 0) != pdPASS)
                {
                    Report("timer start fail");
                }
            }

定时器回调函数,比如上面定时了15S,那么15S之后到了就会调用这个函数。

void pump_wakeup_timeout_callback(TimerHandle_t xTimer)
{
    if (pump_wakeup_timer_handle != NULL)
    {
        xTimerDelete(pump_wakeup_timer_handle, 0);
        pump_wakeup_timer_handle = NULL;
    }
    Report("task suspend");
}

问题记录,实际测试发现定时器启动函数,只能启动一次,如果启动之后,再次启动会产生问题,导致时间异常,总结起来就是定时器启动函数不会在内部检查是否已经启动了。我犯过这个错误,需要注意。

if(xTimerStart(pump_wakeup_timer_handle, 0) != pdPASS)

 

posted @ 2018-04-20 21:25  429512065  阅读(5714)  评论(0编辑  收藏  举报