1. 程式人生 > >freeRTOS 一步步學習(一)

freeRTOS 一步步學習(一)

源自:http://www.FreeRTOS.org    

文件名:  USING THE FREERTOS REAL TIME KERNEL   中文: FREERTOS實時核心實用指南

 翻譯作者----》》》》》》》》》》》》》》》》》》》》》》》》》》

硬實時功能必須在給定的時間限制之內完成——如果無法做到即意味著整個系統的絕對失敗。大多數嵌入式系統不僅能滿足硬實時要求,也能滿足軟實時要求。 

FreeRTOS 中,每個執行執行緒都被稱為”任務”。在嵌入式社群中,對此並沒有一個公允的術語,但我更喜歡用”任務”而不是”執行緒”,因為從以前的經驗來看,執行緒具有更多的特定含義。 

 任務函式
任務是由 C 語言函式實現的。唯一特別的只是任務的函式原型,其必須返回 void,
而且帶有一個 void 指標引數。 

void ATaskFunction( void *pvParameters ); 

每個任務都是在自己許可權範圍內的一個小程式。其具有程式入口,通常會執行在一
個死迴圈中,也不會退出。 

FreeRTOS 任務不允許以任何方式從實現函式中返回——它們絕不能有一
條”return”語句,也不能執行到函式末尾。如果一個任務不再需要,可以顯式地將其刪除。 一個任務函式可以用來建立若干個任務——創建出的任務均是獨立的執行例項,擁有屬於自己的棧空間,以及屬於自己的自動變數(棧變數),即任務函式本身定義的變數。 

任務中建立多個任務與獨立建立多個任務的區別

包含式

  /* Init task */
  xTaskCreate(Main_task, (int8_t *)"Main", configMINIMAL_STACK_SIZE * 2, NULL,MAIN_TASK_PRIO, NULL);

/**
  * @brief  Main task
  * @param  pvParameters not used
  * @retval None
  */
void Main_task(void * pvParameters)
{

  xTaskCreate(vTask1, (int8_t *)"Task1", configMINIMAL_STACK_SIZE, NULL, LED_TASK_PRIO, NULL);

  xTaskCreate(vTask2, (int8_t *)"Task2", configMINIMAL_STACK_SIZE, NULL, LED_TASK_PRIO, NULL);

  xTaskCreate(vTask3, (int8_t *)"Task3", configMINIMAL_STACK_SIZE, NULL, LED_TASK_PRIO, NULL);

  for( ;; )
  {
    vTaskDelete(NULL);
  }
}

獨立的

xTaskCreate(    vTask1,     /* 任務函式  */
                    "Task 1",   /* 任務名    */
                    500,        /* stack大小,單位word,也就是4位元組 */
                    NULL,       /* 任務引數  */
                    1,          /* 任務優先順序*/
                    NULL );     /* 任務控制代碼  */

xTaskCreate(    vTask2,     /* 任務函式  */
                    "Task 2",   /* 任務名    */
                    500,        /* stack大小,單位word,也就是4位元組 */
                    NULL,       /* 任務引數  */
                    2,          /* 任務優先順序*/
                    NULL );     /* 任務控制代碼  */

xTaskCreate(    vTask3,     /* 任務函式  */
                    "Task 3",   /* 任務名    */
                    500,        /* stack大小,單位word,也就是4位元組 */
                    NULL,       /* 任務引數  */
                    3,          /* 任務優先順序*/
                    &xHandleTask3 );     /* 任務控制代碼  */