現(xiàn)在的裸機(jī)程序已經(jīng)不能滿足嵌入式機(jī)器人所需的代碼結(jié)構(gòu)要求了,因?yàn)橐粋€(gè)嵌入式機(jī)器人的系統(tǒng)是非常龐大的,分別由感知算法,決策算法和控制算法等組成,這還沒有算上一些需要聯(lián)網(wǎng)的程序。龐大的代碼需要一個(gè)芯片級(jí)的操作系統(tǒng)來屏蔽掉硬件對(duì)于上層算法的影響,同時(shí)向上層提供API,幫助上層的算法調(diào)用底層硬件,因此一個(gè)芯片級(jí)操作系統(tǒng)就十分重要了,而RT-Thread是一種國產(chǎn)的芯片級(jí)操作系統(tǒng),而我的課程剛好也涉及到了該系統(tǒng),所以我準(zhǔn)備寫一系列的博客來記錄下我在學(xué)習(xí)這個(gè)操作系統(tǒng)過程中的種種問題,希望能帶給大家一些幫助~
問題現(xiàn)象
這學(xué)期我們?cè)谏锨度胧降恼n程,學(xué)習(xí)了一個(gè)新的輕量級(jí)操作系統(tǒng)——RT-Thread(后面簡稱為rtt),這是一個(gè)國產(chǎn)的操作系統(tǒng),這個(gè)操作系統(tǒng)的特點(diǎn)就是只有線程,沒有進(jìn)程,那么我們要使用這個(gè)系統(tǒng)的話只需要操作相應(yīng)的線程就可以了,那么我們用好這個(gè)系統(tǒng)的方法就很簡單了,我們只需要實(shí)現(xiàn)各個(gè)線程間的協(xié)調(diào)工作就可以了。
言歸正傳,在我學(xué)習(xí)這個(gè)rtt的時(shí)候我出現(xiàn)了一個(gè)問題,那就是當(dāng)我的main函數(shù)的while(1)里面啥東西也不放,空跑的時(shí)候,整個(gè)芯片就宕機(jī)了,代碼如圖:
原因及解決辦法
【走過的彎路】
開始的時(shí)候我以為這個(gè)原因就是在我的整個(gè)工程中main線程的優(yōu)先級(jí)比較高,其他線程的優(yōu)先級(jí)都是最低的(我這里設(shè)置的是25),那么在線程調(diào)度的時(shí)候高優(yōu)先級(jí)的線程會(huì)先被調(diào)度,main線程作為我的系統(tǒng)中優(yōu)先級(jí)最高的線程,而且是在空跑的一個(gè)線程,那么就是這個(gè)main線程在一直占用著系統(tǒng)資源,其他線程都不能被調(diào)度,因此出現(xiàn)了類似于系統(tǒng)宕機(jī)的現(xiàn)象。
說到這里就不得不說一下我們這張rtt系統(tǒng)的線程調(diào)度的狀態(tài)流轉(zhuǎn)圖了。
在普通的操作系統(tǒng)中,這些狀態(tài)之間的流轉(zhuǎn)還是比較好理解的,但是在rtt中,它有一個(gè)與其他操作系統(tǒng)所不同的地方,這我在前面也已經(jīng)講過了,那就是它是沒有進(jìn)程這個(gè)東西的,因此在rtt操作系統(tǒng)中,就緒狀態(tài)=運(yùn)行狀態(tài)。也就是說圖中的2號(hào)圓圈代表的循環(huán)就相當(dāng)于等價(jià)。
但是,這樣就出現(xiàn)問題了,因?yàn)槿绻凑瘴疫@個(gè)邏輯的話,不止是在空跑main線程的while(1)的時(shí)候會(huì)出現(xiàn)系統(tǒng)宕機(jī)的情況,就算main線程的while(1)里面加入了任務(wù)程序,那么我們整個(gè)rtt系統(tǒng)也是會(huì)根據(jù)系統(tǒng)進(jìn)程的調(diào)度機(jī)制(高優(yōu)先級(jí)的線程一定會(huì)先被調(diào)度)來不停的循環(huán)調(diào)用main線程里while(1)里面的任務(wù),同樣其他的線程也是不會(huì)被調(diào)用的,這樣肯定是不行的,于是我就去rtt的官網(wǎng)查詢相關(guān)資料,最終解開了這個(gè)問題背后的謎團(tuán)。
恍然大悟
首先讓我們來rtt系統(tǒng)中明確一些概念。
我們以下面這個(gè)代碼段來舉例說明:
void thread_entry(void* paramenter) { /* 等待事件的發(fā)生 */ /* 對(duì)事件進(jìn)行服務(wù)、進(jìn)行處理 */ }
線程就緒/運(yùn)行
這個(gè)代碼是線程的實(shí)體函數(shù),那rtt系統(tǒng)屆時(shí)會(huì)怎樣執(zhí)行這個(gè)程序呢?我畫一個(gè)形象的圖給大家解釋一下。
如果這個(gè)線程優(yōu)先級(jí)夠高的話,rtt系統(tǒng)會(huì)一直執(zhí)行這個(gè)線程,也就不會(huì)執(zhí)行其他線程了,因?yàn)樵摼€程運(yùn)行結(jié)束之后會(huì)進(jìn)入就緒狀態(tài),又因?yàn)樵摼€程有最高優(yōu)先級(jí),所以進(jìn)入線程調(diào)度池之后馬上又會(huì)被調(diào)度運(yùn)行,進(jìn)入運(yùn)行狀態(tài),但是在rtt 中,實(shí)際上(實(shí)現(xiàn)過程中)線程并不存在運(yùn)行狀態(tài),就緒狀態(tài)和運(yùn)行狀態(tài)是等同的,但是在理解機(jī)制時(shí)照上面說的來理解較為方便。
線程掛起
rtt官網(wǎng)有對(duì)其較為詳細(xì),清楚的描述,我這里做了一個(gè)搬運(yùn),侵刪。
這段話里面重要的就是這句話,線程不參與調(diào)度,也就是說不論該線程優(yōu)先級(jí)有多高,他都不會(huì)進(jìn)入到線程調(diào)度池里面,根據(jù)表格中的描述,導(dǎo)致線程掛起的條件有2個(gè)資源不可用。
線程主動(dòng)延時(shí)一段時(shí)間
解決問題
main線程就是一個(gè)特殊的線程,所以他肯定也符合rtt系統(tǒng)管理線程的機(jī)制。
那我們這個(gè)問題就很好說明了。當(dāng)main線程的while(1)循環(huán)內(nèi)程序沒有發(fā)生資源不可用或者線程主動(dòng)延時(shí)的操作時(shí),該線程一直會(huì)處于運(yùn)行/就緒階段,又因?yàn)槲业某绦蛑校琺ain線程優(yōu)先級(jí)最高,所以我的main線程一直霸占著系統(tǒng)資源,造成了系統(tǒng)宕機(jī)的假象。但是如果我在main線程的while(1)循環(huán)中插入一段延時(shí)程序,main線程就會(huì)進(jìn)入掛起狀態(tài),讓出系統(tǒng)資源,從而使其他線程有機(jī)會(huì)得到調(diào)度,使得該系統(tǒng)能穩(wěn)定運(yùn)行。
原文標(biāo)題:機(jī)器人”大腦”:RT-Thread的main線程“卡死”的一種可能原因及解決方案
文章出處:【微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
責(zé)任編輯:haq
-
機(jī)器人
+關(guān)注
關(guān)注
213文章
29568瀏覽量
211954 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
7113瀏覽量
125127 -
RT-Thread
+關(guān)注
關(guān)注
32文章
1376瀏覽量
41613 -
RTThread
+關(guān)注
關(guān)注
8文章
132瀏覽量
41605
原文標(biāo)題:機(jī)器人”大腦”:RT-Thread的main線程“卡死”的一種可能原因及解決方案
文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
人形機(jī)器人敏捷開發(fā)新路徑:RT-Thread以軟件底座破解復(fù)雜系統(tǒng)難題 | 新聞速遞

【直播預(yù)告】《實(shí)時(shí)操作系統(tǒng)應(yīng)用技術(shù)—基于RT-Thread與ARM的編程實(shí)踐》教學(xué)脈絡(luò)及資源簡介

RT-Thread嵌入式操作系統(tǒng)專業(yè)培訓(xùn)班-深圳站重磅開啟!

RT-Thread嵌入式操作系統(tǒng)專業(yè)培訓(xùn)班來上海啦!

RT-Thread嵌入式操作系統(tǒng)專業(yè)培訓(xùn)班登陸鄭州!

RT-Thread操作系統(tǒng)應(yīng)用開發(fā)寒假師資培訓(xùn)

RT-Thread聯(lián)合河北大學(xué)發(fā)起嵌入式操作系統(tǒng)專業(yè)班-保定站

【本周六-深圳】RT-Thread嵌入式操作系統(tǒng)專業(yè)培訓(xùn)班正式開班

混合部署 | 在迅為RK3568上同時(shí)部署RT-Thread和Linux系統(tǒng)
喜報(bào)|睿賽德科技RT-Thread操作系統(tǒng)成功入選上海市重點(diǎn)推薦目錄

混合部署 | 在迅為RK3568上同時(shí)部署RT-Thread和Linux系統(tǒng)
新書發(fā)布——《RT-Thread嵌入式實(shí)時(shí)操作系統(tǒng)內(nèi)核、驅(qū)動(dòng)和應(yīng)用開發(fā)技術(shù)》

RT-Thread內(nèi)部機(jī)制大揭秘,帶你深入操作系統(tǒng)內(nèi)核

睿賽德科技CEO熊譜翔 ——基于RT-Thread操作系統(tǒng)的安全車控系統(tǒng)實(shí)踐

RT-Thread 新里程碑達(dá)成——GitHub Star 破萬!

評(píng)論