線程與任務等同。
可見,每個線程切換時都會將上下文保存到自己的棧中。
另外從編程手冊的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():恢復掛起的線程,重新進就緒表
控制線程:更改線程的優先級,開啓/關閉線程。
設置和刪除空閒鉤子函數:執行空閒函數時要做的事情。
空閒函數永遠不會被掛起。
設置調度器鉤子函數:在系統切換時,會被調用的函數。