那曲檬骨新材料有限公司

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

單片機(jī)大小端轉(zhuǎn)換的幾點(diǎn)小技巧

jf_pJlTbmA9 ? 來(lái)源:嵌入式專(zhuān)欄 ? 作者:嵌入式專(zhuān)欄 ? 2023-09-18 10:58 ? 次閱讀

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

回顧字節(jié)序

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

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

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

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

wKgZomUD6pGAGoQNAACWk_PhUKU469.jpg

如果你的程序使用簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)(例如“ int”和“ short”),則沒(méi)有什么麻煩。但是,如果數(shù)據(jù)結(jié)構(gòu)類(lèi)似于以下示例,則可能會(huì)遇到問(wèn)題。

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

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

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

那么問(wèn)題來(lái)了:要想使存儲(chǔ)順序從大端,變?yōu)樾《耍趺崔k呢?

方法其實(shí)有很多種,這里講講針對(duì)IAR的兩種方法:

使用__big_endian關(guān)鍵字。

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

使用__big_endian關(guān)鍵字

IAR中__big_endian關(guān)鍵字提供了一種方便的方式來(lái)將應(yīng)用程序從big-endian移植到little-endian。

__big_endian關(guān)鍵字用于訪問(wèn)以big-endian字節(jié)順序存儲(chǔ)的變量,而與應(yīng)用程序其余部分使用的字節(jié)順序無(wú)關(guān)。在ARMv6或更高版本進(jìn)行編譯時(shí),可以使用__big_endian關(guān)鍵字。

只需添加__big_endian關(guān)鍵字即可,如:

____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。

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

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

wKgaomUD6pKAa1p_AALai85Y_1A869.png

關(guān)鍵字具有限制,不能應(yīng)用于復(fù)雜的數(shù)據(jù)結(jié)構(gòu),比如以下代碼會(huì)生成錯(cuò)誤:

__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é)順序,我們?cè)俅我宰兞?x01020304為例:

wKgaomUD6pSAaFzgAADg91L_Fr0357.png

我們可以通過(guò)代碼實(shí)現(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; 
}

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

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

比如下面交換功能:

wKgZomUD6pWATH9DAAICgU2p4J8844.png

代碼如下:

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

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

來(lái)源:嵌入式專(zhuān)欄

審核編輯:湯梓紅

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

    關(guān)注

    6043

    文章

    44621

    瀏覽量

    638559
  • 嵌入式
    +關(guān)注

    關(guān)注

    5092

    文章

    19177

    瀏覽量

    307674
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10902

    瀏覽量

    213016
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    制作單片機(jī)幾點(diǎn)心得體會(huì)

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

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

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

    單片機(jī)學(xué)習(xí)的意義有哪幾點(diǎn)

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

    單片機(jī)ad轉(zhuǎn)換電路

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

    單片機(jī)EMC設(shè)計(jì)的幾點(diǎn)建議

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

    單片機(jī)EMC設(shè)計(jì)的幾點(diǎn)建議

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

    單片機(jī)實(shí)驗(yàn)-- AD轉(zhuǎn)換實(shí)驗(yàn)

    單片機(jī)實(shí)驗(yàn)-- AD轉(zhuǎn)換實(shí)驗(yàn)
    發(fā)表于 12-24 23:10 ?0次下載

    單片機(jī)C語(yǔ)言的幾點(diǎn)基礎(chǔ)知識(shí)說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是單片機(jī)C語(yǔ)言的幾點(diǎn)基礎(chǔ)知識(shí)說(shuō)明。
    發(fā)表于 07-05 17:41 ?2次下載
    <b class='flag-5'>單片機(jī)</b>C語(yǔ)言的<b class='flag-5'>幾點(diǎn)</b>基礎(chǔ)知識(shí)說(shuō)明

    stc單片機(jī)ad轉(zhuǎn)換程序

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

    51單片機(jī)的IO接口的地址和賦值大小的關(guān)系

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

    ARM大小模式

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

    破解單片機(jī)固件的幾點(diǎn)建議

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

    單片機(jī)如何增大電流?電流大小與什么有關(guān)?

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

    單片機(jī)中RAM少有哪幾點(diǎn)原因?

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

    單片機(jī)解密失敗有哪幾點(diǎn)原因呢?

    單片機(jī)解密失敗有哪幾點(diǎn)原因呢? 單片機(jī)解密失敗的原因有很多,下面將詳細(xì)列舉可能的原因,并逐一進(jìn)行解釋?zhuān)云跒槟峁┮粋€(gè)詳盡、詳實(shí)、細(xì)致的文章。 1. 芯片廠商實(shí)施的硬件保護(hù)機(jī)制 現(xiàn)代單片機(jī)
    的頭像 發(fā)表于 11-07 10:17 ?936次閱讀
    至尊百家乐赌场娱乐网规则| 百家乐官网下路教学| 都坊百家乐的玩法技巧和规则| 百家乐官网论坛官网| 东方夏威夷网站| 电子百家乐作假| 苹果百家乐官网的玩法技巧和规则 | 百家乐游戏唯一官网网站| 百家乐官网网上真钱赌场娱乐网规则 | 太阳百家乐网址| 网页百家乐官网游戏下载| 95博彩通| 免费百家乐平预测软件| 百家乐玩法及细则| 百家乐官网注码法| 大发娱乐场官方下载| 百家乐在线娱乐平台| 首席百家乐官网的玩法技巧和规则 | 威尼斯人娱乐城| 帝王百家乐全讯网2| 百家乐官网赌博娱乐城大全| BET365体育在线| 百家乐和的打法| 百家乐闲单开多少| 百家乐官网赌机玩法| 桂平市| 大发888注册步骤| 百家乐出牌规| 百家乐视频大厅| 神人百家乐官网赌场| 大发888娱乐场下载iypuqrd| 太阳城百家乐杀猪吗| 互联网百家乐官网的玩法技巧和规则| 同乐城百家乐官网现金网| 大发888娱乐场 手机版| 可信百家乐的玩法技巧和规则| 自己做生意怎样才能带来财运| 百家乐官网最新投注方法| 泸州市| 大发888娱乐场and| 奥斯卡百家乐的玩法技巧和规则|