安富莱电子 www.armfly.com
安富莱_STM32-V5开发板_FreeRTOS教程(V1.0)
FreeRTOS 时间相关的函数主要有以下 4 个:
vTaskDelay ()
vTaskDelayUntil ()
xTaskGetTickCount()
xTaskGetTickCountFromISR()
FreeRTOS 的系统时钟节拍可以在配置文件 FreeRTOSConfig.h 里面设置:
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )//配置系统时钟1KHz,即 1ms
二、使用例程
1.vTaskDelay
函数 vTaskDelay 用于任务的延迟。使用举例:vTaskDelay(200);
static void vTaskMsgPro(void *pvParameters)
{
TickType_t xDelay, xNextTime;
const TickType_t xFrequency = 200;
/* 获取 xFrequency 个时钟节拍后的时间 */
xNextTime = xTaskGetTickCount() + xFrequency;
while(1)
{
bsp_LedToggle(3);
/* 用 vTaskDelay 实现 vTaskDelayUntil() */
xDelay = xNextTime - xTaskGetTickCount();
xNextTime += xFrequency;
if(xDelay <= xFrequency)
{
vTaskDelay(xDelay);
}
}
}
2.vTaskDelayUntil
函数 vTaskDelayUntil 用于周期性延迟,使用此函数需要在 FreeRTOSConfig.h 配置文件中配置如下宏定义为 1
#define INCLUDE_vTaskDelayUntil 1
/* vTaskDelayUntil 是绝对延迟,vTaskDelay 是相对延迟。*/
vTaskDelayUntil(&xLastWakeTime, xFrequency);
static void vTaskLED(void *pvParameters)
{
TickType_t xLastWakeTime;
const TickType_t xFrequency = 200;
/* 获取当前的系统时间 */
xLastWakeTime = xTaskGetTickCount();
while(1)
{
bsp_LedToggle(2);
/* vTaskDelayUntil 是绝对延迟,vTaskDelay 是相对延迟。*/
vTaskDelayUntil(&xLastWakeTime, xFrequency);
}
}
3.xTaskGetTickCount
函数 xTaskGetTickCount 用于获取系统当前运行的时钟节拍数。此函数用于在任务代码里面调用,如果在中断服务程序里面调用的话,需要使用函数xTaskGetTickCountFromISR,这两个函数切不可混用。
printf("当前的系统时钟节拍数 = %d\r\n", xTaskGetTickCount());
4.xTaskGetTickCountFromISR
/*
*********************************************************************************************************
* 函 数 名: TIM6_IRQHandler
* 功能说明: TIM6 中断服务程序。
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void TIM6_IRQHandler( void )
{
TickType_t xTickCount;
xTickCount = xTaskGetTickCountFromISR;
}