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 ); /* 任務控制代碼 */