跳转到主要内容

堆栈

STM32内存管理以及堆和栈的理解

judy /

今天仔细读了一下内存管理的代码,然后还有看了堆栈的相关知识,把以前不太明白的一些东西想通了,写下来,方便以后查看,也想大家看了能指出哪里不对,然后修改。

<center><img src="http://mcu.eetrend.com/files/2018-09/wen_zhang_/100014185-48358-11.png&…; alt="STM32内存管理以及堆和栈的理解"></center>

首先,先看一下stm32的存储器结构。

​Flash,SRAM寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。可访问的存储器空间被分成8个主要块,每个块为512MB。

FLASH存储下载的程序。

SRAM是存储运行程序中的数据。

所以,只要你不外扩存储器,写完的程序中的所有东西也就会出现在这两个存储器中。

这是一个前提!

51单片机堆栈深入剖析

judy /

用C语言进行MCS51系列单片机程序设计是单片机开发和应用的必然趋势。Keil公司的C51编译器支持经典8051和8051派生产品的版本,通称为Cx51。应该说,Cx51是C语言在MCS51单片机上的扩展,既有C语言的共性,又有它自己的特点。本文介绍的是Cx51程序设计时堆栈的计算方法。   

1.堆栈的溢出问题。MCS51系列单片机将堆栈设置在片内RAM中,由于片内RAM资源有限,堆栈区的范围也是有限的。堆栈区留得太大,会减少其他数据的存放空间,留得太少则很容易溢出。所谓堆栈溢出,是指在堆栈区已经满了的时候还要进行新的压栈操作,这时只好将压栈的内容存放到非堆栈区的特殊功能寄存器(SFR)中或者堆栈外的数据区中。特殊功能寄存器的内容影响系统的状态,数据区的内容又很容易被程序修改,这样一来,之后进行出栈操作(如子程序返回)时内容已变样,程序也就乱套了。因此,堆栈区必须留够,宁可大一些。要在Cx51程序设计中防止堆栈的溢出,要解决两个问题:第一,精确计算系统分配给用户的堆栈大小,假设是M;第二,精确计算用户需要堆栈的大小,假设是N。要求M≥N,下面分别分析这两个问题。

堆栈在C语言中的定义(单片机的中堆栈相当于栈)

Lee_ /

在计机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,堆栈是一个很模糊的概念。堆栈:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈。我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不清堆栈,所以我想有必要给大家分享一下我对堆栈的看法,有说的不对的地方请朋友们不吝赐教,这对于大家学习会有很大帮助。

<strong>首先了解下计算机C语言中各个变量的存放区域:</strong>
代码区(CODE): 存放函数代码;
静态数据区(DATA): 存放全局变理/静态变量;
堆区(HEAP): 是自由存储区,存放动态数据,像new,malloc()申请的空间就是堆区的;
栈区(STACK): 存放临时/局部变量。

<strong>数据结构的栈和堆</strong>
首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈。
堆和栈都是一种数据项按序排列的数据结构。