91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

單片機大小端轉換的幾點小技巧

jf_pJlTbmA9 ? 來源:嵌入式專欄 ? 作者:嵌入式專欄 ? 2023-09-18 10:58 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

大小端及字節(jié)序在嵌入式軟件開發(fā)過程中經(jīng)常會遇到,數(shù)據(jù)傳輸、存儲、通信等這些地方都會牽涉到,下面就來給大家分享一下相關知識。

回顧字節(jié)序

字節(jié)序,即字節(jié)在電腦中存放時的序列與輸入(輸出)時的序列是先到的在前還是后到的在前。
---來自百度百科

拿數(shù)據(jù) 0x01020304為例:

在大端CPU中:數(shù)據(jù)將存儲為0x01(address + 0),0x02(address + 1),0x03(address + 2),0x04(address + 3)。

在小端CPU中:數(shù)據(jù)將存儲為0x04(address + 0),0x03(address + 1),0x02(address + 2),0x01(address + 3)。

wKgZomUD6pGAGoQNAACWk_PhUKU469.jpg

如果你的程序使用簡單的數(shù)據(jù)結構(例如“ int”和“ short”),則沒有什么麻煩。但是,如果數(shù)據(jù)結構類似于以下示例,則可能會遇到問題。

union {
 unsigned int dat;
 unsigned char c[4]; 
}X;

void foo( ) {
 int t0;
 X.dat = 0x01020304;
 t0 = X.c[0];
 ???
}

在大端 CPU 中編譯并執(zhí)行此代碼時, t0”的值為0x01。在小端CPU中, t0”的值為0x04。

那么問題來了:要想使存儲順序從大端,變?yōu)樾《耍趺崔k呢?

方法其實有很多種,這里講講針對IAR的兩種方法:

使用__big_endian關鍵字。

使用__REV, __REV16, __REVSH, RBIT函數(shù)。

使用__big_endian關鍵字

IAR中__big_endian關鍵字提供了一種方便的方式來將應用程序從big-endian移植到little-endian。

__big_endian關鍵字用于訪問以big-endian字節(jié)順序存儲的變量,而與應用程序其余部分使用的字節(jié)順序無關。在ARMv6或更高版本進行編譯時,可以使用__big_endian關鍵字。

只需添加__big_endian關鍵字即可,如:

____big_endian union {
 unsigned int dat;
 unsigned char c[4]; 
}X;

void foo( ) {
int t0;
X.dat = 0x01020304;
t0 = X.c[0];
???
}

修改后的代碼在低位字節(jié)CPU中編譯和執(zhí)行,變量“ t0”為0x01。

注意:此關鍵字不能用于指針。同樣,此屬性不能在數(shù)組上使用。

同時,關鍵字__big_endian插入REV指令以交換字節(jié)數(shù)據(jù),REV指令的插入會影響代碼大小和執(zhí)行時間。

wKgaomUD6pKAa1p_AALai85Y_1A869.png

關鍵字具有限制,不能應用于復雜的數(shù)據(jù)結構,比如以下代碼會生成錯誤:

__big_endian
union {
 unsigned long dat;
 unsigned char c[4];
 struct {
 unsigned long a0: 1;
 unsigned long a1: 1;
 unsigned long a2: 2;
 unsigned long a3: 4;
 unsigned long a4: 8;
 unsigned long a5: 16;
 }s;
} f1_dat2;

使用__REV, __REV16, __REVSH, RBIT函數(shù)

大端和小端之間的字節(jié)順序差異只是順序,因此我們需要做的是更改字節(jié)順序,我們再次以變量0x01020304為例:

wKgaomUD6pSAaFzgAADg91L_Fr0357.png

我們可以通過代碼實現(xiàn)交換功能,比如:

typedef unsigned long uint32_t;
uint32_t bswap_32(uint32_t x) {
uint32_t t = x;
uint32_t s;
s = ( (((uint32_t)(t)   (uint32_t)0x000000ffUL) << 24) |
    (((uint32_t)(t)   (uint32_t)0x0000ff00UL) << 8) | 
     (((uint32_t)(t)   (uint32_t)0x00ff0000UL) >> 8) | 
 (((uint32_t)(t)   (uint32_t)0xff000000UL) >> 24) );
 return s; 
}

通過這種方式實現(xiàn),將導致消耗更多時間和代碼大小。

在C代碼中,我們通常編寫內聯(lián)匯編代碼實現(xiàn)交換。IAR有種內部函數(shù)可以實現(xiàn)該功能。

比如下面交換功能:

wKgZomUD6pWATH9DAAICgU2p4J8844.png

代碼如下:

#include 
void x1( void ) {
s2 = __REV(s1);
s3 = __REV16(s1);
s4 = __REVSH(s1);
}

以上就是在IAR中實現(xiàn)大小端字節(jié)序的遷移方法,感興趣的讀者可以在IAR中編碼測試一下。

來源:嵌入式專欄

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6067

    文章

    44992

    瀏覽量

    650510
  • 嵌入式
    +關注

    關注

    5152

    文章

    19675

    瀏覽量

    317604
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11080

    瀏覽量

    217101
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    制作單片機幾點心得體會

    制作單片機幾點心得體會,在電源的輸入端正向串聯(lián)或反向并聯(lián)一個二極管,當不小心接反電源的時候,二極管可以保護單片機不受反向電壓的襲擊
    發(fā)表于 06-05 11:23 ?4302次閱讀
    制作<b class='flag-5'>單片機</b>的<b class='flag-5'>幾點</b>心得體會

    單片機大小數(shù)據(jù)處理問題

    ,0x0022,0x0033,0x0044};char *ptr = buffer;發(fā)送數(shù)據(jù)的話直接操作ptr就可以了,現(xiàn)在考慮到單片機大小問題,如果我在這樣發(fā)送是不是就會出現(xiàn)問題,沒有合適的
    發(fā)表于 04-26 10:53

    單片機學習的意義有哪幾點

    單片機學習的意義,我分為以下幾點:1、能夠加深對硬件底層的理解,對其內部結構的學習可以讓你了解計算機的工作機理;2、應用單片機的產品已經(jīng)滲透到我們生活的各個領域,幾乎很難找到哪個領域沒有單片機
    發(fā)表于 01-05 07:41

    單片機ad轉換電路

    單片機ad轉換電路:通過對雙積分A/ D 轉換過程及其原理的分析,結合8031 單片機定時計數(shù)器的特點,設計出一種新的A/ D 轉換電路.
    發(fā)表于 05-11 22:50 ?265次下載
    <b class='flag-5'>單片機</b>ad<b class='flag-5'>轉換</b>電路

    單片機EMC設計的幾點建議

    單片機EMC設計的幾點建議 1.單片機的工作頻率   1.1單片機的設計應根據(jù)客戶的需求來選擇較低的工作頻率首先介紹一下這樣做的
    發(fā)表于 04-27 10:00 ?569次閱讀
    <b class='flag-5'>單片機</b>EMC設計的<b class='flag-5'>幾點</b>建議

    單片機EMC設計的幾點建議

    單片機的工作頻率單片機的設計應根據(jù)客戶的需求來選擇較低的工作頻率首先介紹一下這樣做的優(yōu)點:采用低的晶振和總線頻率使得我們可以選擇較小的單片機滿足時序的要求,這
    發(fā)表于 07-02 11:46 ?788次閱讀
    <b class='flag-5'>單片機</b>EMC設計的<b class='flag-5'>幾點</b>建議

    單片機實驗-- AD轉換實驗

    單片機實驗-- AD轉換實驗
    發(fā)表于 12-24 23:10 ?0次下載

    單片機C語言的幾點基礎知識說明

    本文檔的主要內容詳細介紹的是單片機C語言的幾點基礎知識說明。
    發(fā)表于 07-05 17:41 ?2次下載
    <b class='flag-5'>單片機</b>C語言的<b class='flag-5'>幾點</b>基礎知識說明

    stc單片機ad轉換程序

    本文主要闡述了stc單片機ad轉換程序及轉換心得。
    的頭像 發(fā)表于 11-04 09:58 ?1.1w次閱讀

    51單片機的IO接口的地址和賦值大小的關系

    關于51單片機的IO接口的地址與賦值大小理解前提了解關于51單片機的IO接口的地址與賦值大小理解其他單片機定義前提了解提示:我們需要回顧C語
    發(fā)表于 11-17 10:51 ?14次下載
    51<b class='flag-5'>單片機</b>的IO接口的地址和賦值<b class='flag-5'>大小</b>的關系

    ARM大小模式

    以及外設的性質等, 一定要先在單片機的數(shù)據(jù)手冊上查清楚可以使用的。在絕大多數(shù)情況下,基于 CM3 的單片機都使用小模式。為了避免不必要的麻煩,基本清一色地使用小
    的頭像 發(fā)表于 09-29 18:37 ?6518次閱讀
    ARM<b class='flag-5'>大小</b><b class='flag-5'>端</b>模式

    破解單片機固件的幾點建議

    單片機(MCU)一般都有內部程序區(qū)和數(shù)據(jù)區(qū)(或者其一)供用戶存放程序和工作數(shù)據(jù)(或者其一)。 為了防止未經(jīng)授訪問或拷貝單片機的機內程序,大部分單片機都帶有加密鎖定位或者加密字節(jié),以 保護片內程序。
    發(fā)表于 03-06 09:42 ?1299次閱讀

    單片機如何增大電流?電流大小與什么有關?

    單片機如何增大電流?電流大小與什么有關?? 單片機是一種嵌入式系統(tǒng),是一種微處理器,可以控制電子設備,如電子元器件、機械和電動設備等,來滿足特定需要。作為電子設備的一種核心部件,單片機
    的頭像 發(fā)表于 09-28 16:46 ?4858次閱讀

    單片機中RAM少有哪幾點原因?

    單片機中RAM少有哪幾點原因? 正文: 單片機是指把整個計算機系統(tǒng)集成在一個芯片之內,具有微型化、低功耗、低成本等特點的集成電路。單片機系統(tǒng)中RAM少常有
    的頭像 發(fā)表于 10-29 16:23 ?974次閱讀

    單片機解密失敗有哪幾點原因呢?

    單片機解密失敗有哪幾點原因呢? 單片機解密失敗的原因有很多,下面將詳細列舉可能的原因,并逐一進行解釋,以期為您提供一個詳盡、詳實、細致的文章。 1. 芯片廠商實施的硬件保護機制 現(xiàn)代單片機
    的頭像 發(fā)表于 11-07 10:17 ?1270次閱讀
    主站蜘蛛池模板: 国产福利萌白酱喷水视频铁牛 | 欧美ol丝袜高跟秘书在线观看 | 兔费看全黄三级 | 五月天婷五月天综合网在线 | 日本黄色片免费看 | 特级毛片免费视频观看 | a毛片网站 | 真实一级一级一片免费视频 | 日韩一级高清 | 天堂资源8中文最新版在线 天堂资源地址在线 | 男男np主受高h啪啪肉 | 天天射日日干 | 国产伦理一区二区三区 | 九九热在线精品视频 | 欧美一级黄色片在线观看 | 性猛交xxxx乱大交孕妇 | 亚洲一级毛片免费在线观看 | 91精品国产免费久久久久久青草 | 黄色特级毛片 | 高清成年美女xx免费网站黄 | 欧美性天堂 | 看全黄大片狐狸视频在线观看 | 欧洲精品码一区二区三区免费看 | 色域综合 | 中文天堂在线www | 国产va免费精品高清在线观看 | 淫欲高三| 国产精品主播在线观看 | 亚洲狼色专区 | 精品视频一区在线观看 | 在线播放国产一区 | 天堂色网| 天天射天天干天天操 | 亚洲插插 | 91网视频在线观看 | 久久久久久久久国产 | 性夜影院爽黄a免费视频 | 丁香婷婷亚洲六月综合色 | 丁香六月啪啪 | 男人的天堂视频在线 | 午夜噜噜噜私人影院在线播放 |