2.4 freertos时间管理
2..4.1 设置时钟节拍
时钟节拍是系统的心跳,也是最小的时间单元。freertos的时间节拍由systick提供。
//在FreeRTOSConfig.h 中设置
//时钟节拍是1ms
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
2.4.2时间相关函数
vTaskDelay:相对延时 。实际项目中经常会常用
vTaskDelayUntil:绝对延时
xTaskGetTickCount:获得当前系统运行的节拍数 。实际项目中经常会常用
xTaskGetTickCountFromISR:在中断服务程序中获得系统运行节拍数
2.4.2.1 vTaskDelay
相对延时vTaskDelay。等待时间相当于阻塞,会执行其它任务。
void task_test(void* pvParameters)
{
while(1)
{
printf("绝对延时\r\n");
vTaskDelay(100);//大多数情况下任务中都要有这个,让任务处于阻塞态让其它任务执行
}
}
大多数的延时是用这个。但精度不高可能会存在几个节拍的误差。
2.4.2.2 vTaskDelayUntil
绝对延时vTaskDelayUntil,等待时间相当于阻塞但优先级最高,一旦时间到马上开始执行。
void vTaskDelayUntil( TickType_t *pxPreviousWakeTime,
const TickType_t xTimeIncrement );
//使用示例
void task_test(void* pvParameters)
{
TickType_t LastTime;
xLastWakeTime = xTaskGetTickCount();//获得系统当前运行的时间
//在中断中使用 xTaskGetTickCountFromISR 获得运行时间
while(1)
{
printf("绝对延时\r\n");
vTaskDelayUntil(&LastTime, 100);
}
}
*/
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);
}
}
2.4.2.3 xTaskGetTickCount()
获得系统当前运行的节拍数。
函数原型:volatile TickType_t xTaskGetTickCount( void );
应用示例:
void task_test(void* pvParameters)
{
TickType_t start_time;
while(1)
{
if((flag==1)&&(TaskGetTickCount()-start_time>3000))
{
......................................
}
else if(flag==0)
{
start_time =TaskGetTickCount();
}
vTaskDelay(100);
}
}