单片机的内存分配(变量的存储位置)详解

摘要:
要了解ROM和RAM的启动,您需要对链接器如何分配内存有一定的了解。通常,具有向下堆栈增长方向的单片计算机的通用内存模型为:进程在运行时占用的内存可分为以下部分:1。堆栈区:由编译器自动分配和释放,存储函数的参数值、局部变量值等。这些数据是只读的。如果它们被分配到RO数据中,它们将被包括在闪存中。程序结束后,系统将自动释放它们。5.程序代码:存储函数体的二进制代码。

原文链接:https://blog.csdn.net/as480133937/article/details/87608816

单片机的内存分配(变量的存储位置)详解

对于初学者而言,对单片机的内存分配往往最让人头疼,很多人学了单片机几年 都不知道单片机内部的内存使用情况是如何分配的。要了解 ROM(flash)、RAM(sram)启动,首先 需要对 链接器 Linker 如何分配内存有一定的了解。

通常,对于栈生长方向向下的单片机,其内存一般模型是: 在这里插入图片描述
在这里插入图片描述
一个进程运行时,所占用的内存,可以分为如下几个部分:
1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。
2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS释放。
3、全局变量、静态变量:初始化的全局变量和静态变量放在一块区域,未初始化的全局变量和和未初始化的静态变量在相邻的的另一块区域。程序结束后由系统自动释放。
4、文字常量:常量字符串就是放在这里的。这些数据是只读的,分配在RO-data(只读数据存储区),则被包含在flash中,程序结束后由系统自动释放

5、程序代码(code):存放函数体的二进制代码。

同时,单片机内存被总分为flash(rom)和sram(ram),flash里面的数据掉电可保存,sram中的数据掉电就丢失,sram的执行速度要快于flash,flash容量大于sram

上方的最低内存地址,最高地址,都是在flash和sram中

我们正常下载程序都是下载存储进flash里面,这也是为什么断电可保存的原因

单片机的程序存储分为code(代码存储区)、RO-data(只读数据存储区)、RW-data(读写数据存储区) 和 ZI-data(零初始化数据区)

  • Flash 存储 code和RO-data
  • Sram 存储 RW-data 和ZI-data

在这里插入图片描述

在使用MDK编译时可以看到
在这里插入图片描述

Code为程序代码部分 = 程序代码区(code)

RO-data 表示 程序定义的常量 = 文字常量区

RW-data 表示 已初始化的全局变量 = 栈区(stack)堆区(heap)全局区(静态区)(static)

ZI-data 表示 未初始化的全局变量

部分参考自:http://blog.chinaunix.net/uid-15473693-id-388637.html

免责声明:文章转载自《单片机的内存分配(变量的存储位置)详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PHP利用MySQL保存session(php5.4之前的处理)45个非常有用的 Oracle 查询语句小结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java 基本理论知识点

http://www.cnblogs.com/hellokitty1/p/4491808.html 1、main方法是怎么写的        public static void main(String [] args){}//最习惯的      public static void main(String  args[]){}      static p...

临时表与表变量深入探究

临时表或表变量我们一般用来充当中间结果集,很多时候都在用,但真正了解他们之间的区别的人还是很少的,网上流传的说法也不甚统一,所以今天我就做一个实验,让我们看看临时表和表变量的区别,以及他们各自的用途。 执行以下语句,对测试环境做准备 DBCC DROPCLEANBUFFERS --从缓冲池中删除所有清除缓冲区 DBCC FREEPROCCACHE...

C++星号的含义

[转载] [http://blog.sina.com.cn/s/blog_4a50d85b0100uk3c.html]   1、乘法运算符   2、定义指针 int *p = 0; 还是 int* p = 0;? 后一种比较容易这样理解:定义了一个变量p,它是指针型的(更详细一点,是指向int的指针型),相比而言,前面一种定义似乎是定义了*P这个奇...

dos 日期时间格式设置

@echo off@title 字符串的编辑测试(下面描述用的箭头→ ← 分别表示向右、向左的意思)set aa=1234567890echo 说明:下面复合变量中,逗号前的数字表示指针偏移量,逗号后的数字表示提取的字符长度echo %aa:~1,5% //指针向右→偏移1位,然后从指针处开始向右→提取5个字符.echo %aa:~0,-3% //指针不偏...

【转】力控的60个经典问题

1:我已经安装加密锁了,为何安装运行包后运行工程还提示找不到加密锁?这是因为安装运行包后,需要人工对软件进行注册。请打开运行包释放后所在文件夹,手工运行其中的“Registry”程序进行软件注册,这样加密锁就可以找到了。2:安装完运行包后如何卸载?卸载运行包需要两个步骤: 1、手动删除运行包安装后生成文件夹及文件夹中的内容; 2、删除注册表(1)Windo...

C语言32个关键字(2)

二、C语言中的9中控制语句 goto语句:无条件转向; if语句:判断语句; while循环语句; do-while语句:先执行循环体,然后判断循环条件是否成立.之后继续循环; for语句:循环,可替代while语句;只是用法不同; break语句跳出本层的循环;(只跳出包含此语句的循环) continue语句:继续(一般放到循环语句里,不在执行它下面的语...