RTthread-线程的创建
一、RTthread線程
RT-Thread名為實時線程RTOS, 那么什么叫線程?
人們在生活中處理復雜問題時,慣用的方法就是“分而治之”,即把一個大問題分解成多個相對簡單、比較容易解決的小問題,小問題逐個被解決了,大問題也就隨之解決了。同樣,在設計一個較為復雜的應用程序時,也通常把一個大型任務分解成多個小任務,然后通過運行這些小任務,最終達到完成大任務的目的。
在RT-Thread中,與上述小任務對應的程序實體就叫做“線程”(或任務),RT-Thread就是一個能對這些小“線程”進行管理和調度的多“線程”操作系統。線程是實現任務的載體,它是RT-Thread中最基本的調度單位,它描述了一個任務執行的運行環境,也描述了這個任務所處的優先等級。
線程的組成:
RTthread中,線程由三部分組成:線程代碼(入口函數)、線程控制塊、線程堆棧
線程代碼:(線程的代碼,我們也常稱為,入口函數)
線程控制塊
線程控制塊是操作系統用于管理線程的一個數據結構,他會存放線程的一些信息,例如優先級、線程名稱、線程狀態等,也包線程與線程之間連接用的鏈表結構,線程等待事件的集合等。
在RTthread參考例程中,是這么一個結構體
我們點進入看一下,內部定義的線程控制塊:
線程棧:
RT-Thread每個線程都具有獨立的棧空間,當進行線程切換時,系統 會將當前線程的上下文保存在線程棧中,當線程 要恢復運行時,再從線程棧中讀取上下文信息,恢復線程的運行。
線程上下文是指線程執行時的環境,具體來說就是各個變量和數據包括所有寄存器變量、堆棧信息、內存信息等。
線程棧在形式上是-段連續的內存空間 ,我們可以通過定 義個數組或者申請 段動態內存來作為線程的棧。
二、線程的創建
在我們創建線程的時候,我們有兩個API函數可以用:
rt_err_t rt_thread_init : 這個API函數,創建一個靜態線程。
rt_err_t rt_thread_creat: 這個API函數,創建動態的線程。
通常我們使用的一個啟動線程API函數為:
rt_err_t rt_thread_startup(rt_thread_t thread),調用此函數后創建的線程會被加入到線程的就緒隊列中,執行調度。
rt_err_t rt_thread_init,在這里,我們講解一下,在這個API函數中,
rt_err_t rt_thread_creat:這個API函數:
三、線程的基礎例程介紹:
在這個樣例中,我們看到,
第一個使用的是動態創建線程,如果創建不成功,就不能啟動此線程;可以從這里點進去看所有關于該線程的所有參數,了解線程的構造,并且這里我們可以得到線程1中,如果初始化成功,則返回的是一個指針;
第二個線程使用的靜態創建線程,分配內存空間,并創建線程,同動態內存分配差不多;
下面是線程1的線程入口:
這里使用的是一個無線循環的計數器,每等待500ms,計數器+1;
四、運行程序
之后就會創建線程;
創建之后,在這里運行此程序,將會看到
線程2,先打印!!!
這是為什么呢?
如果我們仔細去找程序的話,會發現,線程2的優先級設置的時候比線程1的優先級高且沒有讓出線程時間片的動作(代碼),所以先打印了線程2,才打印線程1;
五、靜態與動態線程的區別
使用靜態定義方式時,必須先定義靜態的線程控制塊,并且定義好堆棧空間,然后調用rt_thread_init來完成線程的初始化工作。采用這種方式,線程控制塊和堆棧占用的內存會放在RAM段,這段空間在編譯時就已經確定,它不是可以動態分配的,所以不能被釋放。而只能使用rt_thread_detach函數將該線程控制塊從對象管理器中脫離。
使用動態定義方式rt_thread_create時,RT-Thread會動態申請線程控制塊和堆棧空間。在編譯時,編譯器是不會感知到這段空間的,只有在程序運行時,RT-Thread才會從系統堆中申請分配這段內存空間,當不需要使用該線程時,調用rt_thread_delete函數就會將這段申請的內存空間重新釋放到內存堆中。
這兩種方式各有利弊,
靜態定義方式會占用RAM空間,但是不需要動態分配內存,運行時效率高。
動態方式不會占用額外的RAM空間,占用空間小,但是運行時需要動態分配內存,效率沒有靜態方式高。
總的來說,這兩種方式就是空間和時間效率的平衡,可以根據實際環境需求選擇采用具體的分配方式。
總結
以上是生活随笔為你收集整理的RTthread-线程的创建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: window10专业版关闭defende
- 下一篇: 驾校宝典电脑版