執行緒是作業系統能夠進行運算排程的最小單位,它被包含在程序之中,是程序中的實際運作單位,其本質是將複雜的應用(乙個程序)分解成多個小的、可排程的、序列化的程式單元,當合理的劃分任務並正確執行時,能夠讓系統滿足實時系統的效能及時間的要求。
如下圖所示,嵌入式系統執行任務a,該任務是系統通過感測器採集資料,然後輸出到顯示屏顯示出來,在多執行緒實時系統中,可以將任務a分解成兩個子任務。
在rt-thread中,與上述子任務的程式實體就是執行緒,它描述了乙個任務執行的執行環境,也描述了這個任務所處的優先等級,重要的任務可設定相對較高的優先順序,非重要的任務可以設定較低的優先順序,不同的任務還可以設定相同的優先順序,輪流執行。
上下文:當執行緒執行時,它會認為自己是以獨佔cpu的方式執行,執行緒執行時的執行環境即為上下文,包括所有的暫存器變數、堆疊、記憶體資訊等。
執行緒控制塊
在 rt-thread 中,執行緒控制塊由結構體 struct rt_thread 表示,執行緒控制塊是作業系統用於管理執行緒的乙個資料結構,它會存放執行緒的一些資訊,例如優先順序、執行緒名稱、執行緒狀態等,也包含執行緒與執行緒之間連線用的鍊錶結構,執行緒等待事件集合等。詳細定義可參考rt-thread-執行緒管理
執行緒棧執行緒狀態
執行緒優先順序
rt-thread 最大支援 256 個執行緒優先順序 (0~255),數值越小的優先順序越高,0 為最高優先順序。
時間片
執行緒的入口函式
執行緒控制塊中的 entry 是執行緒的入口函式,它是執行緒實現預期功能的函式。執行緒的入口函式由使用者設計實現,一般有以下兩種**形式:
void
thread_entry
(void
* paramenter)
}
static
void
thread_entry
(void
* parameter)
執行緒狀態切換
rt-thread提供一系列的作業系統呼叫介面,使得執行緒的狀態在這五個狀態之間來回切換。幾種狀態間的轉換關係如下圖所示:
下圖所示描述了執行緒的相關操作,包含:建立/初始化執行緒、啟動執行緒、刪除/脫離執行緒。
建立和初始化執行緒
可以使用 rt_thread_create() 建立乙個動態執行緒,使用 rt_thread_init() 初始化乙個靜態執行緒,動態執行緒與靜態執行緒的區別是:動態執行緒是系統自動從動態記憶體堆上分配棧空間與執行緒控制代碼(初始化 heap 之後才能使用 create 建立動態執行緒),靜態執行緒是由使用者分配棧空間與執行緒控制代碼。
建立執行緒(動態執行緒,在使能了rt_using_heap才有效):
rt_thread_t rt_thread_create
(const
char
* name,
void
(*entry)
(void
* parameter)
,void
* parameter,
rt_uint32_t stack_size,
rt_uint8_t priority,
rt_uint32_t tick)
;
初始化執行緒:
rt_err_t rt_thread_init
(struct rt_thread* thread,
const
char
* name,
void
(*entry)
(void
* parameter)
,void
* parameter,
void
* stack_start, rt_uint32_t stack_size,
rt_uint8_t priority, rt_uint32_t tick)
;
刪除和脫離執行緒
刪除執行緒:
rt_err_t rt_thread_delete
(rt_thread_t thread)
;
脫離執行緒:
rt_err_t rt_thread_detach (rt_thread_t thread)
;
啟動執行緒
將初始化/建立成功後的執行緒通過啟動執行緒介面進入就緒態:
rt_err_t rt_thread_startup
(rt_thread_t thread)
;
獲得當前執行緒rt_thread_t rt_thread_self
(void
);
使執行緒讓出處理器資源rt_err_t rt_thread_yield
(void
);
使執行緒睡眠
在實際應用中,我們有時需要讓執行的當前執行緒延遲一段時間,在指定的時間到達後重新執行,這就叫做 「執行緒睡眠」。
rt_err_t rt_thread_sleep
(rt_tick_t tick)
;rt_err_t rt_thread_delay
(rt_tick_t tick)
;rt_err_t rt_thread_mdelay
(rt_int32_t ms)
;
掛起和恢復執行緒
掛起執行緒:
處於掛起狀態的執行緒,如果其等待的資源超時(超過其設定的等待時間),那麼該執行緒將不再等待這些資源,並返回到就緒狀態;或者,當其他執行緒釋放掉該執行緒所等待的資源時,該執行緒也會返回到就緒狀態。
rt_err_t rt_thread_suspend (rt_thread_t thread)
;
恢復執行緒:
讓掛起的執行緒重新進入就緒狀態,並將執行緒放入系統的就緒佇列中;如果被恢復執行緒在所有就緒態執行緒中,位於最高優先順序鍊錶的第一位,那麼系統將進行執行緒上下文的切換。
rt_err_t rt_thread_resume (rt_thread_t thread)
;
控制線程rt_err_t rt_thread_control
(rt_thread_t thread, rt_uint8_t cmd,
void
* arg)
;
設定和刪除空閒鉤子(hook)
空閒鉤子函式是空閒執行緒的鉤子函式,如果設定了空閒鉤子函式,就可以在系統執行空閒執行緒時,自動執行空閒鉤子函式來做一些其他事情,比如系統指示燈。設定 / 刪除空閒鉤子的介面如下:
rt_err_t rt_thread_idle_sethook
(void
(*hook)
(void))
;rt_err_t rt_thread_idle_delhook
(void
(*hook)
(void))
;
設定排程器鉤子void
rt_scheduler_sethook
(void
(*hook)
(struct rt_thread* from,
struct rt_thread* to)
);
rt-thread-執行緒管 RT Thread核心學習
一 概述 二 執行緒的組成 2.1 執行緒 入口函式 2.2 執行緒控制塊 2.3 執行緒棧 三 執行緒相關的api 3.1 執行緒的建立 3.2 狀態的切換 四 注意事項與補充 4.1 動態建立與靜態建立的優缺點比較?4.2 系統滴答時鐘頻率的選取 4.3 執行緒棧大小分配的小策略 4.4 執行緒...
RT Thread核心學習之時鐘管理
時鐘又稱為定時器,負責維護時間,防止程序壟斷cpu。作業系統需要通過時間來規範其任務的執行,其最小的時間單位是時鐘節拍 os tick 在rt thread中,時鐘節拍的長度可以根據rt tick per second的定義來調整,即通過改變時鐘頻率來調整時鐘節拍。實現方式 時鐘節拍由配置為中斷觸發...
PHP核心學習 執行緒安全
php同一程序下的多個執行緒會試圖讀寫一些儲存在程序記憶體空間的公共資源,此時這些執行緒訪問的記憶體位址空間相同,當乙個執行緒修改時,會影響其它執行緒,這種共享會提高一些 操作的速度,但是多個執行緒間就產生了較大的耦合,並且當多個執行緒併發時,就會產生常見的資料一致性問題或資源競爭等併發常見問題。如...