STM32的大小端模式——什么是大小端模式?

2023-05-16

目录

    • 1. 什么是大小端模式
    • 2. 为什么会有大小端模式之分
    • 3. 什么情况需要考虑大小端模式
    • 4. 常见的设备的大小端模式
    • 5. 测试大小端模式例程
    • 6. 大小端转化例程

1. 什么是大小端模式

大端模式Big-Endian:高字节存于内存低地址,低字节存于内存高地址。
小端模式Little-Endian:低字节存于内存低地址,高字节存于内存高地址。

网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。

首先我们来看下数据在大小端两种模式下存储图,假设有一个整型数0x12345678,从图中可以看出明显的区别:
在这里插入图片描述
再给一张图便于理解:
在这里插入图片描述

2. 为什么会有大小端模式之分

这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于 大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

关于为什么会有大小端模式之分还可以从大小端两种模式各自的优缺点来分析:
Big-Endian优点:靠首先提取高位字节,你总是可以由看看在偏移位置为0的字节来确定这个数字是 正数还是负数。你不必知道这个数值有多长,或者你也不必过一些字节来看这个数值是否含有符号位。这个数值是以它们被打印出来的顺序存放的,所以从二进制到 十进制的函数特别有效。
因而,对于不同要求的机器,在设计存取方式时就会不同。

Little-Endian优点:提取一个,两个,四个或者更长字节数据的汇编指令以与其他所有格式相同的方式进行:首先在偏移地址为0的地方提取最低位的字节,因为地址偏移和字节数是一对一的关系,多重精度的数学函数就相对地容易写了。
如果你增加数字的值,你可能在左边增加数字(高位非指数函数需要更多的数字)。 因此, 经常需要增加两位数字并移动存储器里所有Big-endian顺序的数字,把所有数向右移,这会增加计算机的工作量。不过,使用Little- Endian的存储器中不重要的字节可以存在它原来的位置,新的数可以存在它的右边的高位地址里。
这就意味着计算机中的某些计算可以变得更加简单和快速。

3. 什么情况需要考虑大小端模式

相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换。

原因如下:网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据的高字节。小端模式的多字节数据在存放时,低地址存放的是低字节,而被发送方网络协议函数发送时会首先去低地址取数据(想要取高字节,真正取得是低字节),接收方网络协议函数接收时会将接收到的第一个字节存放到低地址(想要接收高字节,真正接收的是低字节),所以最后双方都正确的收发了数据。

而相同平台进行通信时,如果双方都进行转换最后虽然能够正确收发数据,但是所做的转换是没有意义的,造成资源的浪费。而不同平台进行通信时必须进行转换,不转换会造成错误的收发数据,字节序转换函数会根据当前平台的存储模式做出相应正确的转换,如果当前平台是大端,则直接返回不进行转换,如果当前平台是小端,会将接收到得网络字节序进行转换。

4. 常见的设备的大小端模式

STM32单片机:小端模式
STM8:大端
KEIL C51:大端
x86:小端
ARM既可以工作在大端模式,也可以工作在小端模式

注意:大小端模式是和硬件有关的,即和芯片本身有关,IDE不能进行设置。

5. 测试大小端模式例程

//如果字节序为big-endian,返回true;
//反之为   little-endian,返回false

bool IsBig_Endian()
{
    unsigned short test = 0x1234;
    if(*( (unsigned char*) &test ) == 0x12)
       return TRUE;
   else
       return FALSE;
}//IsBig_Endian()

其他例程:

int checkCPUendian()
{
      union{
             unsigned long int i;
             unsigned char s[4];
       }c;
       c.i = 0x12345678;
       return (0x12 == c.s[0]); 
}

6. 大小端转化例程

typedef unsigned short int uint16;
typedef unsigned long int uint32;
// 短整型大小端互换
#define BigLittleSwap16(A)  ((((uint16)(A) & 0xff00) >> 8) | \
 
                             (((uint16)(A) & 0x00ff) << 8))
 
 // 长整型大小端互换
#define BigLittleSwap32(A)  ((((uint32)(A) & 0xff000000) >> 24) | \

                             (((uint32)(A) & 0x00ff0000) >> 8) | \
 
                            (((uint32)(A) & 0x0000ff00) << 8) | \
 
                            (((uint32)(A) & 0x000000ff) << 24))

参考:
https://blog.csdn.net/weixin_34088583/article/details/94191143
https://blog.csdn.net/dongfangjing/article/details/50822143
https://strongerhuang.blog.csdn.net/article/details/99669954

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32的大小端模式——什么是大小端模式? 的相关文章

  • 大创训练:基于图像处理的智能安防系统(序)

    基本完成目标 xff1a 利用OPENCV进行图像人脸识别进行操作 后期 xff1a 实际应该用到各个平台 QQ xff1a 754331516 欢迎交流 两周一更
  • 研究中常用的数据归一化方法(附Matlab程序)

    在数据处理中 我们往往需要对计算得到的结果数据 xff08 如fMRI中计算得到功能连接等指标 xff09 进行归一化 xff08 Normalization xff09 处理 其实不止在脑科学领域 xff0c 在其他领域也常常需要对结果数
  • INA219与INA216测试总结

    最近需要用到测电压的芯片 xff0c 主要看了一下有TI芯片的INA219系列和INA226系列 xff0c 索性回来都测试了一下 xff0c INA216的话我测试的时候没有图片 INA219我用的是这一款 xff0c 这一款我测试的时候
  • 基于ACFLY无人机调试笔记(一)

    调试心得 最近调试有空了来调试无人机 xff0c 飞控是用的ACFLY EDU的开源飞控 xff0c 因为ACFLY的教程比较少 xff0c 比较偏向商业化 xff0c 所以我开始记录一下使用 记录些项目进行二次开发过程中的细节ACFLY的
  • 入门信号完整性(1)

    最近在学习信号完整性 记录一下学习的过程 好久没回来写了 总觉得脑子是不够用的 这一回打算在博客上写关于信号完整性的知识 xff0c 但是信号完整性的知识非常的抽象 xff0c 所以我们也不能只是学习理论啦 xff0c 还需要仿真软件 xf
  • 二极管仿真模式在同步BUCK里面的应用

    效化和小型化 xff0c 一直都是功率电源发展的两个方向 同步BUCK在这两个方面的卓越表现 xff0c 也是在越来越多的场合得到了运用 xff0c 像锂电池充电 二次砖块电源等等 如图1所示 xff0c 同步BUCK相较传统BUCK最主要
  • 树莓派初体验之安装及SSH远程连接

    树莓派初体验之安装及SSH远程连接 安装远程通信 等了好久终于把树莓派等来了 xff0c 想法是通过pix4飞控和树莓派通信 xff0c 进行飞控的开发 xff0c 毫无经验 xff0c 一点一点来吧 xff0c 也希望有人一起来愉快的学习
  • 树莓派4B与Pixhawk4飞控之状态读取

    树莓派4B与Pixhawk4飞控之状态监控读取 飞控配置树莓派配置程序代码总结 先看看装备 xff0c 上节就说了 xff0c 这树莓派的壳子我喜欢 历经九九八十一难 xff0c 终于把树莓派和Pixhawk4飞控接通了 xff0c 中间尝
  • Ros机器人之(五)订阅subscriber消息

    Ros机器人之 xff08 五 xff09 订阅subscriber消息 这个讲的是订阅节点消息 learning topic里src下创建一个cpp文件 touch pos subscriber 内容如下 xff1a span class
  • Ardupilot之Mavros实现Ros节点控制(一)

    Ardupilot之Mavros实现Ros节点控制 Mavros安装修改Mavros运行Mavros 这部分ros发布的命令话题参考的是PX4固件最基本的Offboard node节点 xff0c 命令发布后 xff0c 能够连接并解锁 x
  • Ardupilot之Mavros实现Ros节点控制(二)

    Ardupilot之Mavros实现Ros节点控制 xff08 二 xff09 offboard建立仿真运行 未完成mavros安装及相关设置的参考上一篇文章 Ardupilot之Mavros实现Ros节点控制 xff08 一 xff09
  • Dronekit代码学习(一)连接及基础状态设置

    Dronekit代码学习 xff08 一 xff09 连接及基础状态设置 目前Dronekit可自行设置的内容较少 xff0c 但能满足基本使用要求 后面还是需要对Mavlink相关指令进行学习 连接 地址根据实际情况修改 xff0c 官网
  • PX4之Gazebo多机仿真尝试

    PX4之Gazebo多机仿真尝试 运行多机前 xff0c 确保你的单机运行没有问题 Px4源码中已经包含了二机的仿真 xff0c 运行以下命令 xff1a roslaunch px4 multi uav mavros sitl span c
  • windows10+nvidia驱动+cuda10.1+cudnn安装教程

    一 显卡驱动 提前安装好nvidia驱动 xff0c windows一般都自动安装了nvidia驱动了 没有安装驱动可以去官网下载驱动 https www geforce cn drivers 选择自己对应的显卡驱动 xff0c 默认安装就
  • GAAS学习(一)Offboard基本控制

    GAAS学习 xff08 一 xff09 Offboard基本控制 开源项目GAAS xff1a https github com generalized intelligence GAAS 一 确保环境安装配置完成 ROS Firmwar
  • Dronekit代码学习(五)基于Gps下的自动跟随

    Dronekit代码学习 xff08 五 xff09 基于Gps下的自动跟随 参考Dronkit python xff1a https github com dronekit dronekit python 实时更新PC端GPS位置 xff
  • GAAS学习(三)简单全局目标追踪

    GAAS学习 xff08 三 xff09 简单全局目标追踪 基于KCF简单目标追踪 xff0c 方法如下 xff1a 编译KCF相关库 git clone https span class token punctuation span sp
  • MATLAB车牌识别(含GUI,语音播报)

    GUI框架源码 xff1a https download csdn net download weixin 44748303 12682333 一 设计原理及设计方案 1 系统简述 一个完整的车牌识别系统闭应包括车辆检测 图像采集 图像预处
  • 一个程序员的成长之路

    一个程序员的成长之路 接下来就是你要学的东西 xff0c 从简入难 xff0c 由浅入深 xff0c 以下的东西 xff0c 通通都要学会 静态网页 43 HTML 43 Css 43 JavaScript 43 JQuery 43 Boo
  • Jetson TX2 重装系统(刷机)+后续设置(安装Fcitx、解决拼音候选词不显示、换国内源、局域网实现VNC远程桌面)

    xff08 珍爱生命 xff0c 远离TX2 xff01 xff01 xff01 xff09 一 Jetson tx2刷机过程及注意事项 二 安装Fcitx 43 Googlepinyin 三 解决拼音模式下不显示候选词bug 四 Ubun

随机推荐