在郭天祥老師視頻里有一個問題分享,是EXMC初始化里的一個變量定義和初始化位置不同會導致程序死機,最終定位到程序是進入hardfault死機,但暫時沒有后續分析了,這里我們來繼續分析一下。
死機的程序是這樣的:
這段代碼是定義和初始化exmc的結構體參數,我們來詳細看下結構體中的定義,其中有一個關鍵是這里有兩個指針成員,分別是讀和寫的結構體參數指針。
那我們看下結構體成員初始化函數,其中除了對成員變量賦值了默認參數外,還對讀寫時序參數結構體指針的成員也賦值了默認參數:
所以這里就是重點,此時這個結構體剛定義完成,因為是局部變量是定義在棧里的,所以初值都是隨機值,這個隨機值實際可以解釋為棧空間上次釋放的局部變量值。
當對一個隨機值的指針進行賦值會發生什么?三個結果:
1、隨機值是非法地址,立刻觸發hardfault;
2、隨機值是程序實際RAM地址范圍外的可寫地址,意外操作了寄存器或者無效地址,一次無效操作或開啟意外功能;
3、隨機值是程序已使用的RAM地址,破壞了這段內存,程序不會立刻觸發hardfault,會在CPU使用到該區域時才出現異常。
那我們應該如何調用這個EXMC的結構體初始化呢?其實這里有定義三個結構圖,另外兩個就是讀寫的時序結構體的實體,我們定義后先將這兩個結構體變量賦值到exmc模式結構體成員的兩個指針,此時指針才有了正確地址,調用結構圖初始化后就可以把這兩個結構體一起完成初始化。
這里的分析很考驗大家C語音指針、CPU內存的理解功底,還有什么疑難雜癥歡迎大家提供素材。上面分析的正確初始化順序在紅楓派開發板例程中應用,歡迎大家應用到項目中使用。
-
單片機
+關注
關注
6037文章
44558瀏覽量
635356 -
嵌入式
+關注
關注
5082文章
19126瀏覽量
305255 -
GD32
+關注
關注
7文章
403瀏覽量
24353 -
EXMC
+關注
關注
0文章
7瀏覽量
5196
發布評論請先 登錄
相關推薦
評論