0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机RAM真的像你想的那么“单纯”吗

GReq_mcu168 来源:单片机匠人 作者:蔡琰老师 2021-11-19 09:47 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

当我们写代码的时候,会用到很多变量,如果随意的定义变量,比如写了N多个“unsigned char/int X;”那么代码可能会显的很乱,自己拐回头看的时候都晕掉了,那么这个时候我们可以构造一个复杂的数据类型-结构体类型,对代码中出现的变量进行类别的划分,用构造的结构体类型定义结构体变量,在写or看代码的时候,只要看到这个结构体,就能大致的知道其实现功能,这样看起来就神清气爽了,可读性大大提高。

我们定义的结构体变量,如果没有特殊规定的话是存储在RAM中的,单片机的RAM资源是有限的,那这个结构体变量在RAM中占的空间大小就是我们需要关注一个问题了,它真的像你想的那么“单纯”吗?接下来我们一起来看看吧!

在看下面的图之前,我们说一个前提,在STM32单片机这个32位系统中,signed/unsigned int 占4个字节,signed/unsigned short int 占2个字节 signed/unsigned char 占1个字节,我们称这些为基本数据类型。Size = Sizeof(Test);这个函数是求取这个结构体变量Test所占内存的大小,并返回给Size。

5b924e68-43ac-11ec-b939-dac502259ad0.jpg

图1

5be2b010-43ac-11ec-b939-dac502259ad0.jpg

图2

请看上图,我们使用基本数据类型构造了3个复杂的结构体数据类型,仔细看会发现,这3个数据类型的成员可是不大一样的,我们来看第一个Test,这个数据类型总共占4+4=8个字节,这个很好理解,那第二个Test1,占空间大小按道理来说应该是1+4 = 5个字节,但是为什么还是8呢,第三个Test2,占空间大小应该是1+1+4=8,为什么还是8呢?

这个里面就涉及到了结构体对齐,所有的成员在分配内存时都要与所有成员中占内存最多的基本数据类型所占内存空间的字节数对齐。假如这个字节数为N,那么对齐的原则是:理论上所有成员在分配内存时都是紧接在前一个变量后面依次填充的,但是如果是“以 N 对齐”为原则,那么,如果一行中剩下的空间不足以填充某成员变量时,即剩下的空间小于某成员变量的数据类型所占的字节数,该成员变量在分配内存时另起一行分配。如图3,4:

5c8ed048-43ac-11ec-b939-dac502259ad0.jpg

图3

5cde1ff4-43ac-11ec-b939-dac502259ad0.jpg

图4

5d1a041a-43ac-11ec-b939-dac502259ad0.jpg

图5

通过上面的实际测试,我们得出,在构造结构体复杂数据类型的时候,成员变量的排放一定要注意顺序,遵守排放原则,否则就会白白浪费你的空间,掌握好排放原理,能大大提高你的空间利用率。比如我们构造如图5的结构体类型,它依然还是占8个字节。

文末再给大家出个问题,大家看看下面我们构造的数据类型,它们分别占的空间是多大呢?

5df404da-43ac-11ec-b939-dac502259ad0.jpg

图6

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6078

    文章

    45573

    浏览量

    673451
  • RAM
    RAM
    +关注

    关注

    8

    文章

    1400

    浏览量

    120978
  • 代码
    +关注

    关注

    30

    文章

    4976

    浏览量

    74365

原文标题:别再说你的单片机RAM不够用了,来看看这个吧...

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    单片机中有FLASH为啥还需要EEROM?

    单片机里明明有FLASH,为啥还要再塞个EEPROM?不少刚接触嵌入式的小伙伴估计都有过这样的疑惑:FLASH能存程序,容量大,读取又快,干嘛还要加个读写慢、容量小的EEPROM?这不是多此一举嘛。其实,这俩兄弟各有所长,分工明确,就像你电脑里的固态硬盘和内存条,谁也替不
    的头像 发表于 03-05 13:39 266次阅读
    <b class='flag-5'>单片机</b>中有FLASH为啥还需要EEROM?

    单片机里的程序运行方式

    我们想要理解单片机是如何运行程序的,我们首先需要了解单片机的组成,我们这里以80C51单片机为例来理解程序在单片机中是如何运行的。 单片机
    发表于 01-16 06:57

    学习单片机快速方法

    使用开发软件,比如KEIL。建议大家用C言语编程,汇编语言有时间可以学习一下。 毕竟C语言一目了然,移植性较好。虽然汇编效率高,但是难懂。况且现在单片机集成度越来越高,不必要那么高效率的代码。你想想,花
    发表于 01-14 07:42

    这几个单片机技巧如果不了解,真的很难再进阶

    功能模块的操作上。所以如果对这些特性不了解,那么调试起来问题就会很多,反而导致执行效率低于汇编语言。如何解决单片机的抗干扰性问题? 防止干扰最有效的方法是去除干扰源、隔断干扰路径,但往往很难做到,所以只能看单片机
    发表于 01-05 07:22

    单片机堆栈解析

    什么是单片机堆栈? 在片内RAM中,常常要指定一个专门的区域来存放某些特别的数据,它遵循顺序存取和后进先出(LIFO/FILO)的原则,这个RAM区叫堆栈。 它的作用 子程序调用和中断服务时CPU
    发表于 12-09 06:52

    单片机程序的执行

    单片机RAM对应于DDR RAM,那Flash是不是就对应于硬盘了呢?在CSAPP上明白了,PC上之所以都在DDR RAM上,是速度的因素。 硬盘的速度太慢,即使是即将到来的SS
    发表于 12-04 06:20

    请问单片机RAM空间不够用了怎么办?

    单片机RAM空间不够用了怎么办?
    发表于 11-25 08:09

    第1章 如何学习单片机

    路在何方;也因为作者摸过烧红的铁块,烫了手,所以也可以告诉读者教训和代价是什么。希望各位都能站在作者的肩膀上,看得更远! 1.1学什么类型的单片机 单片机的型号那么多,如何选取一款合适的进行学习?如果没有任何
    的头像 发表于 10-10 10:32 657次阅读

    单片机原理及应用详解

    单片机(Microcontroller Unit, MCC)  是一种集成计算机核心功能(CPU、存储器、I/O接口等)的微型芯片,广泛应用于嵌入式系统中。以下是其原理及应用的详细介绍: 一、单片机
    的头像 发表于 08-11 13:57 2759次阅读

    单片机用什么封装

    单片机封装是将芯片内部电路与外部引脚连接并包裹保护的结构,不仅影响单片机的安装方式、适用场景,还与电路设计的紧凑性、散热性能密切相关。不同封装类型各有特点,适配从简单电路到复杂系统的多样化需求
    的头像 发表于 08-01 13:47 1581次阅读

    什么单片机比较耐用

            在工业控制、户外设备、医疗仪器等场景中,单片机的耐用性直接决定了设备的稳定运行与维护成本。耐用的单片机通常具备宽温工作范围、强抗干扰能力、稳定的电源适应性和长寿命的硬件设计。深圳市安
    的头像 发表于 07-31 13:48 904次阅读

    单片机的储存优点是什么

    场景。深圳市安凯星科技有限公司在单片机应用开发中,充分利用这些储存优点,为拓邦、朗科、安徽龙多等客户打造了高效稳定的解决方案。 1.集成度高,节省硬件空间 单片机将程序存储器(ROM)、数据存储器(RAM)与 CPU、I/O 接
    的头像 发表于 07-31 10:09 814次阅读

    怎么测单片机系统频率

    单片机系统频率是指单片机工作时的时钟频率,它直接影响单片机的运行速度和处理能力,准确测量系统频率对单片机应用开发、程序调试和性能优化具有重要意义。测量
    的头像 发表于 07-25 11:39 1060次阅读

    单片机怎么驱动电机?

    在各类自动化设备和智能装置中,电机是重要的执行部件,而单片机作为控制核心,需要通过特定的方式驱动电机运转。单片机驱动电机并非直接连接即可,而是要根据电机类型和功率,搭配合适的驱动电路,才能实现稳定
    的头像 发表于 07-25 09:31 1282次阅读

    单片机怎么烧程序

    单片机烧程序是将编写好的程序代码写入单片机内部存储单元,让单片机按照预设逻辑工作的过程,是单片机应用开发中不可或缺的环节。无论是简单的灯光控制程序,还是复杂的工业控制算法,都需要通过烧
    的头像 发表于 07-23 11:47 1954次阅读