1.1FreeRTOS 的时钟节拍

时钟节拍是特定的周期性中断,这个中断可以看做是系统心跳。

一般是 1ms – 100ms

滴答定时器 Systick SysTick 定时器被捆绑在 NVIC 中,用于产生 SysTick 异常(异常号:15),滴答定时器是一个 24 位 的递减计数器,支持中断。使用比较简单,专门用于给操作系统提供时钟节拍。

#define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) 如上所示的宏定义配置表示系统时钟节拍是 1KHz,即 1ms。

1.2FreeRTOS 的时间管理

时间管理功能是 FreeRTOS 操作系统里面最基本的功能

1.2.1时间延迟

延迟函数主要有以下两个作用:

  • 为周期性执行的任务提供延迟。

对于抢占式调度器,让高优先级任务可以通过时间延迟函数释放 CPU 使用权,从而让低优先级任务 可以得到执行。

1.2.2时间相关函数

  • vTaskDelay (const TickType_t xTicksToDelay)
    • 参数 xTicksToDelay 用于设置延迟的时钟节拍个数,范围 1- 0xFFFFFFFF。
    • 延迟时间的最大值在 portmacro.h 文件里面有定义: typedef uint32_t TickType_t; #define portMAX_DELAY ( TickType_t )0xffffffffUL 即延迟时间的范围是:1- 0xFFFFFFFF
  • vTaskDelayUntil (TickType_t *pxPreviousWakeTime, const TickType_t xTimeIncrement)
    • 绝对的时间
    • 第 1 个参数,存储任务上次处于非阻塞状态时刻的变量地址。
    • 第 2 个参数,周期性延迟时间。
/* 获取当前的系统时间 */
 xLastWakeTime = xTaskGetTickCount();
 
 vTaskDelayUntil(&xLastWakeTime, 200);
  • xTaskGetTickCount(void)

此函数用于在任务代码里面调用,如果在中断服务程序里面调用的话,需要使用函数 xTaskGetTickCountFromISR,这两个函数切不可混用。

  • xTaskGetTickCountFromISR(void)

1.2.3函数 vTaskDelay 和 vTaskDelayUntil 的区别

delay是时间相加,delayuntil是整段时间就这么多。