STM32堆栈空间大小设置

发布者:chunying最新更新时间:2019-12-02 来源: eefocus关键字:STM32  堆栈空间  大小设置 手机看文章 扫描二维码
随时随地手机看文章

1. 设置堆栈空间大小


在使用STM32编程时,一般情况下我们不会关注堆栈空间的大小,因为在STM32的启动文件中,已经帮我们预先设置好了堆栈空间的大小。如下图所示的启动代码中,Stack栈的大小为:0x400(1024Byte),Heap堆的大小为:0x200(512Byte)。

这也是为什么一个基础的工程编译后,RAM的空间也占用了1.6K左右的原因,因为堆栈的空间均分配在RAM中,可在编译的map文件中查看RAM资源占用的情况。

若工程中使用的局部变量较多,定义的数据长度较大时,若不调整栈的空间大小,则会导致程序出现栈溢出,程序运行结果与预期的不符或程序跑飞。这时我们就需要手动的调整栈的大小。


当工程中使用了malloc动态分配内存空间时,这时分配的空间就为堆的空间。所以若默认的堆空间大小不满足工程需求时,就需要手动调整堆空间的大小。


STM32有两种调节堆栈空间大小的方式:


1. 直接在启动文件中修改堆栈空间的大小,如图1所示的位置;


2. 打开启动文件,点击下方Configuration Wizard,可在Option的设置框中设置堆栈空间的大小。

2. 相关理论补充


bss段:

    bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。

    bss是英文Block Started by Symbol的简称。

    bss段属于静态内存分配。


data段:

    数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。

    数据段属于静态内存分配。


text段:

    代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。


    这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读(某些架构也允许代码段为可写,即允许修改程序)。


    在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

 

堆(heap):

    堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。

    当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);

    当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)。


查阅网上的资料,理解堆和栈的区别: 


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


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


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


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


程序代码区:存放函数体的二进制代码。


注意:堆和栈,一般堆是由低地址往上(高地址)增长,栈是由高地址向下(低地址)增长。都是连续的,C语言不提供内存保护机制类似的功能,如果一直堆一直增长,栈一直申请,然后就会导致栈溢出,程序崩溃。

关键字:STM32  堆栈空间  大小设置 引用地址:STM32堆栈空间大小设置

上一篇:STM32--堆栈空间
下一篇:STM32 堆栈的理解

推荐阅读最新更新时间:2024-11-07 16:49

STM32 关于定时器相关问题的探讨(二)
4.硬件设计 4.1LED驱动电路 利用单片机产生得PWM驱动电路直接驱动LED电路来验证,当输出PWM宽度变化时可以看到此时LED亮度变化,此时只需要将LED上拉就可以实现验证。当输入为低电平时,LED灯发光 4.2 SPWM滤波方案 利用高级定时器,我们能产生一系列PWM脉宽随时间变化的PWM波形,通过简单的RC滤波就可以将SPWM滤波成正弦波 5.软件设计过程 5.1 四路pwm输出配置 5.1.1 GPIO初始化 初始化引脚(PA6、PA7,PB0、PB1),这里拿出初始化PA6例子 GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RC
[单片机]
<font color='red'>STM32</font> 关于定时器相关问题的探讨(二)
STM32 HAL库的功能和使用方法 STM32 HAL库和标准库的区别
HAL(Hardware Abstraction Layer)是指硬件抽象层,是一种封装底层硬件接口驱动的编程库。在嵌入式系统中,HAL库可以更加方便地实现硬件控制和设备访问,提高代码可移植性和可维护性,从而节省开发成本和时间。STM32 HAL库是STM32系列芯片的HAL库,由ST公司提供和维护。下面将介绍STM32 HAL库的功能、使用方法以及与标准库的区别。 STM32 HAL库的功能 HAL库提供了一系列API函数和硬件抽象接口,用于实现对STM32芯片上各种外设的控制,包括输入输出控制(如GPIO、USART、SPI等)、定时器和计数器控制、中断控制、时钟控制等。STM32 HAL库主要实现了以下功能: 直接调用硬
[单片机]
STM32软件学习】ST-LINK Utility的使用
STM32 ST-LINK Utility软件主要的功能就是量产(批量下载代码的工具)。 它也是比较实用的一个工具,当我们需要查看芯片FLASH数据时,可以很快定位查找到想要的数据(前提是没有添加保护)。 需要配和STLink使用。 接线,SWD接口。 VCC GND SCLK SDIO和单片机分别相对即可! keil在线使用 选择ST-Linker Debugger 这里务必检查,又没出出现DeviceName,没有出现的话就得,重新检查接线!! 擦除整片扇区,然后选择相应的Flash大小编程算法,比如我用C8T6,那就选对应128K的F10X算法! 最后load到单片机! 使用STM32
[单片机]
【<font color='red'>STM32</font>软件学习】ST-LINK Utility的使用
STM32实例-步进电机的速度控制
项目需求 在制作一个使用全向轮的机器人底盘,对于全向轮,电机的精度是影响效果的重要因素。所以使用了步进电机,使用步进电机的优点是可以不使用编码器,开环控制即可达到高精度的效果。 调整占空比或者调整周期 众所周知,PWM有两个重要参数,周期与占空比。 步进电机的运动方式是,每收到一个脉冲,就旋转指定的角度。因此影响电机速度的唯一参数就是PWM的频率。以下附图两张来说明调整占空比与调整周期的区别。 周期固定,调整占空比 上图中有4个PWM,它们的周期是一样的,不同之处是拥有从80%至20%的占空比。可以看出,无论占空比为多少,在1s内,它们产生的高电平的数量是一样的,即无论占空比为多少,PWM的频率都一致。因此也就无法调整
[单片机]
STM32控制步进电机程序
步进电机(也称脉冲电机)(将电脉冲转换为相应的角位移或线位移的电磁机械装置,具有快速启动,停能力,在电机的负荷不超过它能提供的动态转矩时,可以通过输入脉冲来控制它在一瞬间的启动或者停止。在非超载的情况下,步距角和转速只和输入的脉冲频率有关,和环境温度,气压,振动无关,也不受电网电压的波动和负载变化的影响,因此,控制较为精准)即给电机一个脉冲信号,电机则转过一个步距角 步进电机是一种感应电机,它的工作原理:利用电子电路,将直流电变成分时供电的,多相时序控制电流,用这种电流为步进电机供电,步进电机才能正常工作,驱动器就是为步进电机分时供电的,多相时序控制器,就是说:必须用由双环形脉冲信号功率驱动电路等组成的控制系统方可使用。 步距角:
[单片机]
<font color='red'>STM32</font>控制步进电机程序
2-LPC1778之GPIO
其实这篇文章主要是介绍自己为其写的GPIO库,自己借鉴了原子写的STM32,野火写的K60,还有LPC官方库,然后按照自己平时用的,然后写了一个..其实写库的主要目的是为了方便(主要是方便操作)以后自己用,还想着分享给别人用,加快项目开发的速度,,本想着后期的各种功能库都自己写一套...不过就今天看来应该到此为止了....... 其实现在也没心情介绍了,直接说一下有什么实用的功能 第一点哈,支持位带操作 //IO口操作宏定义#defineBITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF) 5)+(bitnum 2))#defineME
[单片机]
STM32学习之:keil测量函数运行时间
设置Trace时的工作频率(就是当前的系统时钟,如stm32f103,f107为72MHz,f407为168M,f429为180M): 2. 进入调试状态,在一条语句前设置断点执行到此,再执行到另外的语句处,下面的Sec就是执行时间 得到adc_init()时间为: T2-T1 单位秒。 3. 还有一种办法,更加精确。就是用GPIO高低电平时间,在被测量的一条语句前将一个管脚的GPIO拉低,测量完毕后,将该GPIO拉高,用示波器测量该GPIO的电平转换时间。 我在工作上,就是经常用这种方法,查看一段语句的执行时间,非常有用。
[单片机]
STM32学习之ADC
对于STM32,在使用ADC的时候需要配置几个参数。 (1) 第一个参数是ADC_Mode,这里设置为独立模式: ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; 在这个模式下,双ADC不能同步,每个ADC接口独立工作。所以如果不需要ADC同步或者只是用了一个ADC的时候,就应该设成独立模式了。 (2) 第二个参数是ADC_ScanConvMode,这里设置为DISABLE。 ADC_InitStructure.ADC_ScanConvMode = DISABLE; 如果只是用了一个通道的话,DISABLE就可以了,如果使用了多个通道的话,则必须将其设置
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved