由於記憶體位元組對齊導致的硬體錯誤

2021-07-22 08:16:54 字數 611 閱讀 6766

最近在除錯stm32程式的時候,經常進到hardfault_handler這個中斷裡。產生這個中斷的原因一般和記憶體有關係,像是陣列越界、堆疊溢位之類的。

檢查了好幾天終於發現了問題的所在,產生問題的原因是程式在執行函式指標所指向的時候,由於指標指向的位址不對而引發hardfault_handler中斷。

令我匪夷所思的地方就來了,在我的程式中並沒有對這個指標進行一些無效的賦值,於是我開始除錯對這個指標賦值的那段**,然後發現了乙個讓人始料未及的事情。賦值的那段**是沒有問題的,但是在完成賦值操作之後,這個函式指標所指向的位址竟然和我賦值給它的位址不一樣。內心一陣萬馬奔騰的景象。

然而為什麼會產生這個原因呢?好吧到最後我也沒有想明白是什麼原因。不過解決方法不知道是湊巧還是什麼,我在網上找hardfault_handler相關的資料的時候,發現有人提到了記憶體位元組對齊。於是我想到了在我的程式中有一些資料結構被我設定成1位元組記憶體對齊。是使用#pragma pack (1)來實現的,但是我並沒有加#pragma pack ()取消自定義記憶體對齊指令,導致其之後的資料結構都是1位元組對齊。在我加上了#pragma pack ()之後程式就沒有進hardfault_handler中斷了。

位元組對齊導致的iOS EXC ARM DA

我遇到情況和這位朋友很類似 用二進位制方式從檔案讀取內容到記憶體,假設內容只有7個位元組,前面三個位元組是三個字元,後四個位元組的內容是乙個int資料,在把後四個位元組轉成int資料時如 pfilecontent是char 指標,已指向第四個位元組 intintvalue pfilecontent ...

由於JDK版本問題導致的錯誤

在自己機器上 jdk5,struts1.2.4,tomcat 5.5 開發了乙個小系統,deploy到伺服器上時,卻出現了錯誤 unsupported major.minor version 49.0 在網上查了一些資料,建議多半是將執行環境中的jdk換成與開發環境相同的版本。但是,自己機器上玩玩這...

由於JDK版本問題導致的錯誤

在自己機器上 jdk5,struts1.2.4,tomcat 5.5 開發了乙個小系統,deploy到伺服器上時,卻出現了錯誤 unsupported major.minor version 49.0 在網上查了一些資料,建議多半是將執行環境中的jdk換成與開發環境相同的版本。但是,自己機器上玩玩這...