[应用相关] 为什么老会觉得单片机RAM不够用?

[复制链接]
1043|12
 楼主| 51xlf 发表于 2022-11-18 10:23 | 显示全部楼层 |阅读模式
代码的时候,会用到很多变量,如果随意的定义变量,比如写了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。
v2-183d3fbefa1d7f11723c029789c65531_720w.jpg
图1 v2-19a8322a5059c16dde65765bfe442302_720w.jpg
图2
请看上图,我们使用基本数据类型构造了3个复杂的结构体数据类型,仔细看会发现,这3个数据类型的成员可是不大一样的,我们来看第一个Test,这个数据类型总共占4+4=8个字节,这个很好理解,那第二个Test1,占空间大小按道理来说应该是1+4 = 5个字节,但是为什么还是8呢,第三个Test2,占空间大小应该是1+1+4=8,为什么还是8呢?
这个里面就涉及到了结构体对齐,所有的成员在分配内存时都要与所有成员中占内存最多的基本数据类型所占内存空间的字节数对齐。假如这个字节数为N,那么对齐的原则是:理论上所有成员在分配内存时都是紧接在前一个变量后面依次填充的,但是如果是“以 N 对齐”为原则,那么,如果一行中剩下的空间不足以填充某成员变量时,即剩下的空间小于某成员变量的数据类型所占的字节数,该成员变量在分配内存时另起一行分配。如图3,4
v2-ffd308f93162965976603071cf4e8034_720w.jpg
图3 v2-7a22c9ffb4a25939e2fee58b899c0279_720w.jpg
图4 v2-7234fc657d0e7e6a3a7690176b9a01e3_720w.jpg
图5
通过上面的实际测试,我们得出,在构造结构体复杂数据类型的时候,成员变量的排放一定要注意顺序,遵守排放原则,否则就会白白浪费你的空间,掌握好排放原理,能大大提高你的空间利用率。比如我们构造如图5的结构体类型,它依然还是占8个字节。
文末再给大家出个问题,大家看看下面我们构造的数据类型,它们分别占的空间是多大呢?
v2-456c1edebfb656ab1e6fba221f407094_720w.jpg
一只眠羊 发表于 2022-12-11 21:20 | 显示全部楼层
对啊,能用结构体,就不要单独定义全局变量了

失物招領 发表于 2022-12-11 21:52 | 显示全部楼层
我觉得现在可能就是MCU的资源比较多了,开始浪费

故意相遇 发表于 2022-12-11 22:24 | 显示全部楼层
之前我也遇到过ram不够的,后来改的好多变量才得以解决

月亮一键变蓝 发表于 2022-12-11 22:56 | 显示全部楼层
用联合体,或者结构体都行,能省一些资源的

我吃小朋友 发表于 2022-12-11 23:28 | 显示全部楼层
全局变量一定要有所规划,不然等以后程序再多加点功能,可能就乱套了

风凉 发表于 2022-12-12 00:00 | 显示全部楼层
ram是比较珍贵的,这个以前都是不敢随意定义全局变量的

将爱藏于深海 发表于 2022-12-12 00:32 | 显示全部楼层
一般情况能局部变量就局部变量,省不少资源呢

在曼谷的春 发表于 2022-12-12 02:04 | 显示全部楼层
全局变量可以共用的,用extern,这样也可以的

未说出口的像你 发表于 2022-12-12 02:36 | 显示全部楼层
我觉得用结构体比较合理,程序的变量也能清晰明了

她已醉 发表于 2022-12-12 03:08 | 显示全部楼层
我现在就是用的结构体比较多,感觉用起来还挺好玩的

AdaMaYun 发表于 2022-12-12 15:03 | 显示全部楼层
结构体其实就是数据的一种组合形式,类在结构体的基础上增加了功能实现
Bblythe 发表于 2024-10-11 07:07 | 显示全部楼层

超出 120 个字节则必须用 idata 显式的指定为间接寻址
周半梅 发表于 2024-10-11 09:03 | 显示全部楼层

靠近功率开关管或整流器的电容分到的纹波电流远多于相距较远的电容分到的纹波电流
Pulitzer 发表于 2024-10-11 10:06 | 显示全部楼层

small 模式下未指存储类型的变量默认为data型
童雨竹 发表于 2024-10-11 12:02 | 显示全部楼层

离线式变换器
Wordsworth 发表于 2024-10-11 13:05 | 显示全部楼层

一般要进行内存优化,尽量提高内存的使用效率
Clyde011 发表于 2024-10-11 14:08 | 显示全部楼层

让尽可能多的变量使用直接寻址,提高速度
公羊子丹 发表于 2024-10-11 15:01 | 显示全部楼层

经变压器映射成这么多节点
万图 发表于 2024-10-11 16:04 | 显示全部楼层

访问时采用不同的指令,所以并不会占用 RAM 空间
您需要登录后才可以回帖 登录 | 注册

本版积分规则

551

主题

9999

帖子

24

粉丝
快速回复 在线客服 返回列表 返回顶部