嵌入式杂记 -- MCU的大小端模式

MCU的大小端模式

  • 大端模式
  • 小端模式
  • 大小端模式测试
    • 联合体概念
    • MCU大小端模式测试
      • 大端模式测试
      • 小端模式测试
  • 大小端模式转换

在进行MCU开发的时候,我们需要注意MCU的数据存储模式,在嵌入式中有两种不同的存储模式,分别是 大端模式和小端模式

大端模式

所谓的大端模式,意思就是高字节的数据存储在低位低字节数据存储在高位。具体的表示方式如下图所示
在这里插入图片描述

小端模式

所谓的小模式,意思就是低字节的数据存储在低位高字节数据存储在高位。具体的表示方式如下图所示
在这里插入图片描述

大小端模式测试

针对不同的MCU,我们都需要分清其数据的存储方式,如果存储方式不对,那么在不同的MCU之间进行通信时,就会因为数据格式的不对导致通信错误。那么当我们拿到一个MCU后,又该如何知道其存储模式呢,我们可以使用C语言中的联合体进行区分。

联合体概念

联合体是C语言中的一种数据结构,它的定义方式跟结构体类似,但是跟结构体不同的是,联合体中的所有成员变量都使用同一块存储空间,存储空间的大小由联合体中最大的成员变量的数据类型决定。

union test
{
	unsigned char a;
	unsigned short b;
	unsigned int c;
};

在上面的程序中,定义了一个联合体,里面有3个成员变量,因为联合体中的成员变量是共用同一个存储空间的,所以上面的联合体中的存储空间就由最大的成员变量决定,也就是unsigned int类型。

MCU大小端模式测试

对于市面上的常用MCU,Crotex-M系列的MCU其存储格式是小端模式,而51内核的MCU其存储格式是大端模式,这两种MCU我们都可以使用Keil软件进行测试。

大端模式测试

要测试大端模式,我们需要先安装Keil的C51编译器,安装好之后我们打开软件。编写一段测试程序。


union test
{
	unsigned char mychar[4];
	unsigned long mylong;
};
  

void main()
{
	union test test1;
	
	test1.mychar[0] = 0x12;
	test1.mychar[1] = 0x34;
	test1.mychar[2] = 0x56;
	test1.mychar[3] = 0x78; 
	
	
}


测试程序编写好之后,我们打开Keil的软件仿真界面
我们打开Options for Target->Debug->Use Simulator
在这里插入图片描述
在这里插入图片描述
配置好之后,点击仿真按键进入仿真模式
在这里插入图片描述
在这里插入图片描述

从keil的变量地址中我们可以看到,mychar[0]的值为0x12,但是在mylong变量中,0x12被放到了高位,所以从上面测试可以看出,C51内核的MCU是大端模式

小端模式测试

小端模式的测试跟大端模式的测试差不多,但是要安装Keil的ARM编译器。安装好之后我们打开软件,编写一段测试程序。

union test
{
	unsigned char mychar[4];
	unsigned int myint;
};
  

void main()
{
	union test test1;
	
	test1.mychar[0] = 0x12;
	test1.mychar[1] = 0x34;
	test1.mychar[2] = 0x56;
	test1.mychar[3] = 0x78; 
	
	
}

测试程序编写好之后,我们打开Keil的软件仿真界面
我们打开Options for Target->Debug->Use Simulator
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

从keil的变量地址中我们可以看到,mychar[0]的值为0x12,在myint变量中,0x12被放到了低位,所以从上面测试可以看出,Crotex-M内核的MCU是小端模式。

大小端模式转换

对于需要在不同架构的MCU之间进行通信的场景来说,通常都需要进行大小端的转换,下面就给出常用的大小端转换的代码


static unsigned int little1,big1,little2,big2;
unsigned int swap_unsigned_int(unsigned int in_32)
{
	unsigned int out_32;
	
	out_32 = ((in_32 & 0xFF) << 24) | (((in_32 >> 8) & 0xFF) << 16) | (((in_32 >> 16) & 0xFF) << 8) | (((in_32 >> 24) & 0xFF));
	
	return out_32;
}

void main()
{
	// 大端转小端
	big1 = 0x78563412;
	little1 = swap_unsigned_int(big1);
	
	// 小端转大端
	little2 = 0x12345678;
	big2 = swap_unsigned_int(little2);
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/142700.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

dameng数据库数据id decimal类型,精度丢失

问题处理 这一次也是精度丢失&#xff0c;但是问题呢还是不一样&#xff0c;这一次所有的id都被加一了&#xff0c;只有id字段被加一&#xff0c;还有的查询查出来封装成对象之后对象的id字段被减一了&#xff0c;数据库id字段使用的decimal&#xff08;20,6&#xff09;&…

Apache Airflow (六) :DAG catchup 参数设置

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

软件测试 —— 常见的自动化测试架构!

一个自动化测试架构就是一个集成体系&#xff0c;其中定义了一个特殊软件产品的自动化测试规则。这一体系中包含测试功能函数库、测试数据源、测试对象识别标准&#xff0c;以及各种可重用的模块。这些组件作为小的构建模块&#xff0c;被组合起来代表某种商业流程。自动化测试…

求最大公约数math.gcd()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 求最大公约数 math.gcd() [太阳]选择题 下列代码执行输出的结果是&#xff1f; import math print("【执行】print(math.gcd(6, 8))") print(math.gcd(6, 8)) print(&quo…

【汇编】汇编语言的介绍

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、汇编是什么&#xff1f;二、为什么要学习汇编语言&#xff1f;三、学习汇编语言的好处四、安装汇编环境4.1 下载虚拟环境4.2 配置虚拟环境 总结 前言 计算…

我的创作纪念日-我在csdn的三周年

文章目录 机缘收获日常成就憧憬 机缘 2020 年 11 月 09 日&#xff0c;撰写了第 1 篇技术博客&#xff0c;到现在不知不觉三周年了。 慢慢的也会将自己的感受和知识梳理成专栏&#xff0c;记录日常的学习以及通过文章进行技术交流&#xff0c;和大家分享一个我认为比较好的成…

Unity Hub无法登陆的两种终极解决办法

最近换了个电脑&#xff0c;需要重装Unity&#xff0c; 然后unity hub 怎么都无法登陆&#xff0c;登陆不了就不能激活personal license。试了很多次&#xff0c;包括unity hub 2.5.8 和unity hub 3.3都不行&#xff0c;真的是很崩溃。因为是公司的电脑&#xff0c;限制比较多&…

西门子精智屏数据记录U盘插拔问题总结

西门子精智屏数据记录U盘插拔问题总结 注意: 数据记录过程中不允许带电插拔 U 盘! 数据记录的相关功能可参考以下链接中的内容: TIA博途wincc V16 如何进行变量周期归档?

AI大模型低成本快速定制秘诀:RAG和向量数据库

文章目录 1. 前言2. RAG和向量数据库3. 论坛日程4. 购票方式 1. 前言 当今人工智能领域&#xff0c;最受关注的毋庸置疑是大模型。然而&#xff0c;高昂的训练成本、漫长的训练时间等都成为了制约大多数企业入局大模型的关键瓶颈。 这种背景下&#xff0c;向量数据库凭借其独特…

算法笔记-第七章-栈的应用(未完成)

算法笔记-第七章-栈的应用 栈的基本常识栈的解释一栈的解释二 栈的操作序列合法的出栈序列可能的出栈序列补充知识点 后缀表达式&#xff08;无优先级&#xff09; 栈的基本常识 栈&#xff08;Stack&#xff09;是只允许在一端进行插入或删除操作的线性表。 栈的解释一 栈的…

基础大模型的结构特性与发展

摘要&#xff1a; 基础大模型的结构特性是什么给予的&#xff1f;在建模部分&#xff0c;我们将探索基础模型背后的底层架构&#xff0c;并确定5个关键属性。 首先&#xff0c;我们从讨论计算模型的表现力开始-捕获和吸收真实世界的信息&#xff0c;以及可扩展性-熟练地处理大量…

类和对象(4):Date类.运算符重载 1

一、赋值运算符重载 1.1 运算符重载 运算符重载是具有特殊函数名的函数&#xff0c;函数名字为&#xff1a;关键词operator需要重载的运算符符号。 不能重载C/C中未出现的符号&#xff0c;如&#xff1a;operator。重载操作符必须有一个类类型参数。不能改变用于内置类型运算…

【stack题解】逆波兰表达式求值 | 用队列实现栈

逆波兰表达式求值 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 、-、…

《深入浅出进阶篇》——空间换时间优化——P2671 求和

链接&#xff1a;https://www.luogu.com.cn/problem/P2671 上题干&#xff1a; 题目描述 一条狭长的纸带被均匀划分出了n个格子&#xff0c;格子编号从11到n。每个格子上都染了一种颜色colori​用[1,m]当中的一个整数表示&#xff09;&#xff0c;并且写了一个数字numberi​。…

arm2 day6

串口实现单个字符的收发 main.c uart4.c uart4.h

手机厂商参与“百模大战”,vivo发布蓝心大模型

在2023 vivo开发者大会上&#xff0c;vivo发布自研通用大模型矩阵——蓝心大模型&#xff0c;其中包含十亿、百亿、千亿三个参数量级的5款自研大模型&#xff0c;其中&#xff0c;10亿量级模型是主要面向端侧场景打造的专业文本大模型&#xff0c;具备本地化的文本总结、摘要等…

HTML设置标签栏的图标

添加此图标最简单的方法无需修改内容&#xff0c;只需按以下步骤操作即可&#xff1a; 1.准备一个 ico 格式的图标 2.将该图标命名为 favicon.ico 3.将图标文件置于index.html同级目录即可 为什么我的没有变化&#xff1f; 答曰&#xff1a;ShiftF5强制刷新一下网页就行了

湖南省第六届大学生测绘综合技能大赛 GIS 应用赛项

注意事项&#xff1a; ①确认试题编号正确后再开始作答。 ②所有图件需清晰可辨。 ③新建数值型字段设置数据类型为双精度&#xff0c;数字格式为数值&#xff0c;小数位数默认。 ④答卷中不能出现任何涉密信息&#xff0c;答卷文档转成PDF提交。 1.&#xff08;25 分&#xf…

Oracle数据库、实例、用户、表空间和表之间的关系

一、Oracle数据库中数据库、实例、用户、表空间和表&#xff08;索引、视图、存储过程、函数、对象等对象&#xff09;之间的关系。 1、Oracle的数据库是由一些物理文件组成&#xff1a;数据文件控制文件重做日志文件归档日志文件参数文件报警和跟踪日志文件备份文件。 2、实…

数据库 并发控制

多用户数据库系统&#xff1a;允许多个用户同时使用同一个数据库的数据库系统 交叉并发方式&#xff1a;在单处理机系统中&#xff0c;事务的并行执行实际上是这些并行事务的并行操作轮流交叉运行 同时并发方式&#xff1a;在多处理机系统中&#xff0c;每个处理机可以运行一个…