单片机进阶----内存空间的理解以及如何通过keil来调试内存

单片机中内存空间的理解以及如何通过keil来调试内存

引言

从上一篇文章发布已经过了2个月了,找到新工作后,公司比较忙且公司不能连外网,因此文章写的比较少了,今天这篇文章主要讲一下自己遇到的单片机内存不够以及优化方法。

单片机内存的相关知识

学过操作系统后,大家对内存应该有一定的了解,包括什么是ROM,RAM,堆栈等概念,新手可能对此不太了解,编写的功能比较简单,但是后期参加大的项目,如带操作系统的、带有比较大的库,在这种情形下对内存分配的要求会急剧提高,如果不注意内存,随便定义大数组,那么程序很容易死机,甚至编译不过。
ROM和RAM的概念在这里就不详细说了,只需知道,单片机内部的堆栈等需要读取非常快的数据都是在ram中,程序是储存在ROM中的,单片机的内存一般非常小,常用的小的如F103只有64KB(随便定义几个大数组,64KB就没了),即使是我使用的H743RAM也只有1M,所以在编写大的项目中,内存管理一定要做好,所以数据类型能用小的一定要用小的,int占4个字节,char占1个字节,如果有很多个变量,那对内存的消耗区别是非常大的。

内存的分配

以Linux为例,单片机与这个差不多,主要注意4部分,堆、栈、.bss以及.data,这4部分主要占用了RAM。堆主要用来申请内存使用,栈主要被局部变量,函数参数等使用。
在这里插入图片描述

keil中分配内存

由上一节可知,数据的存储位置,在裸机中主要查看.s文件,可以调整堆栈的大小。
在这里插入图片描述
在带有操作系统的任务中,操作系统会从堆中再取出一部分内存重新设置堆栈供操作系统使用,因此操作系统的内存与裸机的内存没什么关系,所以在带有操作系统的任务中,裸机的堆栈可以设置小一点。

keil中查看内存

第一种方法,keil在编译接收的时候会进行显示,如下图所示:
在这里插入图片描述
具体中每个部分代表什么,主要看下面这一篇文章,Keil/MDK 小知识点:Program size: Code, RO-data , RW-data, ZI-data 解释
第二种方法,双击项目,打开.map文件,这个文件可以详细看到每个文件占用的大小。
在这里插入图片描述
比如我圈的这个文件,占用ram就很大,打开发现,这个文件建立了一个32K的全局数组,因此占用空间很大
在这里插入图片描述

总结

这一篇属于单片机的进阶,因为单片机的内存实在太小了,要学会精打细算,小的项目可能看不出来,但是大一点的项目,随便移植几个库,占用就很大,很容易出现内存不够,申请不了内存的情况,内存不够会导致系统莫名其妙死机,是一个值得研究的问题。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值