安富萊電子 www.armfly.com
安富萊_STM32-V5開發(fā)板_FreeRTOS教程(V1.0)
FreeRTOS 時(shí)間相關(guān)的函數(shù)主要有以下 4 個(gè):
? vTaskDelay ()
? vTaskDelayUntil ()
? xTaskGetTickCount()
? xTaskGetTickCountFromISR()
FreeRTOS 的系統(tǒng)時(shí)鐘節(jié)拍可以在配置文件 FreeRTOSConfig.h 里面設(shè)置:
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )//配置系統(tǒng)時(shí)鐘1KHz军熏,即 1ms
二、使用例程
1.vTaskDelay?
函數(shù) vTaskDelay 用于任務(wù)的延遲祠墅。使用舉例:vTaskDelay(200);
static void vTaskMsgPro(void *pvParameters)
{
TickType_t xDelay, xNextTime;
const TickType_t xFrequency = 200;
/* 獲取 xFrequency 個(gè)時(shí)鐘節(jié)拍后的時(shí)間 */
xNextTime = xTaskGetTickCount() + xFrequency;
while(1)
{
bsp_LedToggle(3);
/* 用 vTaskDelay 實(shí)現(xiàn) vTaskDelayUntil() */
xDelay = xNextTime - xTaskGetTickCount();
xNextTime += xFrequency;
if(xDelay <= xFrequency)
{
vTaskDelay(xDelay);
}
}
}
2.vTaskDelayUntil
函數(shù) vTaskDelayUntil 用于周期性延遲,使用此函數(shù)需要在 FreeRTOSConfig.h 配置文件中配置如下宏定義為 1
#define INCLUDE_vTaskDelayUntil 1
/* vTaskDelayUntil 是絕對(duì)延遲,vTaskDelay 是相對(duì)延遲递递。*/
vTaskDelayUntil(&xLastWakeTime, xFrequency);
static void vTaskLED(void *pvParameters)
{
TickType_t xLastWakeTime;
const TickType_t xFrequency = 200;
/* 獲取當(dāng)前的系統(tǒng)時(shí)間 */
xLastWakeTime = xTaskGetTickCount();
while(1)
{
bsp_LedToggle(2);
/* vTaskDelayUntil 是絕對(duì)延遲混驰,vTaskDelay 是相對(duì)延遲。*/
vTaskDelayUntil(&xLastWakeTime, xFrequency);
}
}
3.xTaskGetTickCount
函數(shù) xTaskGetTickCount 用于獲取系統(tǒng)當(dāng)前運(yùn)行的時(shí)鐘節(jié)拍數(shù)通熄。此函數(shù)用于在任務(wù)代碼里面調(diào)用耙旦,如果在中斷服務(wù)程序里面調(diào)用的話脱羡,需要使用函數(shù)xTaskGetTickCountFromISR,這兩個(gè)函數(shù)切不可混用免都。
printf("當(dāng)前的系統(tǒng)時(shí)鐘節(jié)拍數(shù) = %d\r\n", xTaskGetTickCount());
4.xTaskGetTickCountFromISR
/*
*********************************************************************************************************
*? 函 數(shù) 名: TIM6_IRQHandler
*? 功能說(shuō)明: TIM6 中斷服務(wù)程序轻黑。
*? 形 參: 無(wú)
*? 返 回 值: 無(wú)
*********************************************************************************************************
*/
void TIM6_IRQHandler( void )
{
? ? TickType_t xTickCount;
? ? xTickCount = xTaskGetTickCountFromISR;
}