

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

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

那我們看下結(jié)構(gòu)體成員初始化函數(shù),其中除了對(duì)成員變量賦值了默認(rèn)參數(shù)外,還對(duì)讀寫時(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地址范圍外的可寫地址,意外操作了寄存器或者無效地址,一次無效操作或開啟意外功能;
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è)就是讀寫的時(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語音指針、CPU內(nèi)存的理解功底,還有什么疑難雜癥歡迎大家提供素材。上面分析的正確初始化順序在紅楓派開發(fā)板例程中應(yīng)用,歡迎大家應(yīng)用到項(xiàng)目中使用。
-
單片機(jī)
+關(guān)注
關(guān)注
6067文章
44992瀏覽量
650573 -
嵌入式
+關(guān)注
關(guān)注
5152文章
19675瀏覽量
317644 -
GD32
+關(guān)注
關(guān)注
7文章
421瀏覽量
25501 -
EXMC
+關(guān)注
關(guān)注
0文章
7瀏覽量
5420
發(fā)布評(píng)論請(qǐng)先 登錄

評(píng)論