現在的裸機程序已經不能滿足嵌入式機器人所需的代碼結構要求了,因為一個嵌入式機器人的系統是非常龐大的,分別由感知算法,決策算法和控制算法等組成,這還沒有算上一些需要聯網的程序。龐大的代碼需要一個芯片級的操作系統來屏蔽掉硬件對于上層算法的影響,同時向上層提供API,幫助上層的算法調用底層硬件,因此一個芯片級操作系統就十分重要了,而RT-Thread是一種國產的芯片級操作系統,而我的課程剛好也涉及到了該系統,所以我準備寫一系列的博客來記錄下我在學習這個操作系統過程中的種種問題,希望能帶給大家一些幫助~
問題現象
這學期我們在上嵌入式的課程,學習了一個新的輕量級操作系統——RT-Thread(后面簡稱為rtt),這是一個國產的操作系統,這個操作系統的特點就是只有線程,沒有進程,那么我們要使用這個系統的話只需要操作相應的線程就可以了,那么我們用好這個系統的方法就很簡單了,我們只需要實現各個線程間的協調工作就可以了。
言歸正傳,在我學習這個rtt的時候我出現了一個問題,那就是當我的main函數的while(1)里面啥東西也不放,空跑的時候,整個芯片就宕機了,代碼如圖:
原因及解決辦法
【走過的彎路】
開始的時候我以為這個原因就是在我的整個工程中main線程的優先級比較高,其他線程的優先級都是最低的(我這里設置的是25),那么在線程調度的時候高優先級的線程會先被調度,main線程作為我的系統中優先級最高的線程,而且是在空跑的一個線程,那么就是這個main線程在一直占用著系統資源,其他線程都不能被調度,因此出現了類似于系統宕機的現象。
說到這里就不得不說一下我們這張rtt系統的線程調度的狀態流轉圖了。
在普通的操作系統中,這些狀態之間的流轉還是比較好理解的,但是在rtt中,它有一個與其他操作系統所不同的地方,這我在前面也已經講過了,那就是它是沒有進程這個東西的,因此在rtt操作系統中,就緒狀態=運行狀態。也就是說圖中的2號圓圈代表的循環就相當于等價。
但是,這樣就出現問題了,因為如果按照我這個邏輯的話,不止是在空跑main線程的while(1)的時候會出現系統宕機的情況,就算main線程的while(1)里面加入了任務程序,那么我們整個rtt系統也是會根據系統進程的調度機制(高優先級的線程一定會先被調度)來不停的循環調用main線程里while(1)里面的任務,同樣其他的線程也是不會被調用的,這樣肯定是不行的,于是我就去rtt的官網查詢相關資料,最終解開了這個問題背后的謎團。
恍然大悟
首先讓我們來rtt系統中明確一些概念。
我們以下面這個代碼段來舉例說明:
void thread_entry(void* paramenter) { /* 等待事件的發生 */ /* 對事件進行服務、進行處理 */ }
線程就緒/運行
這個代碼是線程的實體函數,那rtt系統屆時會怎樣執行這個程序呢?我畫一個形象的圖給大家解釋一下。
如果這個線程優先級夠高的話,rtt系統會一直執行這個線程,也就不會執行其他線程了,因為該線程運行結束之后會進入就緒狀態,又因為該線程有最高優先級,所以進入線程調度池之后馬上又會被調度運行,進入運行狀態,但是在rtt 中,實際上(實現過程中)線程并不存在運行狀態,就緒狀態和運行狀態是等同的,但是在理解機制時照上面說的來理解較為方便。
線程掛起
rtt官網有對其較為詳細,清楚的描述,我這里做了一個搬運,侵刪。
這段話里面重要的就是這句話,線程不參與調度,也就是說不論該線程優先級有多高,他都不會進入到線程調度池里面,根據表格中的描述,導致線程掛起的條件有2個資源不可用。
線程主動延時一段時間
解決問題
main線程就是一個特殊的線程,所以他肯定也符合rtt系統管理線程的機制。
那我們這個問題就很好說明了。當main線程的while(1)循環內程序沒有發生資源不可用或者線程主動延時的操作時,該線程一直會處于運行/就緒階段,又因為我的程序中,main線程優先級最高,所以我的main線程一直霸占著系統資源,造成了系統宕機的假象。但是如果我在main線程的while(1)循環中插入一段延時程序,main線程就會進入掛起狀態,讓出系統資源,從而使其他線程有機會得到調度,使得該系統能穩定運行。
原文標題:機器人”大腦”:RT-Thread的main線程“卡死”的一種可能原因及解決方案
文章出處:【微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。
責任編輯:haq
-
機器人
+關注
關注
210文章
28224瀏覽量
206594 -
操作系統
+關注
關注
37文章
6743瀏覽量
123198 -
RT-Thread
+關注
關注
31文章
1273瀏覽量
39933 -
RTThread
+關注
關注
8文章
132瀏覽量
40811
原文標題:機器人”大腦”:RT-Thread的main線程“卡死”的一種可能原因及解決方案
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論