RTT之理解線程

線程與任務等同。

可見,每個線程切換時都會將上下文保存到自己的棧中。

另外從編程手冊的timeslice_sample.c這個例子來看,不同的線程調用同一個入口函數,實際上就是將函數的參數及局部變量複製到不同線程的堆棧中,這樣就可以實現重入了。

線程控制塊結構體rt_thread,也是在rtdef.h中定義。

線程狀態轉換圖:

RTT的就緒態等同於運行態,實際上是不存在運行態的。

線程操作:

創建線程:rt_thread_create動態線程,是從系統自動從內存堆上分配棧空間和線程句柄。(初始化heap之後才能使用)

rt_thread_init():是用戶分配棧空間和線程句柄。

刪除線程:rt_thread_delete()對應動態線程刪除。rt_thread_detach()對應動態線程刪除。刪除不應在本線程內調用。

啓動線程:進入調度序列,並將線程狀態改爲就緒態。真正的程序運行,是調用調度rt_system_scheduler_start(),啓動系統調度器,然後在就緒表中選擇一個優先級最高的執行。

默認是啓動了三個線程,main,tshell,tidel0,下面看一下,這三個線程的優先級分別是多少??

main線程定義在component.c中如下圖:

其中RT_THREAD_PRIORITY_MAX是在rtconfig.h中定義的,最大優先級數,默認是32 ,32/3=10,所以main的優先級是10。

tshell線程定義在shell.c中

FINSH_THREAD_PRIORITY,也是定義在rtconfig.h中,默認值是20,可見main線程優先級高於FinSH線程.

最後看一下tidel0線程:

tidel0線程調用是在componet.c中啓動函數rtthread_startup(void)中,如下圖


定義在系統文件idle.c文件中,是靜態創建的一個線程,如下圖:

優先級爲31級,是最小的。

 

獲取當前執行的線程句柄:rt_thread_self(),可以知道是哪個線程在運行。

線程讓出處理器使用資源:

rt_thread_yield():在就緒表中刪除此線程,然後再掛到就緒表的尾部。

rt_schedule():切換最高優先級線程。

線程睡眠:使線程(主動)掛起指定的時間後,再恢復運行。

rt_thread_sleep():

rt_thread_delay():以上兩個以系統tick爲單位。

rt_thread_mdelay():以時間ms爲單位。
線程掛起和恢復:rt_thread_suspend(),掛起,不推薦使用。

rt_thread_resume():恢復掛起的線程,重新進就緒表
控制線程:更改線程的優先級,開啓/關閉線程。

設置和刪除空閒鉤子函數:執行空閒函數時要做的事情。

空閒函數永遠不會被掛起。

設置調度器鉤子函數:在系統切換時,會被調用的函數。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章