编译一个程序,出现下面的信息:
明明程序没有什么内容,为什么变量大小就有RW+ZI=52+1836=1888字节大小了呢,就已经使用了1888字节的SRAM空间。让我们打开map文件:
可以看到每个文件所使用的SRAM大小,比如delay文件使用了4个字节,地址从0x20000014到0x20000017。其中可以看到HEAP和STACK占了大头,分别占了0x00000200和0x00000400的空间。STACK的起始地址是0x20000360,大小是0x00000400,那么最后的地址是0x20000760,刚好等于1888=0x760字节。于是我们就知道SRAM空间用来存放了什么东西了:1、各个文件中声明和定义的全局变量、静态数据和常量;2、HEAP区;3、STACK区。
堆区(heap):一般由程序员使用malloc或new来进行分配,在适当的时候用free或delete来进行释放。若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。
栈区(stack):由编译器自动分配和释放,程序员不做干涉。存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。程序的中断,函数的形式参数传递等都需要STACK来实现。
注意:
1、堆栈的大小在编译器编译之后是不知道的,只有运行的时候才知道,所以需要注意一点,就是别造成堆栈溢出了,不然就会发生hardfault错误。
2、所有在处理的函数,包括函数嵌套,递归,等等,都是从这个“栈”里面,来分配的。所以,如果栈大小为2K,一个函数的局部变量过多,比如在函数里面定义一个u8 buf[512],这一下就占了1/4的栈大小了,再在其他函数里面来搞两下,程序崩溃是很容易的事情,这时候,一般你会进入到hardfault….这是初学者非常容易犯的一个错误.切记不要在函数里面放N多局部变量,尤其有大数组的时候!
3、 STM32的栈,是向下生长的。事实上,一般CPU的栈增长方向,都是向下的。而堆的生长方向,都是向上的。堆和栈,只是他们各自的起始地址和增长方向不同,他们没有一个固定的界限,所以一旦堆栈冲突,系统就到了崩溃的时候了。
4、程序中的常量,如果没加const也会编译到SRAM里,加了const会被编译到flash中。
附上SRAM中的数据存放情况图:
关键字:STM32 SRAM存储
引用地址:
STM32堆和栈(Heap & Stack)及SRAM存储使用
推荐阅读最新更新时间:2024-11-11 16:26
cJson移植到STM32系统
一、下载cJson文件 实际只包含了cJSON.C,cJson.h,cJson_utils.c,cJson_utils.h 二、添加到工程 三、修改代码: 在cJson_utils.c中增加 点击(此处)折叠或打开 char * strdup(const char *s) { size_t len = strlen(s) +1; void *new = malloc(len); if (new == NULL) return NULL; return (char *)strncpy(new,s,len); } 四、测试在main.c中增加 点击(此处)折叠或打开
[单片机]
stm32开发常用的软件和语言介绍
STM32 开发环境(工具)介绍 一、Keil 软件介绍 Keil C51 是美国 Keil software 公司出品的 51 系列兼容单片机 C 语言软件开发系统。 KeilC51 软件提供了丰富的库数据和功能强大的集成开发调试工具 μVision2 全是 windows 界面。 只要看一下编译后生成的汇编代码, 就能体会到 keil C51 生成的目标代码的效率之高, 多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。 Keil的版本目前是 V7 版本,他是很优秀的 8051C 编译器。 安装 Keil C51 对系统的要求比较低, 一般的 windows 系统就可以了。 安装过程也很
[单片机]
验证STM32是小端存储
最近写STM32程序,用到了共用体,由此,引发了疑问。 比如:将0x12345678存储到一个U32类型的变量里面。大端和小端分别是这样存储的。 大端存储: 低地址 …… 高地址 0x 12 34 56 78 小端存储: 低地址 …… 高地址 0x 78 56 34 121234567 看代码 `#include “stm32f10x.h” struct s { u32 a; u8 b; }; union B { u8 c ; struct s s_1; }; union B BB; int main(void) { BB.s_1.a=0x1
[单片机]
33. 外部SRAM实验
STM32F103ZET6 自带了 64K 字节的 SRAM,对一般应用来说,已经足够了,不过在一些对内存要求高的场合,STM32 自带的这些内存就不够用了。比如跑算法或者跑 GUI 等,就可能不太够用,所以战舰 STM32 开发板板载了一颗 1M 字节容量的 SRAM 芯片: IS62WV51216, 满足大内存使用的需求。 本实验采用IS62WV51216 芯片,访问速度为55ns。 一。IS62WV51216简介 兼容TTL电平就是兼容5V,支持高/低字节控制,可以访问8位的字节。 本次实验选择的封装没有CS2引脚,只有CS1,为低电平片选。 LB和UB为低电平有效,比如如果LB==0,说明I/O 0
[单片机]
STM32库函数void USART_SendData()的缺陷和解决方法
简介:本文主要谈到了STM32库函数void USART_SendData()存在的一些问题,针对这些问题提到了3个解决方案,一起来看看。 2.1问题及现象 使用USART_SendData()函数非连续发送单个字符是没有问题的;当连续发送字符时(两个字符间没有延时),就会发现发送缓冲区有溢出现象。若发送的数据量很小时,此时串口发送的只是最后一个字符,当发送数据量大时,就会导致发送的数据莫名其妙的丢失。 如: for(TxCounter = 0;TxCounter RxCounter; TxCounter++) USART_SendData(USART1, RxBuffer ); 2.2原因 此API
[单片机]
stm32的can总线理解及应用——程序对应stm32f103系列
CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。 它的通信速度较快,通信距离远,最高1Mbps(距离小于40米),最远可达10千里(速率低于5Kbps)。在总线空闲时,所有单元都可以发送消息(多主控制),而两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级。ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。 CAN协议经过ISO标准化
[单片机]
STM32 TIM1 输出脉冲范例
TIM模块定时器向上溢出 & 输出比较 首先我们必须肯定ST公司的实力,也承认STM32的确是一款非常不错的Cortex-M3核单片机,但是,他的手册实在是让人觉得无法理解,尤其是其中的TIM模块,没有条理可言,看了两天几乎还是不知所云,让人很是郁闷。同时配套的固件库的说明也很难和手册上的寄存器对应起来,研究起来非常费劲!功能强大倒是真的,但至少也应该配套一个让人看的明白的说明吧~~ 两天时间研究了STM32定时器的最最基础的部分,把定时器最基础的两个功能实现了,余下的功能有待继续学习。 首先有一点需要注意:FWLib固件库目前的最新版应该是V2.0.x,V1.0.x版本固件库中,TIM1模块被独立出来,调用的函数与其他定时器不同
[单片机]
STM32之DAC君
先来张比如花漂亮的照片、大家请尽情欣赏:因为其够美丽了、所以我就不展现我美丽而销魂的涂鸦了、 鉴赏过之后、我们来看看STM32之DAC的Resume(简历简介): 2个DAC转换器:每个转换器对应1个输出通道 ● 8位或者12位单调输出 ● 12位模式下数据左对齐或者右对齐 ● 同步更新功能 ● 噪声波形生成 ● 三角波形生成 ● 双DAC通道同时或者分别转换 ● 每个通道都有DMA功能 ● 外部触发转换 ● 输入参考电压VREF+ 哇、、哇、、哇、、好多特征呀、、还记得上篇博客中ADC也有很多功能吗?在这里,我觉得,因为其功能多、所以其复杂、、这也没什么奇怪的哈、、 那我
[单片机]