【FreeRTOS】软定时

一般系统利用 SysTick 作为软件定时器的基础时钟,软件定时器的回调函数类似硬件的中断服务函数,所以,回调函数也要快进快出,而且回调函数中不能有任何阻塞任务运行的情况(软件定时器回调函数的上下文环境是任务),比如 vTaskDelay()以及其它能阻塞任务运行的函数,两次触发回调函数的时间间隔xTimerPeriodInTicks叫定时器的定时周期。

  • 单次模式:当用户创建了定时器并启动了定时器后,定时时间到了,只执行一次回调函数之后就将该定时器删除,不再重新执行。
  • 周期模式:这个定时器会按照设置的定时时间循环执行回调函数,直到用户将定时器删除。
    【FreeRTOS】软定时_第1张图片

正常的创建、启动函数

  • 如果在 FreeRTOS 调度器开启之前调用 xTimerStart(),形参将不起作用
static TimerHandle_t Swtmr1_Handle =NULL; /* 软件定时器句柄 */
static TimerHandle_t Swtmr2_Handle =NULL; /* 软件定时器句柄 */
/* 周期模式的软件定时器 1,定时器周期 1000(tick)*/
Swtmr1_Handle=xTimerCreate((const char*)"AutoReloadTimer",
							(TickType_t)1000,/*  定时器周期 1000(tick) */
							(UBaseType_t)pdTRUE,/*  周期模式 */
							(void* )1,/*  为每个计时器分配一个索引的唯一 ID */
							(TimerCallbackFunction_t)Swtmr1_Callback); /*  回调函数 */
if (Swtmr1_Handle != NULL)
{
	xTimerStart(Swtmr1_Handle,0);  //开启周期定时器
}
/* 单次模式的软件定时器 2,定时器周期 5000(tick)*/
Swtmr2_Handle=xTimerCreate((const char* )"OneShotTimer",
							(TickType_t)5000,/*  定时器周期 5000(tick) */
							(UBaseType_t )pdFALSE,/*  单次模式 */
							(void*)2,/*  为每个计时器分配一个索引的唯一 ID */
							(TimerCallbackFunction_t)Swtmr2_Callback);
if (Swtmr2_Handle != NULL)
{
 	xTimerStart(Swtmr2_Handle,0);  //开启单次定时器
}
 
static void Swtmr1_Callback(void* parameter)
{
	/* 软件定时器的回调函数,用户自己实现 */
 }
 
static void Swtmr2_Callback(void* parameter)
{
 	/* 软件定时器的回调函数,用户自己实现 */
 }

中断内的启动

BaseType_t xHigherPriorityTaskWoken = pdFALSE;
 
 /* 确保液晶背光已经打开 */
 vSetBacklightState( BACKLIGHT_ON );
 
 /* 启动软件定时器 */
 if ( xTimerStartFromISR( xBacklightTimer,
 									&xHigherPriorityTaskWoken ) != pdPASS ) {
 /*  软件定时器开启命令没有成功执行 */
 }
 
 /* ...执行其他的按键相关的功能代码 */
 
 if ( xHigherPriorityTaskWoken != pdFALSE ) {
 /*  执行上下文切换 */
 }

停止函数

BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xBlockTime );

BaseType_t xTimerStopFromISR(TimerHandle_t xTimer,
							 BaseType_t *pxHigherPriorityTaskWoken);

软件定时器任务

软件定时器任务是在系统开始调度(vTaskStartScheduler()函数)的时候就被创建的,前提是将宏定义 configUSE_TIMERS 开启。

你可能感兴趣的:(FreeRTOS,FreeRTOS)