1. 程式人生 > >2018-12-15 使用Jlink 除錯RTThread(執行緒棧溢位的確定 / 實際執行緒棧使用情況的檢視) 方法

2018-12-15 使用Jlink 除錯RTThread(執行緒棧溢位的確定 / 實際執行緒棧使用情況的檢視) 方法

【題外話】

  我第一次接觸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來檢視,棧是否溢位。