这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 单片机大小端转换的几点小技巧

共5条 1/1 1 跳转至

单片机大小端转换的几点小技巧

高工
2022-06-06 10:16:52     打赏

大小端及字节序在嵌入式软件开发过程中经常会遇到,数据传输、存储、通信等这些地方都会牵涉到,下面就来给大家分享一下相关知识。


回顾字节序


字节序,即字节在电脑中存放时的序列与输入(输出)时的序列是先到的在前还是后到的在前。---来自百度百科


拿数据 0x01020304为例:


在大端CPU中:数据将存储为0x01(address + 0),0x02(address + 1),0x03(address + 2),0x04(address + 3)。


在小端CPU中:数据将存储为0x04(address + 0),0x03(address + 1),0x02(address + 2),0x01(address + 3)。

image.png


之前给大家分享过一篇文章《CPU大小端之分》讲述了大小端的细节内容,不了解的读者可以阅读了解一下。


如果你的程序使用简单的数据结构(例如“ int”和“ short”),则没有什么麻烦。但是,如果数据结构类似于以下示例,则可能会遇到问题。

image.png

在大端 CPU 中编译并执行此代码时, t0”的值为0x01。在小端CPU中, t0”的值为0x04。


那么问题来了:要想使存储顺序从大端,变为小端,怎么办呢?


方法其实有很多种,这里讲讲针对IAR的两种方法:

  • 使用__big_endian关键字。

  • 使用__REV, __REV16, __REVSH, RBIT函数。


使用__big_endian关键字

IAR中__big_endian关键字提供了一种方便的方式来将应用程序从big-endian移植到little-endian。


__big_endian关键字用于访问以big-endian字节顺序存储的变量,而与应用程序其余部分使用的字节顺序无关。在ARMv6或更高版本进行编译时,可以使用__big_endian关键字。


只需添加__big_endian关键字即可,如:

image.png

修改后的代码在低位字节CPU中编译和执行,变量“ t0”为0x01。


注意:此关键字不能用于指针。同样,此属性不能在数组上使用。

同时,关键字__big_endian插入REV指令以交换字节数据,REV指令的插入会影响代码大小和执行时间。

image.png


关键字具有限制,不能应用于复杂的数据结构,比如以下代码会生成错误

image.png


使用__REV, __REV16, __REVSH, RBIT函数

大端和小端之间的字节顺序差异只是顺序,因此我们需要做的是更改字节顺序,我们再次以变量0x01020304为例:

image.png


我们可以通过代码实现交换功能,比如:

image.png


通过这种方式实现,将导致消耗更多时间和代码大小。
在C代码中,我们通常编写内联汇编代码实现交换。IAR有种内部函数可以实现该功能。
比如下面交换功能:

image.png

image.png代码如下:

image.png


以上就是在IAR中实现大小端字节序的迁移方法,感兴趣的读者可以在IAR中编码测试一下。





关键词: 单片机     大小端     转换    

专家
2022-06-06 10:21:42     打赏
2楼

感谢分享


专家
2022-06-06 10:33:50     打赏
3楼

资料很好,值得学习,谢谢楼主分享


工程师
2022-06-14 23:47:41     打赏
4楼

技巧总结的很到位


工程师
2022-06-16 22:41:10     打赏
5楼

总结的蛮好的


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]