stm32之堆栈

发布者:tau29最新更新时间:2019-04-16 来源: eefocus关键字:STM32  堆栈  内存 手机看文章 扫描二维码
随时随地手机看文章

stm32中的堆栈设置

keil编译完成时存储情况

当编译成功时,会出现: 

BUILD://Program Size: Code=340 RO-data=252 RW-data=0 ZI-data=1632


Code:程序代码部分

RO-data: 程序定义的常量const temp

RW-data:已初始化的全局变量

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

片中的:


flash=Code+RO-data+RW-data

RAM=RW-data+ZI-data

通过上面的BUILD可以看出,这个程序已经用了1600多的RAM,为什么会出用到这么多的RAM呢?


在startup_stm32f10x_md.s文件中存在:


Stack_Size   EQU   0x00000400 


Heap_Size    EQU   0x00000200 

1

2

3

这样就明白了吧。


堆和栈的区别,举例

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

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

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

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

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

例:


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

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

main()

{

    int b;   //栈

    char s[]="abc";   //栈   

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

    static int c =0    //静态初始化区

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

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

}

1

2

3

4

5

6

7

8

9

10

11

所以堆与栈的区别:


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

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

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


在程序中需要注意的情况

如果使用了HEAP,则必须设置HEAP大小。

如果是STACK,可以设置为0,不影响程序运行。(不管设置多少生成的HEX文件都是一样的,不过会影响调试,需注意)

而一般我们可以通过查看.htm中Maximum Stack Usage = 344 bytes + Unknown(Functions without stacksize, Cycles, Untraceable Function Pointers)来方便确定大小。 

(为安全起见,预留点空间,上例可修改为Stack_Size EQU 0x00000200 )


另外:堆栈溢出,编译不会提示,需要注意。

关键字:STM32  堆栈  内存 引用地址:stm32之堆栈

上一篇:说说STM32的堆栈与内存
下一篇:STM32之程序如何防止堆栈溢出

推荐阅读最新更新时间:2024-11-12 15:02

【嵌入式】STM32的库函数使用
使用编译环境为MDK5,烧录器将会使用JTAG和串口两种,芯片为STM32F103C8T6 零、前准备 1.MDK5编译环境 2.JTAG驱动或串口驱动 一、建立工程模板,写一个简单的小程序 1).创建工程目录 这里就会使用MDK创建工程了,由于STM32的工程已经比较大了,所以在工程目录下将会再创建多个目录,以便整理。 (说明一下,其实随便放都可以,只要工程都能包含以下说到的文件即可) 这里工程名就叫template吧(.代表工程目录): .CORE 存放芯片内核驱动文件; .FWLIB 使用库函数的话存放库函数; .OBJ 存放编译生成文件; .SYSTEM 存放系统代码; .USER 存放工程文件,应用程序等。 新建好
[单片机]
【嵌入式】<font color='red'>STM32</font>的库函数使用
STM32 定时器时钟配置技巧
众所周知 STM32 的时钟配置比较复杂,而定时器的时钟配置更是 ‘奇葩‘。 如下图(截图自STM32F4编程手册)APB的预分频器分频系数如果不为1,则定时器的时钟就倍频了反而。 配置技巧 下面以STM32F4为例, 这里配置定时器8的计数频率为 10Khz,从时钟树中可知TIM8挂在APB2总线 获取当前 APB2(PLCK2) 的时钟频率 获取 APB2 预分频器的分频值 根据上述参数判断,如果分频值不为1,则定时器时钟 x2 .Prescaler = xxx 这是一个推荐的写法 int hw_timer_init(TIM_HandleTypeDef *htim) { uint32_t FLatency, t8
[单片机]
<font color='red'>STM32</font> 定时器时钟配置技巧
STM32再学习 -- 工程师眼中的SPI
前些天,有位网友谈到通过FPGA来实现SPI通讯。通过帖子的回复发现好多网友对SPI通讯还有些疑惑,于是今天就带着大家从SPI的标准协议,SPI在STM32单片机上的配置及在74HC595逻辑芯片通讯的实例来全方面认识一下这个既复杂又简单的通讯协议。 SPI 是Serial Peripheral Interface的缩写,直译为串行外围设备接口,SPI是Motorola公司推出的一种同步串行通讯方式,是一种四线同步总线,因其硬件功能很强,与SPI有关的软件就相当简单,使MCU有更多的时间处理其他事务。这里要说明一下,专利在电子行业还是很关键的,因此,部分其它厂商将SPI通讯协议更名以规避高昂的专利费,但其硬件处理方式是一样的,只是换
[单片机]
<font color='red'>STM32</font>再学习 -- 工程师眼中的SPI
DFSDM模块的配置
1、引言 客户在使用 STM32H743 的 DFSDM 模块时,配置有误。于是协助客户按照下面的方法进行配置并分享之。 2、参数的计算 使用 NUCLEO-H743 开发板进行测试。由于客户需要 16KHz 音频数据, 24bits 的音频数据,因此配置如下。 PDMMic - PDM data - 滤波器类型 - 过采样率 Fosr(滤波器)- 过采样率 Isor(积分器)- 右移位器 - 偏移补偿 - 采样数据 Clock out (CKOUT)的计算 Fs= Fclockout/( Fosr*Iosr) Fs= 16kHz 音频数据 Fosr:滤波器过采样率,也就是抽取率,在这里取 128 Iosr:积分器过采样率,在
[单片机]
DFSDM模块的配置
STM32之触摸屏
一、触摸屏控制器简介 1、TSC2046概貌 2、TSC2046引脚描述 3、TSC2046应用电路 4、常见接线方法 YU=Y- YD=Y+ XL=X- XR=X+ 二、TSC2046编程注意事项 TSC2046的PENIRQ脚在触摸屏被按下的时候输出低电平,没有按下的时候输出高电平。需要格外注意的是在MCU给TSC2046发送命令的时候,次引脚也会产生错误的低电压脉冲,0 us t 100 us。 It is recommended that the processor mask the interruptPENIRQ is associated with whenever the proce
[单片机]
<font color='red'>STM32</font>之触摸屏
2GB内存+千万摄像头 新一代iPhone开工
    对于关注新一代iPhone的用户来说,苹果正在全力以赴准备它的制造。   今天早些时候,台湾产业链给出的消息称,苹果正在向零组件厂疯狂下单新一代iPhone所用的配件,其中6S的整体良率要优于预期,9月发布没有问题,提前至8月也是可以的。   此外,产业链人士还向台媒爆料,新一代iPhone将会采用1200万像素摄像头,并且订单由大立光独占,代工厂依然是鸿海和和硕。   此外,报道中还透露,新一代iPhone依然是4.7寸和5.5寸两个,外形跟现在的iPhone 6基本没差,同时新增加玫瑰金,相对应的外壳还是由可成等制造。   同时iPhone 6S最大的看点就是压力感应触控功能,这也是继多点触控之后,苹果又
[手机便携]
STM32串口通信和I/O口简单代码
#include stm32f10x_lib.h #include sys.h #include delay.h #include usart.h #include led.h int main(void) { u8 k; //点亮的灯位数 u8 i; Stm32_Clock_Init(9); //系统时钟初始化 delay_init(72); //延时初始化 uart_init(72,9600); //串口初始化 led_init(); //灯I/O配置初始化 while(1) { if(USART_RX_STA&0x80) //接受到数据
[单片机]
<font color='red'>STM32</font>串口通信和I/O口简单代码
STM32中ucos的编写程序
* Includes ------------------------------------------------------------------*/ #include config.h /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ //定义 堆栈大小 //#define TASK_STK_SIZE 128 #define TASK_STK_SIZ
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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