stm32 memcpy 錯位問題

2021-08-13 18:53:00 字數 1568 閱讀 3382

是由於結構體沒有的對齊標準未指定;

關於 #param pack n:

#pragma pack(4)

class testb

; int nsize = sizeof(testb);

這裡nsize結果為12,在預料之中。

現在去掉第乙個成員變數為如下**:

#pragma pack(4)

class testc

; int nsize = sizeof(testc);

按照正常的填充方式nsize的結果應該是8,為什麼結果顯示nsize為6呢?

事實上,很多人對#pragma pack的理解是錯誤的。

關於struct的使用方法

struct是一種復合資料型別,其構成元素既可以是基本資料型別(如int、long、float等)的變數,也可以是一些復合資料型別(如array、struct、union等)的資料單元。對於結構體,編譯器會自動進行成員變數的對齊,以提高運算效率。預設情況下,編譯器為結構體的每個成員按其自然對界(natural alignment)條件分配空間。各個成員按照它們被宣告的順序在記憶體中順序儲存,第乙個成員的位址和整個結構的位址相同。

自然對界是指按結構體的成員中size最大的成員對齊。

結構,聯合,或者類的資料成員,第乙個放在偏移為0的地方,以後每個資料成員的對齊,按照#pragma pack指定的數值和結構體的自然對齊長度中比較小的那個進行。

也就是說,當#pragma pack的值等於或超過所有資料成員長度的時候,這個值的大小將不產生任何效果。

結構體的對齊,按照結構體中size最大的資料成員和#pragma pack指定值之間,較小的那個進行。

具體解釋

class testb

; 這個類實際佔據的記憶體空間是9位元組

類之間的對齊,是按照類內部最大的成員的長度,和#pragma pack規定的值之中較小的乙個對齊的。

所以這個例子中,類之間對齊的長度是min(sizeof(int),4),也就是4。

9按照4位元組圓整的結果是12,所以sizeof(testb)是12。

如果class testb

; //可以看出,上面的位置完全沒有變化,只是類之間改為按2位元組對齊,9按2圓整的結果是10。

//所以 sizeof(testb)是10。

最後看原貼:

現在去掉第乙個成員變數為如下**:

#pragma pack(4)

class testc

; //整個類的大小是5位元組,按照min(sizeof(short),4)位元組對齊,也就是2位元組對齊,結果是6

//所以sizeof(testc)是6。

在linux下面就是

typedef struct test ;

typedef struct test1;

gcc test.c 編譯後,它們的大小就是7,8了

windows下面預設的是#pragma pack(8)

因為編譯器在編譯時會對程式進行優化,以便加快訪問速度,所以一般都會按照2的倍數進行位元組對齊。用這個巨集就是為了防止編譯器對結構的定義進行對齊。

STM32資料位錯位問題研究

不久前,本人需要用多路stm32adc取樣,用dma傳輸,發現資料錯位問題,真的很惱火。有時候發現adc位錯一位的有,錯兩位的有,也有三位四位的,查查網上大神,一般都是說adc不能在連續轉換模式下工作就ok了,但是我程式的問題依舊。前幾天,不經意間發現,原來我程式的adc轉換是先早開於dma轉換的。...

STM32中的memcpy函式的使用

最近在用jy61做乙個傾角專案。剛好商家那裡有個示例 有寫這個函式。正好給大家講下這個函式是怎麼用的。上面這個圖呢,是我從商家那裡擷取出來的。什麼意思呢 給大家講下。memcpy 函式用於 把資源記憶體 src所指向的記憶體區域 拷貝到目標記憶體 dest所指向的記憶體區域 拷貝多少個?有乙個siz...

STM32 CAN通訊問題

檢舉 2012 07 04 20 59 breath123 分類 工程技術科學 瀏覽974次 can通訊測試中 使能報文標示符過濾器按照標示符的內容進行比對過濾,擴充套件id不是如下的就拋棄掉,是的話,會存入fifo0。can filterinitstructure.can filteridhigh...