STM32内存与堆栈

2020-01-16来源: eefocus关键字:STM32  内存  堆栈

内存基本构成

①  可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。

②  静态存储区:内存在程序编译的时候就已经分配好了,这块内存在程序的整个运行期间都存在。它主要存放静态变量、全局变量和常量。

③  栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率高,但是分配的内存容量有限。栈空间用于局部变量、函数调用、函数的参数等。

④  堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存,动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放动态内存。但是,良好的编程习惯是:如果某动态内存不在使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。(从内存区域的起始地址开始分配给各个全局变量和静态变量:0x200000004)

 

按照这个说法,在startup_stm32f10x_hd文件里面设置了:

Heap_Size     EQU  0x00000000

 

也就是没有任何动态内除分配。

这样,内存=静态存储区+栈区

不存在堆!!!!!

因为没有用malloc来动态分配内存,所以提到的一切堆区,其实就是静态内存区。

 

另外,经过测试,确实是这样。

STM32的内存分配,应该分为两种情况:

1、使用了系统的malloc;

2、未使用系统的malloc。

 

第一种情况(使用malloc)

STM32的内存分配规律:从0x20000000开始依次为:静态存储区+堆区+栈区;

 

第二种情况(不使用malloc)

STM32的内存分配规律:从0x20000000开始依次为:静态存储区+栈区;

 

第二种情况不存在堆区

所以,一般对于开发板历程,实际上,没有所谓的堆区的概念,而仅仅是:静态存储区+栈区。无论哪种情况,所有的全局变量,包括静态变量之类的,全部存储在静态存储区。紧跟静态存储区之后的,是堆区(如没使用到malloc,则没有该区),之后是栈区。

此博文借鉴了原子哥的,发表此篇以此记录

 

补充知识:C语言

(1)栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。(切记不要在函数里面放N多局部变量,尤其是大数组)

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

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

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

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

(6)堆是向上增长,栈是向下增长。

 

//STM32查找栈增长方向,结果保存在stack_dir里面
//0,向下增长;1,向上增长.
staticu8 stack_dir;

//查找栈增长方向,结果保存在stack_dir里面.
voidfind_stack_direction(void)
{
   static u8 *addr=NULL; //用于存放第一个dummy的地址。
   u8dummy;              //用于获取栈地址 
   if(addr==NULL)    //第一次进入
   {                          
       addr=&dummy;     //保存dummy的地址
       find_stack_direction ();  //递归 
   }else               //第二次进入 
 {  
       if(&dummy>addr)stack_dir=1; //第二次dummy的地址大于第一次dummy,那么说明栈增长方向是向上的. 
       else stack_dir=0;          //第二次dummy的地址小于第一次dummy,那么说明栈增长方向是向下的.  
 }

一般CPU的栈增长方向都是向下的

 

大端模式:低位字节存在高地址上,高位字节存在低地址上 
小端模式:高位字节存在高地址上,低位字节存在低地址上

//CPU到底是大端还是小端,可以通过如下代码测试:
//CPU大小端
//0,小端模式;1,大端模式.
static u8 cpu_endian;

//获取CPU大小端模式,结果保存在cpu_endian里面
void find_cpu_endian(void)

 int x=1;
 if(*(char*)&x==1)cpu_endian=0; //小端模式 
 else cpu_endian=1;    //大端模式  
}
//以上测试,在STM32上,你会得到cpu_endian=0,也就是小端模式.

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

上一篇:关于STM32堆栈方面知识点
下一篇:STM32 hex合并及一键烧写

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

推荐阅读

STM8 GPIO 学习(驱动LED、Button)
STM8中GPIO寄存器有:输出寄存器(ODR),输入寄存器(IDR),方向寄存器(DDR),控制寄存器1(CR1)和控制寄存器2(CR2).后面三个寄存器组和可以配置为8种GPIO的模式定义如下:/**  * @brief General Purpose I/Os (GPIO)  */typedef struct GPIO_struct{  __IO uint8_t ODR; /*!< Output Data Register */  __IO uint8_t IDR; /*!< Input Data Register */  __IO uint8_t DDR
发表于 2020-01-19
STM8 GPIO 学习(驱动LED、Button)
STM8单片机STVD环境新建工程笔记
;workspace10.修改workspace的路径为我们自己新建的STVDcosmic下。11.项目名称、路径、编译器设置如下 STM8想用C语言编程,很多人都是用的STVD+COSMIC,安装cxstm8_FSE_stm32_32K.exe软件。这里说说STVD的编译的事情,STVD本身只支持汇编语言,想用C还得借助COSMIC,所以一些设置是必须的,就是在STVD下面选择COSMIC的编译文件(这个根据软件版本自行设置),下图用我的举例单单是把两个软件安装好,编译路径配置好,编译的时候肯定还会出现STM8官方头文件找不到的错误,网上也有解决办法,就是要把头文件复制到自己的工程下,在工程下面把头文件添加进来,这样每个工程都得弄一次,实在是
发表于 2020-01-19
STM8单片机STVD环境新建工程笔记
stm8使用iar刚开始烧录ok,用着用着就下载失败解决方案
用iar写代码的时候,用stlink 下载,再排除接线和烧录器问题,基本上都是要重新用stvp烧录下错误提示:Failed to set configuration with MCU name STM8S207MB: SWIM error [30006] xxxxxxx要是嫌麻烦,可以直接用svtp开发也行1.配置iar 输出s19格式点击rebuild all 生成.s19文件文件在Debug/Exe下打开ST Visual Programmer(STVP)并设置硬件连接方式和MCU型号,这里以ST-Link连接STM8S003F为例用swim方式导入要烧录的.s19文件,设置是否锁定芯片(可以不设置)点击下载按钮Program
发表于 2020-01-19
stm8使用iar刚开始烧录ok,用着用着就下载失败解决方案
stm8系列通过option_byte 来实现端口的remaping
最近在调 stm8,发现需要用到端口映射,研究下用option byte来修改首先确定需求需要使用PC6来发射方波,用到定时器1的ch1需要激活重定向三种方式可以实现,一种是通过IAR for stm8,一种是stvp,一种是在程序执行的时候去改通过程序写flash,这儿先介绍软件的方式IAR 改option byte打开IAR打开option bytes右击 选择 激活保存到制定位置右击打开option找到地方,勾选之后,在重新rebuil all 然后烧录就行了stvp这个就简单了打开,选择型号,点开option byte下拉框选一下,然后电机这个按钮就行了打完收工
发表于 2020-01-19
stm8系列通过option_byte 来实现端口的remaping
IAR for stm8安装破解
1.下载安装包和注册机链接:https://pan.baidu.com/s/1maBEtoyps2HhcdGYxmZUcA提取码:31dn复制这段内容后打开百度网盘手机App,操作更方便哦百度云下载下来这个样子:2.双点击EWSTM8-3104-Autorun安装同意,下一步到结束 。。。 中间会装几个驱动,装就是了装完退出,打完收工3. 注册IAR for STM8是一个收费的软件,官方严厉打击盗版,若你是商业用途,建议购买正版软件。当然,我这里是针对个人开发学习的朋友而言,进行非商业用途的使用。3.1 打开上面安装好的IAR for STM8软件(没有创建桌面快捷方式,可以从开始菜单打开软件)。 Help ->
发表于 2020-01-19
IAR for stm8安装破解
STM32 下载程序时,往flash固定位置写数据配置
1.就像参数定义时使用下面语句const unsigned char Flash_user_data[16] __attribute__((at(0X08080000))) ={            0x01,0x02,0x03,0x04,               0x01,0x01,0x03,0x03,     
发表于 2020-01-19
小广播
何立民专栏 单片机及嵌入式宝典

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

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