Freertos學習--初識任務函式
Freertos泛泛看了很多相關文章,有點頭緒,除了不太喜歡其變數的名字,其他的倒還可以接受。先來認識一下Freertos任務函式,看看這個系統是怎麼操作任務的。(以下例子大部分來自網路)
1.任務建立
signed portBASE_TYPE xTaskCreate(
pdTASK_CODE pvTaskCode, --指向任務的入口函式
const signed portCHAR * const pcName, --任務的名字
unsigned portSHORT usStackDepth, --指定任務堆疊的大小 ,堆疊能保護變數的數目-
void *pvParameters, --指標用於作為一個引數傳向建立的任務
unsigned portBASE_TYPE uxPriority, --任務的優先順序
xTaskHandle *pxCreatedTask )--用於傳遞一個處理
例子:
xTaskCreate( StarTask , ( signed portCHAR * ) "StarTask ", 128, NULL, tskIDLE_PRIORITY, NULL );
我們先按任務建立函式設定好任務的入口名字StarTask ,任務名字StarTask ,堆疊大小128,優先順序等,然後編寫我們任務StarTask 的內容,下面就是任務StarTask函式:
void StarTask (void *pvParameter)
{}
2.任務刪除
void vTaskDelete( xTaskHandle pxTaskToDelete )
例子:
void vOtherFunction( void )
{
xTaskHandle xHandle;
// 建立任務,儲存處理
xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
// 使用處理來刪除任務.
vTaskDelete( xHandle );
}
注:INCLUDE_vTaskDelete必須定義為1,這個函式才能可用
3.任務延時
void vTaskDelay( portTickType xTicksToDelay );
例子:
const portTickType xDelay = 1000/ portTICK_RATE_MS;
注:INCLUDE_vTaskDelay必須設定為1,這個函式才為可用。
4.任務延時--延時一個任務到指定時間
void vTaskDelayUntil(
portTickType *pxPreviousWakeTime, --指定一個變數來掌握任務最後開啟的時間, 這個變數在第一次使用中(參考下面的例子)必須 使用當前時間來初始化
portTickType xTimeIncrement );--迴圈週期時間。任務將在一定時間開啟 (*pxPreviousWakeTime + xTimeIncrement)
例子:
void vTaskFunction( void * pvParameters )
注:INCLUDE_vTaskDelayUntil 必須定義為1,此函式才能用。
5.獲取任務優先順序
unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask );
7.任務掛起或暫停
void vTaskSuspend(
xTaskHandle pxTaskToSuspend ); --處理需要掛起的任務。傳遞NULL將掛起呼叫此函式的任務。
例子:
void vAFunction( void )
{
xTaskHandle xHandle;
// 建立任務,儲存控制代碼
xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
// ...
// 使用此控制代碼來掛起建立的任務
vTaskSuspend( xHandle );
// ...
// 建立的任務不會在這期間執行,除非
// 其他任務呼叫 vTaskResume( xHandle )
//...
// 掛起自己
vTaskSuspend( NULL );
// 不能執行到這裡,除非另一個任務呼叫vTaskResume
}
注:設定INCLUDE_vTaskSuspend 為1,此函式才能使用。
8.任務恢復
void vTaskResume( xTaskHandle pxTaskToResume );
9.啟動核心
void vTaskStartScheduler( void );
必須是呼叫 vTaskSuspend () 後掛起的任務,才有可能通過呼叫 vTaskResume ()重新執行。
例子:
注:設定INCLUDE_vTaskSuspend為1,此函式才能使用。
void vAFunction( void )
{
xTaskHandle xHandle;
// 建立任務,儲存控制代碼
xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
// ...
// 使用此控制代碼來掛起建立的任務
vTaskSuspend( xHandle );
// ...
// 建立的任務不會在此期間執行,除
// 另外一個任務呼叫 vTaskResume( xHandle )
//...
// 喚醒自己
vTaskResume( xHandle );
}
例子:
注:設定INCLUDE_vTaskPriorityGet 為1,此函式才能用。
6.設定任務優先順序
void vTaskPrioritySet(
xTaskHandle pxTask, --需要設定優先順序的任務。當傳遞NULL,將設定呼叫任務的優先順序
unsigned portBASE_TYPE uxNewPriority );--任務需要設定的優先順序
例子:
void vAFunction( void )
{
xTaskHandle xHandle;
// 建立任務,準備處理
xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
// 使用其控制代碼來提高建立任務的優先順序
vTaskPrioritySet( xHandle, tskIDLE_PRIORITY + 1 );
// 使用NULL處理,來提高優先順序到同一個值
vTaskPrioritySet( NULL, tskIDLE_PRIORITY + 1 );
}
注:設定INCLUDE_vTaskPrioritySet為1,才能使用此函式
{
portTickType xLastWakeTime;
const portTickType xFrequency = 10;
// 使用當前時間 初始化xLastWakeTime 變數
xLastWakeTime = xTaskGetTickCount();
for( ;; )
{
// 等待下一個迴圈
vTaskDelayUntil( &xLastWakeTime, xFrequency );
// 執行區域
}
}
for( ;; )
{
/* 簡單的每 500ms觸發LED, .在每兩次觸發間掛起*/
vONLED();
vTaskDelay( xDelay );
}
xTicksToDelay 是指延時的時間片個數,
void vAFunction( void )
{
xTaskHandle xHandle;
// 建立任務,準備處理
xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
// / 使用 tskIDLE_PRIORITY建立, 但是可能改
if( uxTaskPriorityGet( xHandle ) != tskIDLE_PRIORITY )
{
// 任務已經改變了其優先順序
}
}