【題外話】
我第一次接觸RTThread的時候是2014年,當時是本科畢業設計中需要使用到一款wifi模塊進行無線視頻傳輸,該模塊提供的例程就是基於RTThread的。當時由於水平有限(就是水),看到這種長篇大論的代碼還是有點頭疼。后來碩士期間也接觸過uCOS,至於RTThread一直到今年之前再未接觸過。近期由於項目需要使用RTThread,我只得再次打開塵封的記憶,並從各種渠道找到這位“舊友”的資料。士別三日,再次面對RTThread時,他已經發生了翻天覆地的變化,類linux的風格,各種env工具,各種強大的組件,顛覆了我建立再uCOS之上的RTOS的印象,着實讓我驚嘆。我也不由得在思考,為啥我們這個項目領導要選用RTThead?原因之一,我們是軍工企業,我們國家的裝備應該用我們自己的OS;其二,基於RTThread的應用開發相對uCOS要方便,類linux的風格,支持POSIX接口方便移植,且RTThread免費;再者,如今西方列強對我泱泱中華里外封鎖,RTThread說句實在話,挺爭氣的,我們應該支持我們自己!我們應該有所突破!
【正文】
1、發現問題:
近日在移植了RTThread nano到程序中后,發現程序運行一會(半小時到一個鍾頭不等)就會進HardFault,給我的直覺就是線程棧溢出了,但我還是不能確定是這個問題。由於處理器資源有限,所有只移植了RTThread的kernel,像finish什么的都沒有移植。如此以來,我就不能通過finish去查看內存使用情況了。
2、解決問題:
方法一: 一籌莫展之時,突然想起一個辦法可以試試,在進Hardfault的位置放置斷點,當程序運行至此處時,通過watch window查看線程棧數組,(線程棧初始化時全部用“#”0x23進行了填充,棧使用過的部分就會將0x23給覆蓋掉),是不是整個棧區都沒有連續的0x23了,若是,則證明棧溢出了。
方法二: 同樣可以通過查看map文件,找到棧的起始地址,通過memory來查看,棧是否溢出。