rtthread工业使用_rtthread使用总结
RT-Thread?中,實(shí)際上線程并不存在運(yùn)行狀態(tài),就緒狀態(tài)和運(yùn)行狀態(tài)是等同的。
若某線程運(yùn)行完畢,系統(tǒng)將自動刪除線程:自動執(zhí)行?rt_thread_exit()?函數(shù),先將該線程從系統(tǒng)就緒隊(duì)列中刪除,再將該線程的狀態(tài)更改為關(guān)閉狀態(tài),不再參與系統(tǒng)調(diào)度,然后掛入?rt_thread_defunct?僵尸隊(duì)列(資源未回收、處于關(guān)閉狀態(tài)的線程隊(duì)列)中,最后空閑線程會回收被刪除線程的資源。
動態(tài)的是create/delete?靜態(tài)的是init/detach
需要注意的是,用戶提供的棧首地址需做系統(tǒng)對齊(例如?ARM?上需要做?4?字節(jié)對齊)。線程初始化接口?rt_thread_init()?的參數(shù)和返回值見下表:
使線程讓出處理器資源
當(dāng)前線程的時(shí)間片用完或者該線程主動要求讓出處理器資源時(shí),它將不再占有處理器,調(diào)度器會選擇相同優(yōu)先級的下一個(gè)線程執(zhí)行。線程調(diào)用這個(gè)接口后,這個(gè)線程仍然在就緒隊(duì)列中。線程讓出處理器使用下面的函數(shù)接口:
rt_err_trt_thread_yield(void);
通常不應(yīng)該使用這個(gè)函數(shù)來掛起線程本身,如果確實(shí)需要采用?rt_thread_suspend()?函數(shù)掛起當(dāng)前任務(wù),需要在調(diào)用?rt_thread_suspend()?函數(shù)后立刻調(diào)用?rt_schedule()?函數(shù)進(jìn)行手動的線程上下文切換。用戶只需要了解該接口的作用,不推薦使用該接口。
空閑線程是一個(gè)線程狀態(tài)永遠(yuǎn)為就緒態(tài)的線程,因此設(shè)置的鉤子函數(shù)必須保證空閑線程在任何時(shí)刻都不會處于掛起狀態(tài),例如?rt_thread_delay(),rt_sem_take()?等可能會導(dǎo)致線程掛起的函數(shù)都不能使用。
關(guān)于刪除線程:大多數(shù)線程是循環(huán)執(zhí)行的,無需刪除;而能運(yùn)行完畢的線程,RT-Thread?在線程運(yùn)行完畢后,自動刪除線程,在?rt_thread_exit()?里完成刪除動作。用戶只需要了解該接口的作用,不推薦使用該接口(可以由其他線程調(diào)用此接口或在定時(shí)器超時(shí)函數(shù)中調(diào)用此接口刪除一個(gè)線程,但是這種使用非常少)。
RT-Thread?定時(shí)器默認(rèn)的方式是?HARD_TIMER?模式,即定時(shí)器超時(shí)后,超時(shí)函數(shù)是在系統(tǒng)時(shí)鐘中斷的上下文環(huán)境中運(yùn)行的。
線程的同步方式有很多種,其核心思想都是:在訪問臨界區(qū)的時(shí)候只允許一個(gè)?(或一類)?線程運(yùn)行。進(jìn)入?/?退出臨界區(qū)的方式有很多種:
1)調(diào)用?rt_hw_interrupt_disable()?進(jìn)入臨界區(qū),調(diào)用?rt_hw_interrupt_enable()?退出臨界區(qū);詳見《中斷管理》的全局中斷開關(guān)內(nèi)容。
2)調(diào)用?rt_enter_critical()?進(jìn)入臨界區(qū),調(diào)用?rt_exit_critical()?退出臨界區(qū)。
信號量可以實(shí)現(xiàn)線程間同步,也可以實(shí)現(xiàn)互斥的作用,不過會引起優(yōu)先級反轉(zhuǎn),建議使用互斥鎖來實(shí)現(xiàn),不會引起優(yōu)先級反轉(zhuǎn)。
信號量的使用場合
信號量是一種非常靈活的同步方式,可以運(yùn)用在多種場合中。形成鎖、同步、資源計(jì)數(shù)等關(guān)系,也能方便的用于線程與線程、中斷與線程間的同步中。
中斷與線程間的互斥不能采用信號量(鎖)的方式,而應(yīng)采用開關(guān)中斷的方式。
在?RT-Thread?操作系統(tǒng)中,互斥量可以解決優(yōu)先級翻轉(zhuǎn)問題,實(shí)現(xiàn)的是優(yōu)先級繼承算法。優(yōu)先級繼承是通過在線程?A?嘗試獲取共享資源而被掛起的期間內(nèi),將線程?C?的優(yōu)先級提升到線程?A?的優(yōu)先級別,從而解決優(yōu)先級翻轉(zhuǎn)引起的問題。
事件集主要用于線程間的同步,與信號量不同,它的特點(diǎn)是可以實(shí)現(xiàn)一對多,多對多的同步。
事件集的使用場合
事件集可使用于多種場合,它能夠在一定程度上替代信號量,用于線程間同步。一個(gè)線程或中斷服務(wù)例程發(fā)送一個(gè)事件給事件集對象,而后等待的線程被喚醒并對相應(yīng)的事件進(jìn)行處理。但是它與信號量不同的是,事件的發(fā)送操作在事件未清除前,是不可累計(jì)的,而信號量的釋放動作是累計(jì)的。事件的另一個(gè)特性是,接收線程可等待多種事件,即多個(gè)事件對應(yīng)一個(gè)線程或多個(gè)線程。同時(shí)按照線程等待的參數(shù),可選擇是?“邏輯或”?觸發(fā)還是?“邏輯與”?觸發(fā)。這個(gè)特性也是信號量等所不具備的,信號量只能識別單一的釋放動作,而不能同時(shí)等待多種類型的釋放。
郵箱?4*size?,每次只能傳輸4字節(jié)數(shù)據(jù)
消息隊(duì)列?n*size?每次傳輸n字節(jié)數(shù)據(jù)。
郵箱是一種簡單的線程間消息傳遞方式,特點(diǎn)是開銷比較低,效率較高。在?RT-Thread?操作系統(tǒng)的實(shí)現(xiàn)中能夠一次傳遞一個(gè)?4?字節(jié)大小的郵件,并且郵箱具備一定的存儲功能,能夠緩存一定數(shù)量的郵件數(shù)?(郵件數(shù)由創(chuàng)建、初始化郵箱時(shí)指定的容量決定)。郵箱中一封郵件的最大長度是?4?字節(jié),所以郵箱能夠用于不超過?4?字節(jié)的消息傳遞。由于在?32?系統(tǒng)上?4?字節(jié)的內(nèi)容恰好可以放置一個(gè)指針,因此當(dāng)需要在線程間傳遞比較大的消息時(shí),可以把指向一個(gè)緩沖區(qū)的指針作為郵件發(fā)送到郵箱中,即郵箱也可以傳遞指針
消息隊(duì)列的使用場合
消息隊(duì)列可以應(yīng)用于發(fā)送不定長消息的場合,包括線程與線程間的消息交換,以及中斷服務(wù)例程中給線程發(fā)送消息(中斷服務(wù)例程不能接收消息)。下面分發(fā)送消息和同步消息兩部分來介紹消息隊(duì)列的使用。
信號的工作機(jī)制
信號在?RT-Thread?中用作異步通信,POSIX?標(biāo)準(zhǔn)定義了?sigset_t?類型來定義一個(gè)信號集,然而?sigset_t?類型在不同的系統(tǒng)可能有不同的定義方式,在?RT-Thread?中,將?sigset_t?定義成了?unsigned?long?型,并命名為?rt_sigset_t,應(yīng)用程序能夠使用的信號為?SIGUSR1(10)和?SIGUSR2(12)。
信號本質(zhì)是軟中斷,用來通知線程發(fā)生了異步事件,用做線程之間的異常通知、應(yīng)急處理。一個(gè)線程不必通過任何操作來等待信號的到達(dá),事實(shí)上,線程也不知道信號到底什么時(shí)候到達(dá),線程之間可以互相通過調(diào)用?rt_thread_kill()?發(fā)送軟中斷信號。
通過上述的計(jì)算過程,我們可以看出其中的一些關(guān)鍵因素:發(fā)送數(shù)據(jù)量越小,發(fā)送速度越快,對于數(shù)據(jù)吞吐量的影響也將越大。歸根結(jié)底,取決于系統(tǒng)中產(chǎn)生中斷的頻度如何。當(dāng)一個(gè)實(shí)時(shí)系統(tǒng)想要提升數(shù)據(jù)吞吐量時(shí),可以考慮的幾種方式:
1)增加每次數(shù)據(jù)量發(fā)送的長度,每次盡量讓外設(shè)盡量多地發(fā)送數(shù)據(jù);
2)必要情況下更改中斷模式為輪詢模式。同時(shí)為了解決輪詢方式一直搶占處理機(jī),其他低優(yōu)先級線程得不到運(yùn)行的情況,可以把輪詢線程的優(yōu)先級適當(dāng)降低。
由于關(guān)閉全局中斷會導(dǎo)致整個(gè)系統(tǒng)不能響應(yīng)中斷,所以在使用關(guān)閉全局中斷做為互斥訪問臨界區(qū)的手段時(shí),必須需要保證關(guān)閉全局中斷的時(shí)間非常短,例如運(yùn)行數(shù)條機(jī)器指令的時(shí)間。
總結(jié)
以上是生活随笔為你收集整理的rtthread工业使用_rtthread使用总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows下编译skia库
- 下一篇: 西门子1200S7通讯