stm32中位元組對齊問題( align n ,

2021-08-02 20:00:18 字數 2075 閱讀 2065

arm下的對齊處理

from dui0067d_ads1_2_complib

3.13 type qulifiers

有部分摘自arm編譯器文件對齊部分

對齊的使用:

1.__align(num)

這個用於修改最高端別物件的位元組邊界。在彙編中使用ldrd或者strd時

就要用到此命令__align(8)進行修飾限制,來保證資料物件是相應對齊。

這個修飾物件的命令最大是8個位元組限制,可以讓2位元組的物件進行4位元組

對齊,但是不能讓4位元組的物件2位元組對齊。

__align是儲存類修改,他只修飾最高端型別物件,不能用於結構或者函式物件。

2.__packed

__packed是進行一位元組對齊

1.不能對packed的物件進行對齊

2.所有物件的讀寫訪問都進行非對齊訪問

3.float及包含float的結構聯合及未用__packed的物件將不能位元組對齊

4.__packed對區域性整形變數無影響

5.強制由unpacked物件向packed物件轉化是未定義,整形指標可以合法定

義為packed。

__packed int* p; //__packed int 則沒有意義

6.對齊或非對齊讀寫訪問帶來問題

__packed struct struct_test

; //定義如下結構此時b的起始位址一定是不對齊的

//在棧中訪問b可能有問題,因為棧上資料肯定是對齊訪問[from cl]

//將下面變數定義成全域性靜態不在棧上

static char* p;

static struct struct_test a;

void main()

比如:typedef __packed struct read_command

read_command;

與 typedef struct read_command

read_command;

的區別是什麼啊?

回答:沒有__packed的會出現字對齊等也就是,char型的有可能是占用4個位元組的長度的記憶體空間有__packed 的就不會,就肯定是1個位元組的記憶體空間,是gcc編譯器的關鍵字。(不止vc下面32位的系統裡面的記憶體資料的訪問是32位的,處理的時候都是4個位元組為單位,通常也就是int的長度。如果不定義壓縮方式,也就是編譯選項沒有諸如#pragma pack(1)之類的,那麼系統會進行4位元組對齊)

注意:_packed只是某種編譯器的格式壓縮,有的是pack呢,對不同的cpu壓縮的對齊方式也不一樣,在使用了該關鍵以後在進行操作時需要格外小心。

宣告結構型別時,可以包含乙個保留字packed,用於實現壓縮資料儲存。

當乙個記錄型別在 狀態下宣告或者宣告中包括了保留字 packed 時,記錄中的字段不被調整,而替換為賦予連續的偏移量。這樣乙個壓縮記錄的總尺寸就是所有欄位的尺寸的和。因為資料調整尺寸可能改變(如不同版本的編譯器對同一種資料型別的調整值可能不同),所以當想要把記錄寫入磁碟時或者在記憶體中傳遞到另一模組而該模組由不同版本的編譯器編譯時,最好還是壓縮所有的記錄。(delphi borland 中也有該關鍵字)

3.在 cotex-m3 programming manual 中有提到對齊問題

1.通常編譯器在生成**的時候都會進行結構體填充,保證(結構體內部成員)最高效能的對齊方式。

2.編譯器自動分配出來結構體的記憶體(比如定義為全域性變數或區域性變數)肯定是對齊的。

3.查閱幫助文件的malloc部分,mdk的標準malloc申請的記憶體區時8位元組對齊的。

4.若自定義的malloc函式本身沒有對分配的記憶體實現4位元組或以上的對齊操作,分配出來的不對齊的記憶體,編譯器是不知道的,所以很可能會產生問題。

此時最好的解決方式在記憶體池陣列前新增__align(4)關鍵字,只需保證自定義malloc分配出來的首位址是4位元組對齊。

比如:__align(4) u8 mem1base[mem1_max_size];

相關更多stm32位元組對齊問題的討論,請參考正點原子相關帖子

其中問題的關鍵就在於正點原子自定義的mymalloc函式沒有實現4位元組對齊。

STM32 記憶體對齊

來自帖子 舉例吧 u8 array n 這是1位元組對齊的,與n取值無關。u16 array n 這是2位元組對齊的,與n取值無關。u32 array n 這是4位元組對齊的,與n取值無關。你把u16型陣列的長度改為256可用,那僅僅是聯結器的偶然,知識要嚴謹不能依賴偶然 既然整個陣列的起始位址不能...

STM32 結構體的位元組對齊和大小端

1 測試平台 本次實驗的平台以32位cortexm0微控制器,不同的平台的實驗結果可能是不一樣的,但是思路都一樣。2 基礎概念 先介紹三個概念 自身對齊值 指定對齊值 有效對齊值。自身對齊值 資料型別本身的對齊值,例如char型別的自身對齊值是1,short型別是2,int型別是4 指定對齊值 編譯...

STM32除錯問題

1 stm32用iar除錯出現error pe020 identifier file is undefined 解決方法 需要在 iar的options general options library configuration裡設定一下函式庫,不然printf函式不對,將library confi...