在郭天祥老師視頻里有一個(gè)問(wèn)題分享,是EXMC初始化里的一個(gè)變量定義和初始化位置不同會(huì)導(dǎo)致程序死機(jī),最終定位到程序是進(jìn)入hardfault死機(jī),但暫時(shí)沒(méi)有后續(xù)分析了,這里我們來(lái)繼續(xù)分析一下。
死機(jī)的程序是這樣的:
這段代碼是定義和初始化exmc的結(jié)構(gòu)體參數(shù),我們來(lái)詳細(xì)看下結(jié)構(gòu)體中的定義,其中有一個(gè)關(guān)鍵是這里有兩個(gè)指針成員,分別是讀和寫(xiě)的結(jié)構(gòu)體參數(shù)指針。
那我們看下結(jié)構(gòu)體成員初始化函數(shù),其中除了對(duì)成員變量賦值了默認(rèn)參數(shù)外,還對(duì)讀寫(xiě)時(shí)序參數(shù)結(jié)構(gòu)體指針的成員也賦值了默認(rèn)參數(shù):
所以這里就是重點(diǎn),此時(shí)這個(gè)結(jié)構(gòu)體剛定義完成,因?yàn)槭蔷植孔兞渴嵌x在棧里的,所以初值都是隨機(jī)值,這個(gè)隨機(jī)值實(shí)際可以解釋為??臻g上次釋放的局部變量值。
當(dāng)對(duì)一個(gè)隨機(jī)值的指針進(jìn)行賦值會(huì)發(fā)生什么?三個(gè)結(jié)果:
1、隨機(jī)值是非法地址,立刻觸發(fā)hardfault;
2、隨機(jī)值是程序?qū)嶋HRAM地址范圍外的可寫(xiě)地址,意外操作了寄存器或者無(wú)效地址,一次無(wú)效操作或開(kāi)啟意外功能;
3、隨機(jī)值是程序已使用的RAM地址,破壞了這段內(nèi)存,程序不會(huì)立刻觸發(fā)hardfault,會(huì)在CPU使用到該區(qū)域時(shí)才出現(xiàn)異常。
那我們應(yīng)該如何調(diào)用這個(gè)EXMC的結(jié)構(gòu)體初始化呢?其實(shí)這里有定義三個(gè)結(jié)構(gòu)圖,另外兩個(gè)就是讀寫(xiě)的時(shí)序結(jié)構(gòu)體的實(shí)體,我們定義后先將這兩個(gè)結(jié)構(gòu)體變量賦值到exmc模式結(jié)構(gòu)體成員的兩個(gè)指針,此時(shí)指針才有了正確地址,調(diào)用結(jié)構(gòu)圖初始化后就可以把這兩個(gè)結(jié)構(gòu)體一起完成初始化。
這里的分析很考驗(yàn)大家C語(yǔ)音指針、CPU內(nèi)存的理解功底,還有什么疑難雜癥歡迎大家提供素材。上面分析的正確初始化順序在紅楓派開(kāi)發(fā)板例程中應(yīng)用,歡迎大家應(yīng)用到項(xiàng)目中使用。
-
單片機(jī)
+關(guān)注
關(guān)注
6035文章
44554瀏覽量
634629 -
嵌入式
+關(guān)注
關(guān)注
5082文章
19104瀏覽量
304796 -
GD32
+關(guān)注
關(guān)注
7文章
403瀏覽量
24326 -
EXMC
+關(guān)注
關(guān)注
0文章
7瀏覽量
5191
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論