函式重入導致系統重啟(餵狗失敗)案例分析

2021-09-27 01:20:59 字數 991 閱讀 6850

用按鍵多次進入設定選單,會出現引數被修改的情況,是由於堆疊溢位導致,故公升級**,修改這個bug。公升級後的程式v1.32在測試中發現,密碼設定為0000,多次快速進入設定選單,會導致儀表重啟

整機測試,密碼設定為0000,多次快速進入設定選單,5分鐘之內,一般都能復現重啟現象。

將看門狗的跳線帽拔掉,重複上述操作,不會再出現重啟現象。基本可以確定是看門狗導致了重啟。

分析**,看門狗是鐵電儲存器整合的,需要使用iic方式餵狗。但是**中在主迴圈和設定引數的顯示任務中都呼叫了餵狗程式。這樣的話,當在主迴圈裡餵狗操作進行到一半時,進入設定選單,那麼就會在設定選單中會重新餵狗,這時候就發生了重入的情況,導致餵狗失敗,從而引起復位重啟。

軟體模擬,在餵狗程式中重新呼叫餵狗程式,餵狗一直處在失敗狀態,儀表一直復位重啟。

將顯示任務放到主迴圈執行,這樣的話,就不會出現iic看門狗餵狗重入的情況。

但是這樣一來,顯示任務的實時性就變差了,螢幕重新整理沒有之前快。特別是有大量資料需要存入到鐵電時,螢幕重新整理會更慢。所以還需要見iic的讀寫速度提高,讀頻率由20k提高到333.3k,寫頻率由9.259k提高到178k,這樣的話,可以保證螢幕顯示不會卡頓,滿足顯示的需要

使用作業系統時,我們必須對系統執行方式充分了解, 結合硬體設計資源, 避免函式重入的發生。

Linux系統程式設計 可重入和不可重入函式

在實時系統的設計中,經常會出現多個任務呼叫同乙個函式的情況。如果有乙個函式不幸被設計成為這樣 那麼不同任務呼叫這個函式時可能修改其他任務呼叫這個函式的資料,從而導致不可預料的後果。這樣的函式是不安全的函式,也叫不可重入函式。肯定有乙個安全的函式,這個安全的函式又叫可重入函式。那麼什麼是可重入函式呢?...

可重入函式與不可重入函式

可重入 reentrant 函式可以由多於乙個任務併發使用,而不必擔心資料錯誤。相反,不可重入 non reentrant 函式不能由超過乙個任務所共享,除非能確保函式的互斥 或者使用訊號量,或者在 的關鍵部分禁用中斷 可重入函式可以在任意時刻被中斷,稍後再繼續執行,不會丟失資料。可重入函式要麼使用...

可重入函式和不可重入函式

可重入函式 可重入函式主要用於多工環境中,乙個可重入函式簡單來說是可以被中斷的函式,即可以在函式執行的任何時刻中斷它,轉入os排程下去執行另一段 而返回控制時不出現錯誤,這意味著它除了使用自己棧上的變數以外,不依賴於任何環境 包括static 這樣的函式就是purecode 純 可重入,它可以允許該...