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

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

    关注

    6013

    文章

    44175

    浏览量

    624675
  • RAM
    RAM
    +关注

    关注

    8

    文章

    1332

    浏览量

    113947
  • 代码
    +关注

    关注

    30

    文章

    4603

    浏览量

    67396

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

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

收藏 人收藏

    评论

    相关推荐

    如何系统、科学地自学单片机

    很多初学者都会面临这个问题,我想学习单片机、我也想学好单片机、我也想系统地学习单片机,但是单片机涉及到的学科多且杂根本不是三天两天就能学完的,很多人都逃脱不了从入门到放弃的怪圈?
    的头像 发表于 03-28 08:03 540次阅读
    如何系统、科学地自学<b class='flag-5'>单片机</b>?

    单片机是什么?单片机编程如何入门?

    单片机其实是一种很早的叫法了,最开始我们的前辈叫单板机或者叫单片机,因为那个时候单片机的处理能力还没有很强,现在我们所用的基本都是微型处理单元,也叫为控制器也称之为MCU
    的头像 发表于 03-28 08:03 600次阅读
    <b class='flag-5'>单片机</b>是什么?<b class='flag-5'>单片机</b>编程如何入门?

    单片机RAM不够用怎么解决?

    来自一位用户的咨询,麻烦帮忙解答。越详细越好,有图有真相。如有相关的视频、文档也可以辅助说明,谢谢。 单片机RAM不够用怎么办? 单片机都有RAM,如果我们一下子定义了一大堆的变量,使
    发表于 02-02 07:35

    单片机原理及应用有哪些

    单片机(Microcontroller)是一种集成电路芯片,具备中央处理器(CPU)、存储器(RAM和ROM)、输入/输出(I/O)接口及定时/计数器等功能模块。它是嵌入式系统的核心组成部分,被
    的头像 发表于 01-15 16:25 784次阅读

    什么是中断?单片机中断处理过程详解

    如果单片机没有中断,那么单片机将失去灵魂。
    的头像 发表于 11-09 11:28 3968次阅读
    什么是中断?<b class='flag-5'>单片机</b>中断处理过程详解

    什么是单片机的最小系统

    超大规模集成电路的技术,通常会包含中央处理器CPU,随机存储器RAM,只读存储器ROM,多种I/O口和中断系统等等功能。 可以看到,单片机由不同的组成成分,那么问题来了, 什么是单片机
    的头像 发表于 11-06 10:54 1281次阅读
    什么是<b class='flag-5'>单片机</b>的最小系统

    单片机RAM少有哪几点原因?

    单片机RAM少有哪几点原因? 正文: 单片机是指把整个计算机系统集成在一个芯片之内,具有微型化、低功耗、低成本等特点的集成电路。单片机系统中RAM
    的头像 发表于 10-29 16:23 472次阅读

    单片机双向通信Proteus仿真的电路原理图

    简介:本文介绍的主要是单片机之间的双向通信Proteus仿真的电路原理图及其程序
    发表于 10-19 15:26 1次下载
    <b class='flag-5'>单片机</b>双向通信Proteus仿<b class='flag-5'>真的</b>电路原理图

    巧言单片机RAM及ROM

    巧言单片机RAM及ROM
    的头像 发表于 10-17 15:45 590次阅读

    单片机的功能和特点

    单片机,全称为单片微型计算机,是一种集成电路芯片,它将微处理器、存储器(RAM、ROM)、各种输入输出接口以及其他功能模块集成在一个硅片上。由于其体积小、功耗低、成本低、功能强大等特点,单片机
    发表于 10-16 17:05 3860次阅读

    单片机中的RAM vs ROM

    单片机中的RAM vs ROM
    的头像 发表于 09-28 17:57 849次阅读

    单片机开发需要用到那些软件?

    单片机又称单片微控制器,它是把一个计算机系统,包括cpu、ram、rom、定时/计数器和多种i/o接口集成到一个芯片上。单片机在很多领域都发挥了重要的作用,
    的头像 发表于 09-21 14:39 4243次阅读

    一份单片机多任务事件驱动C源码

    单片机的ROM与RAM存贮空间有限,一般没有多线程可用,给复杂的单片机项目带来困扰。
    的头像 发表于 08-24 09:22 586次阅读

    单片机编程高效利用RAM资源的方法(1)

    对于大多数单片机来说,片内的 RAM 空间通常都比片内 ROM 空间小,开发过程中,RAM 空间不足的情况更为常见,那么现在就来讲讲在编程的过程中,如何更加高效地利用好本就不充裕的
    发表于 07-22 10:51 481次阅读

    单片机发生闩锁效应的因素,如何防止发生单片机闩锁效应?

    单片机闩锁效应指的是单片机内部金属配线发生熔断的现象,那么导致单片机闩锁效应的因素是什么?单片机开发工程师表示,已知的导致
    的头像 发表于 07-10 11:21 1239次阅读