FreeRTOS(二)软件定时器

文章目录

      • 一、单次触发和自动重装载的软件定时器的区别
      • 二、创建软件定时器
      • 三、开启定时器
      • 四、关闭定时器
      • 四、给定时器分配ID
      • 五、更改定时器周期
      • 六、重启定时器

FreeRTOS参考文档

一、单次触发和自动重装载的软件定时器的区别

单次触发(one-shot)定时器启动后只会执行一次,不会自动重启。
自动重装载(auto-load)定时器会周期执行,执行完后会自动重启。

软件定时器两种状态:

  • 休眠(dormant)
  • 运行(running)

FreeRTOS(二)软件定时器_第1张图片

二、创建软件定时器

TimerHandle_t xTimerCreate( const char * const pcTimerName,
TickType_t xTimerPeriodInTicks,
UBaseType_t uxAutoReload,
void * pvTimerID,
TimerCallbackFunction_t pxCallbackFunction );

三、开启定时器

BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait );

四、关闭定时器

BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait );

#include "rtos_test.h"

//one-shot & periodic
u32 ulCallCount=0;
static void prvOneShotTimerCallback( TimerHandle_t xTimer )
{
    TickType_t xTimeNow;
    /* Obtain the current tick count. */
    xTimeNow = xTaskGetTickCount();
    /* Output a string to show the time at which the callback was executed. */
    vPrintStringAndNumber( "One-shot timer callback executing :%d", xTimeNow );
    /* File scope variable. */
    ulCallCount++;
}


static void prvAutoReloadTimerCallback( TimerHandle_t xTimer )
{
    TickType_t xTimeNow;
    /* Obtain the current tick count. */
    xTimeNow = xTaskGetTickCount();
    /* Output a string to show the time at which the callback was executed. */
    vPrintStringAndNumber( "Auto-reload timer callback executing :%d", xTimeNow );
    ulCallCount++;
}

/* The periods assigned to the one-shot and auto-reload timers are 3.333 second and half a
second respectively. */
#define mainONE_SHOT_TIMER_PERIOD  pdMS_TO_TICKS( 3333 )
#define mainAUTO_RELOAD_TIMER_PERIOD pdMS_TO_TICKS( 500 )
int main( void )
{
    TimerHandle_t xOneShotTimer, xAutoReloadTimer;
    BaseType_t xTimer1Started, xTimer2Started;
    BSP_Init();
    /* Create the one shot timer, storing the handle to the created timer in xOneShotTimer. */
    xOneShotTimer = xTimerCreate(
    /* Text name for the software timer - not used by FreeRTOS. */
    "OneShot",
    /* The software timer's period in ticks. */
    mainONE_SHOT_TIMER_PERIOD,
    /* Setting uxAutoRealod to pdFALSE creates a one-shot software timer. */
    pdFALSE,
    /* This example does not use the timer id. */
    0,
    /* The callback function to be used by the software timer being created. */
    prvOneShotTimerCallback );
    
    /* Create the auto-reload timer, storing the handle to the created timer in xAutoReloadTimer. */
    xAutoReloadTimer = xTimerCreate(
    /* Text name for the software timer - not used by FreeRTOS. */
    "AutoReload",
    /* The software timer's period in ticks. */
    mainAUTO_RELOAD_TIMER_PERIOD,
    /* Setting uxAutoRealod to pdTRUE creates an auto-reload timer. */
    pdTRUE,
    /* This example does not use the timer id. */
    0,
    /* The callback function to be used by the software timer being created. */
    prvAutoReloadTimerCallback );
    /* Check the software timers were created. */
    if( ( xOneShotTimer != NULL ) && ( xAutoReloadTimer != NULL ) )
    {
        /* Start the software timers, using a block time of 0 (no block time). The scheduler has
        not been started yet so any block time specified here would be ignored anyway. */
        xTimer1Started = xTimerStart( xOneShotTimer, 0 );
        xTimer2Started = xTimerStart( xAutoReloadTimer, 0 );
        /* The implementation of xTimerStart() uses the timer command queue, and xTimerStart()
        will fail if the timer command queue gets full. The timer service task does not get
        created until the scheduler is started, so all commands sent to the command queue will
        stay in the queue until after the scheduler has been started. Check both calls to
        xTimerStart() passed. */
        if( ( xTimer1Started == pdPASS ) && ( xTimer2Started == pdPASS ) )
        {
            /* Start the scheduler. */
            vTaskStartScheduler();
        }
    }
    /* As always, this line should not be reached. */
    for( ;; );
}

FreeRTOS(二)软件定时器_第2张图片

四、给定时器分配ID

void vTimerSetTimerID( const TimerHandle_t xTimer, void *pvNewID );

通过定时器ID在回调函数中对其进行操作。

#include "rtos_test.h"

TimerHandle_t xOneShotTimer, xAutoReloadTimer;

static void prvTimerCallback( TimerHandle_t xTimer )
{
    TickType_t xTimeNow;
    uint32_t ulExecutionCount;
    /* A count of the number of times this software timer has expired is stored in the timer's
    ID. Obtain the ID, increment it, then save it as the new ID value. The ID is a void
    pointer, so is cast to a uint32_t. */
    ulExecutionCount = ( uint32_t ) pvTimerGetTimerID( xTimer );
    ulExecutionCount++;
    vTimerSetTimerID( xTimer, ( void * ) ulExecutionCount );
    /* Obtain the current tick count. */
    xTimeNow = xTaskGetTickCount();
    /* The handle of the one-shot timer was stored in xOneShotTimer when the timer was created.
    Compare the handle passed into this function with xOneShotTimer to determine if it was the
    one-shot or auto-reload timer that expired, then output a string to show the time at which
    the callback was executed. */
    if( xTimer == xOneShotTimer )
    {
        vPrintStringAndNumber( "One-shot timer callback executing :%d", xTimeNow );
    }
    else
    {
        /* xTimer did not equal xOneShotTimer, so it must have been the auto-reload timer that
        expired. */
        vPrintStringAndNumber( "Auto-reload timer callback executing :%d", xTimeNow );
        if( ulExecutionCount == 5 )
        {
            /* Stop the auto-reload timer after it has executed 5 times. This callback function
            executes in the context of the RTOS daemon task so must not call any functions that
            might place the daemon task into the Blocked state. Therefore a block time of 0 is
            used. */
            xTimerStop( xTimer, 0 );
        }
    }
}

/* The periods assigned to the one-shot and auto-reload timers are 3.333 second and half a
second respectively. */
#define mainONE_SHOT_TIMER_PERIOD  pdMS_TO_TICKS( 3333 )
#define mainAUTO_RELOAD_TIMER_PERIOD pdMS_TO_TICKS( 500 )
int main( void )
{
    BaseType_t xTimer1Started, xTimer2Started;
    BSP_Init();
    /* Create the one shot timer, storing the handle to the created timer in xOneShotTimer. */
    /* Create the one shot timer software timer, storing the handle in xOneShotTimer. */
    xOneShotTimer = xTimerCreate( "OneShot",
    mainONE_SHOT_TIMER_PERIOD,
    pdFALSE,
    /* The timer’s ID is initialized to 0. */
    0,
    /* prvTimerCallback() is used by both timers. */
    prvTimerCallback );
    /* Create the auto-reload software timer, storing the handle in xAutoReloadTimer */
    xAutoReloadTimer = xTimerCreate( "AutoReload",
    mainAUTO_RELOAD_TIMER_PERIOD,
    pdTRUE,
    /* The timer’s ID is initialized to 0. */
    0,
    /* prvTimerCallback() is used by both timers. */
    prvTimerCallback );
    /* Check the software timers were created. */
    if( ( xOneShotTimer != NULL ) && ( xAutoReloadTimer != NULL ) )
    {
        /* Start the software timers, using a block time of 0 (no block time). The scheduler has
        not been started yet so any block time specified here would be ignored anyway. */
        xTimer1Started = xTimerStart( xOneShotTimer, 0 );
        xTimer2Started = xTimerStart( xAutoReloadTimer, 0 );
        /* The implementation of xTimerStart() uses the timer command queue, and xTimerStart()
        will fail if the timer command queue gets full. The timer service task does not get
        created until the scheduler is started, so all commands sent to the command queue will
        stay in the queue until after the scheduler has been started. Check both calls to
        xTimerStart() passed. */
        if( ( xTimer1Started == pdPASS ) && ( xTimer2Started == pdPASS ) )
        {
            /* Start the scheduler. */
            vTaskStartScheduler();
        }
    }
    /* As always, this line should not be reached. */
    for( ;; );
}

FreeRTOS(二)软件定时器_第3张图片

五、更改定时器周期

BaseType_t xTimerChangePeriod( TimerHandle_t xTimer,
TickType_t xNewTimerPeriodInTicks,
TickType_t xTicksToWait );

六、重启定时器

BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait );

你可能感兴趣的:(FreeRTOS)