

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

這段代碼是定義和初始化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ù):

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

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