- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
STM32堆栈分析要点
三、STM32堆栈区预备知识:一个由C/C++编译的程序占用的内存分为以下几个部分:栈区(stack):编译器自动分配释放,存放函数的参数值,局部变量的值等。操作方式类似于数据结构中的栈。堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。文字常量区—常量字符串就是放在这里的。程序结束后由系统释放程序代码区—存放函数体的二进制代码编译后,各个区存储内容举例说明如下://main.cppint a = 0; 全局初始化区char *p1; 全局未初始化区main(){int b; 栈char s[] = “abc”; 栈char *p2; 栈char *p3 = “123456”; 123456\0在常量区,p3在栈上static int c =0;全局(静态)初始化区p1 = (char *)malloc(10);p2 = (char *)malloc(20);分配得来得10和20字节的区域就在堆区。strcpy(p1, 123456); 123456\0放在常量区,编译器可能会将它与p3所指向的123456优化成一个地方。}STM32的分区STM32的分区从0x2000 0000(0x2000 0000是SRAM的起始地址,由此可知,堆栈等都是在RAM中的)开始。静态区,堆,栈。所有的全局变量,包括静态变量之类的,全部存储在静态存储区。?紧跟静态存储区之后的,是堆区(如没用到malloc,则没有该区),之后是栈区,栈在程序中存储局部变量。先看启动文件startup_stm32f10x_md.s的定义:; Amount of memory (in bytes) allocated for Stack?; Tailor this value to your application needs?; h Stack Configuration?; o Stack Size (in Bytes) 0x0-0xFFFFFFFF:8?; /hStack_Size EQU 0REA STACK, NOINIT, READWRITE, ALIGN=3?Stack_Mem SPACE Stack_Size?__initial_sp; h Heap Configuration?; o Heap Size (in Bytes) 0x0-0xFFFFFFFF:8?; /hHeap_Size EQU 0REA HEAP, NOINIT, READWRITE, ALIGN=3?__heap_base?Heap_Mem SPACE Heap_Size?__heap_limit这里定义了堆栈各自大小,堆:512bytes 栈1k;所以栈区大小有限制,我们在局部变量中不要定义大数组否则容易溢出。再看下code rorwziCode指存储到flash【Rom】中的程序代码。ZI英语是zero initial,就是程序中用到的变量并且被系统初始化为0的变量的字节数,keil编译器默认是把你没有初始化的变量都赋值一个0,这些变量在程序运行时是保存在RAM中的。RW是可读可写变量,就是初始化时候就已经赋值了的,RW + ZI就是你的程序总共使用的RAM字节数。RO是程序中的指令和常量,这些值是被保存到Rom中的。Total ROM Size (Code + RO Data + RW Data)这样所写的程序占用的ROM的字节总数,也就是说程序所下载到ROM flash 中的大小。为什么Rom中还要存RW,因为掉电后RAM中所有数据都丢失了,每次上电RAM中的数据是被重新赋值的,每次这些固定的值就是存储在Rom中的,为什么不包含ZI段呢,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。??????????实际上,ROM中的指令至少应该有这样的功能:?? ? ? ? ?1. 将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。?? ? ? ? ?2. 将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中。?1,首先来看:栈(STACK)的问题.函数的局部变量,都是存放在“栈”里面,栈的英文是:STACK。STACK的大小,我们可以在stm32的启动文件里面设置,在s
您可能关注的文档
- 高考语文鉴赏古代诗歌事物形象2.ppt
- SpringMVC原理.pptx
- SPC过程能力分析.ppt
- SPSS17.0在生物统计学中的应用-实验七-卡方检验.doc
- SPSS在曲线拟合中的.ppt
- Springer学术期刊投稿流程.ppt
- SpringMVC手册__职业技能培训.ppt
- 2015第二学期第二周国旗下讲话稿.doc
- 高考语法——名词.ppt
- SPSS功能及菜单简介.ppt
- 2024年湖南省高考英语试卷(含答案解析)+听力音频+听力原文.docx
- 2024年江西省高考英语试卷(含答案解析)+听力音频+听力原文.docx
- 2024年安徽省高考英语试卷(含答案解析)+听力音频+听力原文.docx
- 2024年福建省高考英语试卷(含答案解析)+听力音频+听力原文.docx
- 2024年广东省高考英语试卷(含答案解析)+听力音频+听力原文.docx
- 2024年河北省高考英语试卷(含答案解析)+听力音频+听力原文.docx
- 2024年河南省高考英语试卷(含答案解析)+听力音频.docx
- 2024年湖北省高考英语试卷(含答案解析)+听力音频+听力原文.docx
- 2024年湖南省高考英语试卷(含答案解析)+听力音频+听力原文.docx
- 2024年江苏省高考英语试卷(含答案解析)+听力音频+听力原文.docx
文档评论(0)