1. 程式人生 > >Freertos學習--初識任務函式

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 )

     {

         // 任務已經改變了其優先順序

     }

  }