打印
[应用相关]

为什么老会觉得单片机RAM不够用?

[复制链接]
583|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。

图1
图2
请看上图,我们使用基本数据类型构造了3个复杂的结构体数据类型,仔细看会发现,这3个数据类型的成员可是不大一样的,我们来看第一个Test,这个数据类型总共占4+4=8个字节,这个很好理解,那第二个Test1,占空间大小按道理来说应该是1+4 = 5个字节,但是为什么还是8呢,第三个Test2,占空间大小应该是1+1+4=8,为什么还是8呢?
这个里面就涉及到了结构体对齐,所有的成员在分配内存时都要与所有成员中占内存最多的基本数据类型所占内存空间的字节数对齐。假如这个字节数为N,那么对齐的原则是:理论上所有成员在分配内存时都是紧接在前一个变量后面依次填充的,但是如果是“以 N 对齐”为原则,那么,如果一行中剩下的空间不足以填充某成员变量时,即剩下的空间小于某成员变量的数据类型所占的字节数,该成员变量在分配内存时另起一行分配。如图3,4

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

使用特权

评论回复
沙发
一只眠羊| | 2022-12-11 21:20 | 只看该作者
对啊,能用结构体,就不要单独定义全局变量了

使用特权

评论回复
板凳
失物招領| | 2022-12-11 21:52 | 只看该作者
我觉得现在可能就是MCU的资源比较多了,开始浪费

使用特权

评论回复
地板
故意相遇| | 2022-12-11 22:24 | 只看该作者
之前我也遇到过ram不够的,后来改的好多变量才得以解决

使用特权

评论回复
5
月亮一键变蓝| | 2022-12-11 22:56 | 只看该作者
用联合体,或者结构体都行,能省一些资源的

使用特权

评论回复
6
我吃小朋友| | 2022-12-11 23:28 | 只看该作者
全局变量一定要有所规划,不然等以后程序再多加点功能,可能就乱套了

使用特权

评论回复
7
风凉| | 2022-12-12 00:00 | 只看该作者
ram是比较珍贵的,这个以前都是不敢随意定义全局变量的

使用特权

评论回复
8
将爱藏于深海| | 2022-12-12 00:32 | 只看该作者
一般情况能局部变量就局部变量,省不少资源呢

使用特权

评论回复
9
在曼谷的春| | 2022-12-12 02:04 | 只看该作者
全局变量可以共用的,用extern,这样也可以的

使用特权

评论回复
10
未说出口的像你| | 2022-12-12 02:36 | 只看该作者
我觉得用结构体比较合理,程序的变量也能清晰明了

使用特权

评论回复
11
她已醉| | 2022-12-12 03:08 | 只看该作者
我现在就是用的结构体比较多,感觉用起来还挺好玩的

使用特权

评论回复
12
AdaMaYun| | 2022-12-12 15:03 | 只看该作者
结构体其实就是数据的一种组合形式,类在结构体的基础上增加了功能实现

使用特权

评论回复
13
Bblythe| | 2024-10-11 07:07 | 只看该作者

超出 120 个字节则必须用 idata 显式的指定为间接寻址

使用特权

评论回复
14
周半梅| | 2024-10-11 09:03 | 只看该作者

靠近功率开关管或整流器的电容分到的纹波电流远多于相距较远的电容分到的纹波电流

使用特权

评论回复
15
Pulitzer| | 2024-10-11 10:06 | 只看该作者

small 模式下未指存储类型的变量默认为data型

使用特权

评论回复
16
童雨竹| | 2024-10-11 12:02 | 只看该作者

离线式变换器

使用特权

评论回复
17
Wordsworth| | 2024-10-11 13:05 | 只看该作者

一般要进行内存优化,尽量提高内存的使用效率

使用特权

评论回复
18
Clyde011| | 2024-10-11 14:08 | 只看该作者

让尽可能多的变量使用直接寻址,提高速度

使用特权

评论回复
19
公羊子丹| | 2024-10-11 15:01 | 只看该作者

经变压器映射成这么多节点

使用特权

评论回复
20
万图| | 2024-10-11 16:04 | 只看该作者

访问时采用不同的指令,所以并不会占用 RAM 空间

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

534

主题

9582

帖子

23

粉丝