RT-Thread的線程(任務)處理【RT-Thread學習筆記 2】


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之后不會釋放空間


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM