【正文】
heduler()函數(shù)去啟動任務調度器,在啟動調度器之前必須要有一個任務。 Idle任務將不會進入 阻塞和暫停狀態(tài)。 Hook函數(shù)將會啟動 idle函數(shù)。 傳統(tǒng)處理的方法是在進入關鍵區(qū)域之前關閉中斷,在執(zhí)行關鍵區(qū)域之后打開中斷。關鍵區(qū)域將會使大于 5包含 5的中斷優(yōu)先級屏蔽掉。任務暫停機制提供了另外一個方式去保證在關鍵區(qū)域不去關閉中斷。從而任務的轉換將不會發(fā)生。 注意: 使用調度器暫停在運行到關 鍵區(qū)域時只是防止調度器跳轉到其他任務,而不是中斷。 11. 任務間的通信 SAFERTOS 提供了隊列的形式去進行任務間的相互通信。隊列是可以靈活使用的,可以用于簡單的數(shù)據(jù)交換,同步,信號行為。在任何時刻隊列可以擁有 0 或多個條目。當隊列確定后,它所擁有的條目是可控的。發(fā)送條目到隊列使用 xQueueSend(),xQueueSendFromISR(). 隊列是個 FIFO 結構。隊列是以字節(jié)復制的形式獲取數(shù)據(jù)。 任務將跳出阻塞狀態(tài)當其他的任務或者中斷取出一個條目從隊列中。 當使用 xQueueReceive()函數(shù)是,任務可指定等待一個空的隊列收到一個條目時間,任務就會跳出阻塞狀態(tài)。如果有多個任務等待事件,那第一個跳出阻塞狀態(tài)的是優(yōu)先級最高的任務。 12. 數(shù)據(jù)格式 隊列的數(shù)據(jù)事先定義一致,例如,結構體等。 注意: 如果數(shù)據(jù)是通過復制的方式進行獲取,必須確保獲取數(shù)據(jù)是一致的,多個任務要獲取數(shù)據(jù)必須協(xié)商一致,并且相互排斥。被允許獲得資源許可的任務將獲取信號量 ,在完成獲取資源后交回信號量。隊列可以設置為有一個條目,當任務取得這個條目時,隊列為空,其他任務將不能夠獲取信號量從而等待。 看例子: portBASE_TYPE xSemaphoreCreateBinary( xSemaphoreHandle *xCreatedHandle ) { /* The first two parameters define the memory buffer to be used to hold the created semaphore. 1 is the length of the queue being created (1 as this is a binary semaphore), 0 is the queue item size. pdPASS will be returned if the semaphore is created successfully. */ return xQueueCreate( pcBuffer, uxBufferLengthBytes, 1, 0, xCreatedHandle )。taken39。 } portBASE_TYPE xSemaphoreGive( xSemaphoreHandle xSemaphore ) { /* The queue item size is zero so we do not need to specify the buffer from which the sent data will be retrieved, therefore NULL is passed. */ return xQueueSend( xSemaphore, NULL, 0 )。 14. 任務和中斷通信 注意: 在中斷中不要應用 API函數(shù),這樣回導致任務進入阻塞狀態(tài),出于這個原因, xQueueSend()和 xQueueReceive()不能有中斷函數(shù)引用,而應該使用xQueueReceiveFromISR(),xQueueSendFromISR(). 通常 xQueueReceiveFromISR()和 xQueueSendFromISR()通常用在任務在中斷函數(shù)返回后繼續(xù)執(zhí)行。 15. 中斷 為了預測內存的使用情況和促進分析系統(tǒng)的行為,中斷處理應只收集事件數(shù)據(jù),清中斷。在中斷使能的條件下任務等級任務被執(zhí)行 注意: 最簡單的方法是,在調度器沒有運行之前關閉中斷。 SAFERTOS 預先集成在 ROM 中。 函數(shù) 主應用程序需要 提供 3 個 hook 函數(shù)。 vApplicationErrorHook()函數(shù)可使主應用去執(zhí)行特定的應用確保系統(tǒng)運行在安全的環(huán)境下。函數(shù)沒有返回 參數(shù)說明: ( B) vApplicationTaskDeleteHook(): 當任務退出時使用此函數(shù),功能是回收任務刪除后的內存空間。 xDeletedTask:任務的句柄將被刪除。 通常使用它來實現(xiàn)例如使用 idle hook 去實現(xiàn)低優(yōu)先級,特定任務的背景任務,或者簡單的將處理器運行在低功耗睡眠狀態(tài)。包含了 vApplicationIdleHook的代碼不要 引用 API函數(shù),這樣會導致 idle進入阻塞狀態(tài)。如果使用 hook 函數(shù)是處理器進入睡眠模式,請不要關閉滴答定時器。 注意: 第三章 API 參考目錄 這章提供了 API 的參考目錄,并分為如下幾個部分: 調度器控制函數(shù) 一、 任務功能 目錄: xTaskCreate() xTaskDelay() xTaskPriorityGet() xTaskSuspend() 這將移除所有 c 啟動代碼去執(zhí)行此任務。 pcInIdleTaskStackBuffer: 指向 idle 任務的任務棧的指針。 ulInIdleTaskStackSizeBytes: idle 任務??臻g的實際大小,以 bytes 為單位。 ulAdditionalStackCheckMarginBytes:當任務跳出運行狀態(tài)時,任務棧將會被存儲起來,如果存儲后的剩余棧空間小于 ulAdditionalStacCheckMarginBytes 時,任務錯誤 hook 函數(shù)將會被調用。 當溢出錯誤被發(fā)現(xiàn),則錯誤 hook 函數(shù)被調用而不進行環(huán)境的保存。 pxPortInitParameters:指向包含初始化數(shù)據(jù)的結構體。 參數(shù): 0 到 configMAX_PRIORITIES1,越小優(yōu)先級越低。 pxCreatedTask:通過哪個被創(chuàng)建的任務可以被引用來交回控制權。 返回值 errINVALID_BYTE_ALIGNMENT:任務棧指針指向地址與硬件沖突 創(chuàng)建的任務的處理權被返回在 pxCreatedTask 參數(shù)中。任務 創(chuàng)建的優(yōu)先級高于引用xTaskCreate() 任務優(yōu)先級,創(chuàng)建的任務會不等創(chuàng)建它的任務運行完成而直接運行。 如果任務擁有比 xTaskCreate()更高級別優(yōu)先級,那 在 關閉中斷時去引用 xTaskCreate()函數(shù)不能阻止被創(chuàng)建的任務進入運行狀態(tài)。中斷再次關閉當任務調用 xTaskCreate()再次進入運行狀態(tài)。調度器在暫停時調用 xTaskCreate()函數(shù)將會推延任何必要的環(huán)境轉換直到調度器再次進入運行狀態(tài)。在中斷中不要調用 xTaskCreate()函數(shù)。 參數(shù): 任務可以刪除自己通過傳遞 NULL 參數(shù)。 pdPASS:任務成功的刪除 注意: 刪除任務的句柄是無效的,若要刪除刪除任務將會引起錯誤。 xTaskDelete()函數(shù)在調度器初始化中不能引用。在調度器位于暫停狀態(tài)時, xTaskDelete()不能被引用。中斷中不能引用 xTaskDelete()函數(shù)。 xTaskDelete()不能刪除 idle 任務,除非有其他的任務被創(chuàng)建,且此任務不能 進入阻塞和等待狀態(tài)。一旦任務被刪除,其使用的內存 將被釋放。 4. 總述: 使任務進入阻塞狀態(tài)一定系統(tǒng)時間。 返回