安富萊電子 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;
}