10.31 FreeRTOS+POSIX之任務管理API詳解

FreeRTOS概述

在嵌入式領域中,嵌入式實時操作系統正得到越來越廣泛的應用。採用嵌入式實時操作系統(RTOS)可以更合理、更有效地利用CPU的資源,簡化應用軟件的設計,縮短系統開發時間,更好地保證系統的實時性和可靠性。FreeRTOS是一個迷你的實時操作系統內核。作為一個輕量級的操作系統,功能包括:任務管理、時間管理、信號量、消息隊列、內存管理、記錄功能、軟件定時器、協程等,可基本滿足較小系統的需要。相對μC/OS-II、embOS等商業操作系統,FreeRTOS操作系統是完全免費的操作系統,具有源碼公開、可移植、可裁減、調度策略靈活的特點,可以方便地移植到各種單片機上運行。目前,FreeRTOS已經發展到支持包含X86,ARM、Xilinx,Altera等多種的硬件平臺,其廣闊的應用前景已經越來越受到業內人士的矚目。

由EE Times(EE Times是一家電子行業雜誌,自1972年開始在美國發行)發佈的2017年嵌入式市場調研報告關於嵌入式操作系統的使用情況可知FreeRTOS佔據份額為20%,排名第二。

FreeRTOS+POSIX之任務管理API詳解

EE Times的2017年嵌入式市場調研報告中還對未來一年內考慮使用的嵌入式實時操作做了調研,FreeRTOS以%28位列第一。以上調研結果在一定程度上反應了FreeRTOS使用的廣泛性。

FreeRTOS+POSIX之任務管理API詳解

FreeRTOS+POSIX概述

可移植操作系統接口(Portable Operating System Interface,縮寫為POSIX)是IEEE為要在各種UNIX操作系統上運行軟件,而定義API的一系列互相關聯的標準的總稱,其正式稱呼為IEEE Std 1003,而國際標準名稱為ISO/IEC 9945。它基本上是Portable Operating System Interface(可移植操作系統接口)的縮寫,而X則表明其對Unix API的傳承。FreeRTOS + POSIX實現了POSIX線程 API 的子集。藉助FreeRTOS + POSIX,可以輕鬆將現有的POSIX兼容應用程序移植到FreeRTOS生態系統。FreeRTOS + POSIX部分實現了IEEE Std 1003.1-2017 Edition The Open Group Technical Standard Base Specification,Issue 7。

FreeRTOS + POSIX主要實現了任務管理、互斥量、條件變量、消息隊列和時鐘/定時器等POSIX接口功能。

FreeRTOS+POSIX之任務管理API詳解

FreeRTOS+POSIX任務管理

pthread_create() 創建任務

該接口使用指定的屬性 attr 創建一個新的任務,如果 attr 為空,則使用默認的任務屬性。在任務創建後修改 attr 中的屬性值是無效的,並不會影響當前任務的屬性。任務創建成功, pthread_create()接口通過參數 thread 返回所創建任務的 ID。被創建的任務使用參數 arg作為start_routine 執行的唯一參數。

pthread_equal() 比較任務 ID

該接口用於比較任務的 ID,如果 t1 和 t2 相等,返回非零;否則返回零。

pthread_exit() 任務退出

該接口終止當前任務,同時使 value_ptr 的值對於任意等待該任務終止的其他任務可用。任務終止的過程中,那些已經壓棧但還沒出棧的取消處理函數都會以與入棧相反的順序出棧並執行。如果任務有私有數據,那麼在所有的取消處理函數被執行之後,任務會調用這些私有數據的析構函數。任務終止會釋放一些系統資源,如互斥信號量和文件描述符等。任務終止後,訪問任務的本地(自動)變量的結果是不確定的。因此,任務的本地變量不能作為參數值給pthread_exit()的。

pthread_join() 等待任務終止

該接口將掛起調用任務,直到參數 thread 指定的任務終止。用非空的參數 value_ptr 調用

pthread_join(),則在 pthread_join()成功返回時,任務 thread 會將傳遞給 pthread_exit()的值賦值給value_ptr 所引用的區域。 pthread_join()成功返回就表明任務 thread 已經終止。一個 joinable 狀態下的任務終止後,該任務的內存資源不會被釋放,直到有任務對它使用pthread_join()時才被釋放,因此必須對創建為 PTHREAD_CREATE_JOINABLE 的任務調用一次pthread_join(),以避免內存洩露。 pthread_join()是一個取消點,即如果任務在 pthread_join()中等待時被取消,該任務將立即繼續執行並被取消,而不再等待 thread 指定的任務終止。

pthread_self() 獲取調用任務自身的標示符(ID)

該接口用來獲取調用任務的 ID。

pthread_attr_init() 初始化任務屬性對象

該接口使用默認值初始化一個任務屬性對象 attr,初始化默認值是由系統確定的,任務屬性對象用於指定任務創建時的屬性信息。pthread_create()接口使用該接口初始化的屬性對象來定義被創建任務的屬性,可以在多個同時調用的 pthread_create()中使用同一個任務屬性對象。對於應根據任務進行分別設置的屬性,如任務堆棧地址,系統會自動進行分配,保證不會發生重疊。調用設置屬性值的接口可以修改已初始化的屬性對象。

pthread_attr_destroy() 刪除任務屬性對象

該接口用來刪除線程屬性對象,將 attr 引用的對象設定為一個無效值。已刪除的 attr 屬性對象可以使用 pthread_attr_init() 重新進行初始化。屬性對象被刪除後不能對其引用。

pthread_attr_getdetachstate() 獲取任務的 detachstate 屬性

該接口用於獲取任務屬性對象 attr 中的 detachstate 屬性。如果 attr 的 detachstate 屬性設置為PTHREAD_CREATE_DETACHED , 則 所 有 使 用 attr 創 建 的 任 務 都 處 於 分 離 狀 態 ; 如 果 設 置 為PTHREAD_CREATE_JOINABLE,則所有使用 attr 創建的任務處於聯合狀態。如果任務被創建為分離的(PTHREAD_CREATE_DETACHED),那麼以該任務 ID 作為參數調用 pthread_detach()或 pthread_join()時會失敗。

pthread_attr_getschedparam 獲取調度策略屬性。

pthread_attr_getschedparam()和pthread_attr_setschedparam()函數分別獲取和設置調度參數屬性。param結構的內容在<sched.h>頭文件中定義。調度策略包括SCHED_FIFO和SCHED_RR策略。

pthread_attr_setschedparam 設置調度策略屬性。

pthread_attr_getschedparam()和pthread_attr_setschedparam()函數分別獲取和設置調度參數屬性。param結構的內容在<sched.h>頭文件中定義。調度策略包括SCHED_FIFO和SCHED_RR策略。/<sched.h>

pthread_attr_getstacksize() 獲取任務的 stacksize 屬性

該接口用於獲取任務屬性對象 attr 中的任務創建的 stacksize 屬性。

pthread_attr_setdetachstate() 設置任務的 detachstate 屬性

該接口用於獲取任務屬性對象 attr 中的 detachstate 屬性。如果 attr 的 detachstate 屬性設置為PTHREAD_CREATE_DETACHED , 則 所 有 使 用 attr 創 建 的 任 務 都 處 於 分 離 狀 態 ; 如 果 設 置 為PTHREAD_CREATE_JOINABLE,則所有使用 attr 創建的任務處於聯合狀態。如果任務被創建為分離的(PTHREAD_CREATE_DETACHED),那麼以該任務 ID 作為參數調用 pthread_detach()或 pthread_join()時會失敗。

pthread_attr_setschedpolicy () 設置任務的 schedpolicy 屬性

該接口用於設置任務屬性對象 attr 中的 schedpolicy 屬性。任 務 調 度 策 略 , 取 值 包 括 SCHED_FIFO 、 SCHED_RR 、 SCHED_OTHER。

pthread_attr_setstacksize() 設置任務的 stacksize 屬性

該接口用於設置任務屬性對象 attr 中的 stacksize 屬性,該屬性指定了創建任務棧需分配的長度(字節)。

sched_get_priority_max() 獲取任務優先級最大值

該接口用於獲取調度策略 policy 對應的調度優先級的最大值。

sched_get_priority_min() 獲取任務優先級最小值

該接口用於獲取調度策略 policy 對應的調度優先級最小值。

後續文章會詳細介紹互斥量、消息隊列、時鐘/定時器和條件變量相關接口。


分享到:


相關文章: