【嵌入式】堆栈与单片机内存

堆栈

在片内RAM中,常常要指定一个专门的区域来存放某些特别的数据
它遵循顺序存取和后进先出(LIFO/FILO)的原则,这个RAM区叫堆栈。

其实堆栈就是单片机中的一些存储单元,这些存储单元被指定保存一些特殊信息,比如地址(保护断点)和数据(保护现场)。

堆栈特点

1、这些存储单元中的内容都是程序执行过程中被中断打断时,事故现场的一些相关参数。如果不保存这些参数,单片机执行完中断函数后就无法回到主程序继续执行了。

2、这些存储单元的地址被记在了一个叫做堆栈指针(SP)的地方。
3、栈是从高到低分配,堆是从低到高分配。

堆栈分类

我们一般说的堆栈指的栈。堆栈又分硬堆栈和软堆栈,硬堆栈即SP,从片内RAM的顶部向下生长。软堆栈在硬堆栈跟全局变量区之间的空间,C51函数调用通过R0-R7和栈来实现。

堆栈作用

1)子程序调用和中断服务时CPU自动将当前PC值压栈保存,返回时自
动将PC值弹栈。
2)保护现场/恢复现场
3)数据传输

单片机内存

程序内存可以分为几个区,栈区(stack),堆区(Heap),全局区(static),文字常亮区,程序代码区。
在这里插入图片描述

//main.cpp
int a = 0; //全局初始化区
int a = 0; //全局初始化区
char *p1; //全局未初始化区
main() {
    int b; //栈
    char s[] = "abc"; //栈
    char *p2; //栈
    char *p3 = "123456"; //123456\0在常量区,p3在栈上。
    static int c = 0; //全局(静态)初始化区
    p1 = (char *)malloc(10);
    p2 = (char *)malloc(20);
    //分配得来得10和20字节的区域就在堆区。
    strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}

和栈的第一个区别就是申请方式不同:栈(英文名称是stack)是系统自动分配空间的,例如我们定义一个 char a;系统会自动在栈上为其开辟空间。而堆(英文名称是heap)则是程序员根据需要自己申请的空间,例如malloc(10);开辟十个字节的空间。由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。而堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露。

STM32

在MDK编译环境下,可在map文件的"Memory Map of the image"–>"Execution Region RW_IRAM1"内容中查看程序的RAM占用及分配情况,如下:
在这里插入图片描述

STM32程序数据分类

Code:程序代码
RO-data:const常量和指令
RW-data:初始化值不为0的全局变量
ZI-data:未初始化的全局变量 或 初始化值为0的全局变量

RO Size = Code + RO Data 表示程序运行时占用的FLASH大小
RW Size = RW Data + ZI Data 表示占用RAM大小
ROM Size = Code + RO Data + RW Data 表示烧写程序后占用的FLASH大小

STM32内存(RAM)分配

一个由C/C ++编译的程序占用的内存可分为以下几个部分:

栈(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。
堆(heap):存放程序运行中被动态分配的内存,一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
bss段:通常是指用来存放程序中未初始化的全局变量的一块内存区域,存放ZI-data数据
data段:通常是指用来存放程序中已初始化的全局变量的一块内存区域,存放RW-data数据

FLASH占用大致以下两个部分:

文字常量区(const) :常量字符串就是放在这里的。
程序代码区 (code): 存放函数体的二进制代码

STM32堆栈位置

在这里插入图片描述
STM32的堆栈就是存放在片上静态SRAM中的.
在这里插入图片描述
地址分配可以见Keil的编译map文件的"Memory Map of the image"
可见堆的地址为0x20000a08,大小为0x200,栈的地址为 0x20000c08,大小为0x400,可推算栈顶地址为:0x20000c08 + 0x400 = 0x20001008。而程序在刚运行的时候,主堆栈指针MSP指向的是程序所占用内存的最高地址,也就是栈的栈顶地址MSP,也就是中断向量表前四个字节存储的值。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AVR单片机嵌入式系统原理与应用实践 内容简介 本书以ATMEL公司新一代AVR系列单片机中的ATmegal6为蓝本,由浅人深,软硬结合,全面系统地介绍了以AVR为核心构成的单片机嵌入式系统的原理与结构,开发环境与工具,各种接口与功能单元应用的硬件设计思想和软件编写方法,以及系统调试与仿真等内容。本书在结构编排和内容选择方面与一般传统单片机教材有所不同。全书以夯实基础,面向应用,理论与实践、方法与实现紧密结合为主线展开,在充分发挥AVR的运行速度快,内部资源丰富,功能强大等显著特点的基础上,结合最新嵌入式系统开发和应用技术的发展,遵照单片机嵌入式系统研发的基本步骤和思路,采用从简单到复杂、循序渐进、螺旋式上升的方式进行编排。 目录 第1篇 基础与入门 第1章 单片机嵌入式系统概述 1.1 嵌入式系统简介 1.1.1 嵌入式计算机系统 1.1.2 单片机嵌入式系统 1.1.3 单片机的发展历史 1.1.4 单片机的发展趋势 1.2 单片机嵌入式系统的结构与应用领域 1.2.1 单片机嵌入式系统的结构 1.2.2 单片机嵌入式系统的应用领域 1.3 AVR单片机简介 1.3.1 ATMEL公司的单片机简介 1.3.2 AVR单片机的主要特点 1.3.3 AVR单片机系列简介 1.3.4 AVR与51单片机 思考与练习 第2章 AVR单片机的基本结构 2.1 单片机的基本组成 2.1.1 单片机的基本组成结构 2.1.2 单片机的基本单元与作用 2.2 ATmegal6单片机的组成 2.2.1 AVR单片机的内核结构 2.2.2 ATmegal6的特点 2.2.3 ATmagel6的外部引脚与封装 2.3 ATmegal6单片机的内部结构 2.3.1 中央处理器CPU 2.3.2 系统时钟部件 2.3.3 CPU的工作时序 2.3.4 存储器 2.3.5 I/O端口 2.4 存储器结构和地址空间 2.4.1 支持ISP的Flash程序存储器 2.4.2 数据存储器SRAM空间 2.4.3 内部EEPROM存储器 2.5 通用寄存器组与I/O寄存器 2.5.1 通用寄存器组 2.5.2 I/O寄存器 2.5.3 状态寄存器和堆栈指针寄存器 2.6 ATmegal6单片机的工作状态 2.6.1 AVR单片机最小系统 2.6.2 AVR的复位源和复位方式 2.6.3 对AVR的编程下载 2.6.4 ATmegal6的熔丝位 2.6.5 AVR单片机的工作状态 2.6.6 支持ISP编程的最小系统设计 2.7 AVR单片机内部资源的扩展和剪裁 思考与练习 第3章 AVR的指令与汇编系统 第4章 AVR单片机的系统设计与开发工具 第5章 实战练习(一) 第二篇 基本功能单元的应用 第6章 通用I/O接口的基本结构与输出应用 第7章 中断系统与基本应用 第8章 定时/计数器的结构与应用 第9章 键盘输入接口与状态机设计 第10章 模拟比较器和ADC接口 第11章 实战练习(二) 第3篇 串行接口与通信 第12章 串行数据接口概述 第13章 异步通信与USART接口基础 第14章 USART实用设计基础 第15章 串行SPI接口应用 第16章 串行TWI(I2C)接口应用 第4篇 进入实战 第17章 AVR片内资源应用补遗 第18章 迎奥运倒计时时钟设计实例 附录A ATmegal6熔丝位汇总 附录B AVR-51多功能实验开发板电原理图 附录C 本书所附光盘内容简介 参考文献

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值