南平运利快三走势图_STM32--堆栈空间

2019-12-02来源: eefocus关键字:STM32  堆栈空间  局部变量

函数的局部变量,都是存放在"栈"里面,栈的英文是:STACK.


STACK的大小,可以在STM32的启动文件里面设置,以战舰开发板为例,在startup_stm32f10x_hd.s里面:


Stack_Size      EQU     0x00000400  


                AREA    STACK, NOINIT, READWRITE, ALIGN=3

Stack_Mem       SPACE   Stack_Size

__initial_sp

                                                  

Heap_Size       EQU     0x00000200


Stack_Size      EQU     0x00000400


表示栈大小是0X400,也就是1024字节.这样,CPU处理任务的时候,函数局部变量做多可占用的大小就是1024个字节,所有的函数,包括函数都是从这个"栈"里面,来分配的.

所以,如果一个函数的局部变量过多,例如在函数里面定义一个u8 buf[512],这一个变量就占了一半的栈大小了,程序很容易崩溃。


KEIL中堆栈计算方式:


Stack_Size EQU 0x00000400


Heap_Size EQU 0x00000200


0x00000400 等于1024字节所以等于1K


0x00000200 等于512字节所以等于512Byte


堆栈定义:


南平运利快三走势图(1)栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。

(2)堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。

(3)全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统自动释放。

(4)文字常量区:常量字符串就是存放在这里的。

南平运利快三走势图(5)程序代码区:存放函数体的二进制代码。


例如:


int a=0;                        //全局初始化区

char *p1;                       //全局未初始化区

main()

{

int b;                        //栈

chars[]="abc";                 //栈

char*p3= "1234567";             //在文字常量区

staticint c =0 ;               //静态初始化区

p1=(char *)malloc(10);          //堆区

strcpy(p1,"123456");           //"123456"放在常量区

}


stack的空间由操作系统自动分配/释放,heap上的空间手动分配/释放。

stack的空间有限,heap是很大的自由存储区。

程序在编译期和函数分配内存都是在栈上进行,且程序运行中函数调用时参数的传递也是在栈上进行。


栈:存函数的临时变量,即局部变量,函数返回时随时有可能被其他函数栈用。南平运利快三走势图所以栈是一种分时轮流使用的存储区,编译器里定义的Stack_Size,是为了限定函数的局部数据活动的范围,操过这么范围有可以跑飞,也就是栈溢出;Stack_Size不影响Hex,更不影响Hex怎么运行的,只是在Debug调试时会提示错。南平运利快三走势图栈溢出也有是超过了国界进行活动,只要老外没有意见,你可以接着玩,有老外不让你玩,你就的得死,或是大家都死(互相撕杀),有的人写单片机代码在函数里定义一个大数组 int buf[8192],栈要是小于8192是会死的很惨。


堆:存的是全局变量,这变量理论上是所有函数都可以访问的,全局变量有的有初始值,但这个值不是存在RAM里的,是存在Hex里,下载到Flash里,上上海快三app赚钱—主页-彩经_彩喜欢由代码(编译器生成的汇编代码)搬过去的。有的人很“霸道”,上上海快三app赚钱—主页-彩经_彩喜欢就霸占已一块很大的RAM(Heap_Size),作为己有(malloc_init),别人用只能通过他们管家借(malloc),用完还得换(free)。南平运利快三走势图所以 一旦有“霸道”的人出现是编译器里必须定义Heap_Size,否则和他管家借也没有用。


总之:堆和栈有存在RAM里,他两各分多少看函数需求,但是他两的总值不能超过单片机硬件的实际RAM尺寸,否则只能到海里玩(淹死了)或是自己打造船接着玩(外扩RAM)。

关键字:STM32  堆栈空间  局部变量 编辑:什么鱼 引用地址:http://news.socialskive.com/mcu/ic481699.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过上海快三app赚钱—主页-彩经_彩喜欢子邮件或上海快三app赚钱—主页-彩经_彩喜欢话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32的堆栈(Heap&Stack)空间
下一篇:STM32堆栈空间大小设置

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8S存储器的读写操作
/************************************************************************************************************************************ Name    : STM8S存储器的读写操作* Author  : MingMing* Release : 2014/1/2* Update  : 2014/1/2* E-mail  : clint.wang@foxmail.com
发表于 2019-12-05
stm8l051 halt之后外部中断唤醒问题
最近用到stm8l051 halt,在halt之后开启了外部中断,有时灵,有时不灵,设置下降沿触发,但是按键(低有效)放开了才会从HALT退出,最后发现在进去外部中断的时候一直在外部中断里面不退出。南平运利快三走势图在外部中断程序里面把端口的外部中断和端口使能的外部中断功能关闭,问题解决,可以在下降沿从halt退出。1、开启halt,其他代码省略,只贴halt部分:    /* 禁止TIM3 */    TIM3->SR1 = (uint8_t)(~(uint8_t)TIM3_IT_Update);    CLK_PeripheralClockConfig
发表于 2019-12-05
STM8L052低功耗模式
南平运利快三走势图Stm8L系列单片机的低功耗有五种模式:§ wait模式§ Lowpower run模式§ Lowpower wait模式§ Active-haltwith full RTC模式§ Halt模式最低功耗的就是就是halt模式。南平运利快三走势图这里也主要总结一下如何进入halt模式,进入以后可以通过什么方式唤醒,以及有很多客户会关心的如何自动唤醒。南平运利快三走势图Halt模式进入很简单,执行一条halt指令,调用库函数也就是halt()就行了。但是进入前要注意把所有的中断挂起标志给清除掉。要是不清零又恰巧有中断标志的时候进入该模式也会被立马唤醒。进入这种模式,所有的外设全都关闭了,所有时钟关闭。这时候它自己是醒不过来的,只能靠掐人中(给个外部中断)或者重新复活
发表于 2019-12-05
解决STM8类型单片机空间太小,使用不了printf串口打印问题
南平运利快三走势图概述:在使用STM8L101F3这款单片机时,由于它只有8K的flash,空间非常小,只要调用C库函数printf编译后整个文件很大,直接程序溢出。这也就意味着我们实现printf串口打印调试就没办法进行。既然使用不了库函数,那么我们就可以自己动手封装类似printf的函数,这样我们就可以实现数据串口打印啦。这里就直接放上我的STM8L101F3的部分源码了,希望可以给你一些参考。源码:#include "stdarg.h"#include "stm8l10x.h" void USART_Config(void){    /*Set the USART RX
发表于 2019-12-04
解决STM8类型单片机空间太小,使用不了printf串口打印问题
基于STM8的IIC协议--协议篇
4.3.8代码示例。3.6 数据有效性  I2C总线进行数据传送时,时钟信号为高上海快三app赚钱—主页-彩经_彩喜欢平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低上海快三app赚钱—主页-彩经_彩喜欢平期间,数据线上的高上海快三app赚钱—主页-彩经_彩喜欢平或低上海快三app赚钱—主页-彩经_彩喜欢平状态才允许变化。3.7 I2C通信总过程 4. 例程4.1 编译环境:  我的编译环境是IAR,这款软件是现在STM8的主流平台,比较推荐。不过我打算等到STCubeMX更新出比较方便的版本后再去使用Keil5,因为我在用STM32的时候就是利用Keil5,的确很方便,你们也可以学着用一下。4.2 主芯片:  我的主芯片是STM8S系列中的103,其中STM8S的003、005、和103、105,配置一样(外设和CPU频率,FLASH),在代码相同的
发表于 2019-12-04
基于STM8的IIC协议--协议篇
基于STM8的ADC读取---STM8-第四章
和连续转换的扫描模式具有上限和下限门槛的模拟看门狗模拟看门狗时间发生可产生中断----------------------------------------------------------------------------------------------------------------------------------3. 例程3.1 编译环境  我的编译环境是IAR,这款软件是现在STM8的主流平台,比较推荐。不过我打算等到STCubeMX更新出比较方便的版本后再去使用Keil5,因为我在用STM32的时候就是利用Keil5,的确很方便,你们也可以学着用一下。3.2 主芯片  我的主芯片是STM8S系列中的103
发表于 2019-12-04
基于STM8的ADC读取---STM8-第四章
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

上海快三app赚钱—主页-彩经_彩喜欢子工程世界版权所有 京ICP证060456号 京ICP备10001474号 上海快三app赚钱—主页-彩经_彩喜欢信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 socialskive.com, Inc. All rights reserved