來自帖子
舉例吧:
u8 array[n]; // 這是1位元組對齊的,與n取值無關。
u16 array[n]; // 這是2位元組對齊的,與n取值無關。
u32 array[n]; // 這是4位元組對齊的,與n取值無關。
你把u16型陣列的長度改為256可用,那僅僅是聯結器的偶然,知識要嚴謹不能依賴偶然;既然整個陣列的起始位址不能保證是4位元組對齊,你在此陣列的52索引處也同樣不能保證4位元組對齊。
而你定義的結構體必須4位元組對齊,因為其成員是float型別。
keil mdk中,你要檢視一下__align()的用法,這是解決你問題的關鍵字;
iar ewarm中,你檢視一下#pragma data_alignment的用法,這是解決你的問題的關鍵;
樓主依據以上知識點去實驗,了解對齊的知識;真理不怕檢驗。
只能說樓主的知識儲備不過關,不怪編譯器不行。
float型資料是4位元組的,但你定義u16的陣列,要對齊完全靠運氣,如果換成u32,那就不會有對不齊的問題了。
stm32的密集儲存節省了不少記憶體呢,arm9不管u8、u16還是u32,都是要占用4位元組的空間,位址值是能被4整除的。
或者,你把結構體和你的陣列用乙個共用體包起來,就不擔心對齊的問題了,這樣保證陣列的開始的位址是能被4整除的。
stm32記憶體分配
原文 1 棧區 stack 由編譯器自動分配和釋放,存放函式的引數值 區域性變數的值等,其操作方式類似 於資料結構中的棧。2 堆區 heap 一般由程式設計師分配和釋放,若程式設計師不釋放,程式結束時可能由作業系統 分配 方式類似於資料結構中的鍊錶。3 全域性區 靜態區 static 全域性變數和靜...
STM32記憶體管理
這是我的第一篇文章,寫的不好請多多見諒 針對stm32f429來進行講解,其他型號的也可以參照學習 相信很多新手在記憶體管理這個程式中比較疑惑,為什麼分配那麼大,可不可以更改大小?但是改大了編譯會錯誤又是為什麼?這裡將對大家心中的疑惑進行講解,並且教大家進行計算。當該項值為 0 的時候,代表對應的記...
STM32之記憶體
記憶體的分類 1 動態記憶體 dram。為什麼稱之為動態記憶體呢?是與他的硬體構成有關。動態隨機儲存器dram 的記憶體單元是以電容的電荷來表示資料。有電荷表示1,無電荷表示0,但是隨著時間的推移,代表1的電荷會放電,代表0的電荷會吸收電荷,因此它需要定期重新整理,所以就有了動態記憶體之稱。重新整理...