

在郭天祥老師視頻里有一個問題分享,是EXMC初始化里的一個變量定義和初始化位置不同會導(dǎo)致程序死機,最終定位到程序是進(jìn)入hardfault死機,但暫時沒有后續(xù)分析了,這里我們來繼續(xù)分析一下。
死機的程序是這樣的:

這段代碼是定義和初始化exmc的結(jié)構(gòu)體參數(shù),我們來詳細(xì)看下結(jié)構(gòu)體中的定義,其中有一個關(guān)鍵是這里有兩個指針成員,分別是讀和寫的結(jié)構(gòu)體參數(shù)指針。

那我們看下結(jié)構(gòu)體成員初始化函數(shù),其中除了對成員變量賦值了默認(rèn)參數(shù)外,還對讀寫時序參數(shù)結(jié)構(gòu)體指針的成員也賦值了默認(rèn)參數(shù):

所以這里就是重點,此時這個結(jié)構(gòu)體剛定義完成,因為是局部變量是定義在棧里的,所以初值都是隨機值,這個隨機值實際可以解釋為??臻g上次釋放的局部變量值。
當(dāng)對一個隨機值的指針進(jìn)行賦值會發(fā)生什么?三個結(jié)果:
1、隨機值是非法地址,立刻觸發(fā)hardfault;
2、隨機值是程序?qū)嶋HRAM地址范圍外的可寫地址,意外操作了寄存器或者無效地址,一次無效操作或開啟意外功能;
3、隨機值是程序已使用的RAM地址,破壞了這段內(nèi)存,程序不會立刻觸發(fā)hardfault,會在CPU使用到該區(qū)域時才出現(xiàn)異常。
那我們應(yīng)該如何調(diào)用這個EXMC的結(jié)構(gòu)體初始化呢?其實這里有定義三個結(jié)構(gòu)圖,另外兩個就是讀寫的時序結(jié)構(gòu)體的實體,我們定義后先將這兩個結(jié)構(gòu)體變量賦值到exmc模式結(jié)構(gòu)體成員的兩個指針,此時指針才有了正確地址,調(diào)用結(jié)構(gòu)圖初始化后就可以把這兩個結(jié)構(gòu)體一起完成初始化。

這里的分析很考驗大家C語音指針、CPU內(nèi)存的理解功底,還有什么疑難雜癥歡迎大家提供素材。上面分析的正確初始化順序在紅楓派開發(fā)板例程中應(yīng)用,歡迎大家應(yīng)用到項目中使用。