stm32中大小端轉換

2021-10-01 18:54:23 字數 1429 閱讀 4401

相同位元組序的平台(你是大端平台)在進行網路通訊時可以不進行位元組序轉換,但是跨平台(你是小端平台)進行網路資料通訊時必須進行位元組序轉換。

網路協議規定接收到得第乙個位元組是高位元組,存放到低位址,所以傳送時會首先去低位址取資料的高位元組。小端模式的多位元組資料在存放時,低位址存放的是低位元組,而被傳送方網路協議函式傳送時會首先去低位址取資料(想要取高位元組,真正取得是低位元組),接收方網路協議函式接收時會將接收到的第乙個位元組存放到低位址(想要接收高位元組,真正接收的是低位元組),所以最後雙方都正確的收發了資料。

而相同平台進行通訊時,如果雙方都進行轉換最後雖然能夠正確收發資料,但是所做的轉換是沒有意義的,造成資源的浪費。而不同平台進行通訊時必須進行轉換,不轉換會造成錯誤的收發資料,位元組序轉換函式會根據當前平台的儲存模式做出相應正確的轉換,如果當前平台是大端,則直接返回不進行轉換,如果當前平台是小端,會將接收到得網路位元組序進行轉換。

舉例:整形值10000,對應十六進製制表示為0x2710,按照位元組可分為0x27(高位)和0x10(低位)

小端位元組序:第乙個記憶體單元就是低位址,存放低位:0x10(低位元組),接下來的記憶體單元是高位址,存放高位:0x27 (高位元組)  --->0x1027

小端模式下,在記憶體中的存在形式

大端位元組序:第乙個記憶體單元就是低位址,存放高位:0x27(高位元組),接下來的記憶體單元是低位址,存放低位:0x10(低位元組) --->0x2710

大端模式下,在記憶體中的存在形式

stm32測試程式:小端模式

u16 eth_type_be;

char *p;

eth_type_be = 0xffee

printf("eth_type_be = %4x\r\n",eth_type_be);

p = (char *)ð_type_be;

printf("低位址p = %p\t 儲存的資料是 %x\r\n",p,(int)*p);

printf("高位址p = %p\t 儲存的資料是 %x\r\n",p+1,(int)*(p+1));

測試結果

對於小端模式來說,上面我們也說了,而被傳送方網路協議函式傳送時會首先去低位址取資料,對於上面0x2710來說,我們應該傳送高位元組0x27,後傳送0x10才對,可是我們發現0x10存在於記憶體的位址中,不是高位元組,顯然是錯誤的。所以對於小端模式來說,我們先進行一次大小端轉換,把0x2710轉換成0x1027,此時記憶體中低位址存放的是0x27,是高位元組,可以正確傳送了。

大小端模式,stm32採用小端模式

儲存模式 小端 較高的有效位元組儲存在較高的儲存器位址,較低的有效位元組儲存在較低的儲存器位址。大端 較高的有效位元組儲存在較低的儲存器位址,較低的有效位元組儲存在較高的儲存器位址。那麼,在記憶體裡面,其儲存就變成了 位址 hex 0x4000 0000 78 56 34 12 更為簡單一點 低位址...

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

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

STM32的ADC轉換模式

stm32的adc轉換模式 stm32的adc總共有兩種轉換模式 單次轉換和連續轉換 前幾天看了st官方的中文手冊,在adc模組的介紹中,同時出現了單次轉換模式 連續轉換模式和掃瞄模式,看完整個模組的文件後,對adc的轉換模式還是不理解,通過學習其他文件和程式設計測試,整理了 單次轉換 連續轉換和掃...