RT-Thread中使用線程這個概念,而不是任務。兩者相似,我在這里把他的線程當作任務來理解了
1、任務處理:
動態任務相關API
創建任務:rt_thread_create函數,創建任務之后會返回rt_thread_t類型的任務ID
創建之后啟動任務:rt_thread_startup
刪除任務:rt_thread_delete
任務延時函數:rt_thread_delay 延時時候,任務處於suspend狀態
任務運行情況可用finish模塊,在電腦終端查看
2、動態創建線程和靜態創建線程
RT-Thread中支持靜態和動態兩種定義方式。用線程來舉例的話,rt_thread_init對應靜態定義方式,rt_thread_create對應動態定義方式。
- 使用靜態定義方式時,必須先定義靜態的線程控制塊,並且定義好堆棧空間,然后調用rt_thread_init來完成線程的初始化工作。采用這種 方式,線程控制塊和堆棧占用的內存會放在RW段,這段空間在編譯時就已經確定,它不是可以動態分配的,所以不能被釋放,而只能使用 rt_thread_detach函數將該線程控制塊從對象管理器中脫離。
- 使用動態定義方式rt_thread_create時,RT-Thread會動態申請線程控制塊和堆棧空間。在編譯時,編譯器是不會感知到這段空 間的,只有在程序運行時,RT-Thread才會從系統堆中申請分配這段內存空間,當不需要使用該線程時,調用rt_thread_delete函數就會 將這段申請的內存空間重新釋放到內存堆中。
這兩種方式各有利弊,靜態定義方式會占用RW/ZI空間,但是不需要動態分配內存,運行時效率較高,實時性較好。 動態方式不會占用額外的RW/ZI空間,占用空間小,但是運行時需要動態分配內存,效率沒有靜態方式高。
靜態創建線程代碼:
創建線程:rt_thread_init
啟動線程:rt_thread_startup
脫離線程:rt_thread_detach
//靜態創建線程 result = rt_thread_init(&thread1, //線程handle "static", //線程名 rt_init_thread_entry, //線程入口函數 RT_NULL, //線程入口參數 &thread1_stack[0], //線程棧地址 sizeof(thread1_stack), //線程棧大小 6, //線程優先級 10); //線程時間片
動態創建線程代碼:
創建線程:rt_thread_create
啟動線程:rt_thread_startup
線程啟動成功后,當OS調度開始,即可被OS調度執行。
tid = rt_thread_create("init", rt_init_thread_entry, RT_NULL, 2048, 10, 5); if (tid != RT_NULL) rt_thread_startup(tid);
空間使用比較
動態創建的線程,delete之后會釋放出空間
靜態創建的線程,detach之后不會釋放空間
