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