当前位置:   article > 正文

STM32内存分配以及堆栈、变量、代码等的存储位置理解与分析_sm32单片机内存情况

sm32单片机内存情况

文中不足之处,欢迎各位同仁批评指正!

前言

        STM32的程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个4GB的线性地址空间内, 地址范围为0x0000 0000至0xFFFF FFFF。其中FLASH为ROM类型,储存的数据掉电不易失;RAM中存储的数据掉电易失。以STM32F103系列为例,最多有512KB的FLASH空间以及最多64KB的RAM空间,另外还包含一个512字节的用于标准USB和CAN通信的SRAM。如下图所示:

一、FLASH分段

FLASH主要是存放代码和只读数据的,细分图如下:

        如上图所示,Flash又可以细分为文本段、只读数据段、数据复制段。其中文本段包含代码和代码中的常量部分,只读数据区通常存放程序中以const关键字修饰的数据,数据复制段存放的则是程序中初始化不为0的全局变量的数据,在每次单片机复位后要对这些变量重新赋值。

二、RAM分段

RAM主要用来存储数据,如下是STM32的RAM分区:

data段:存放初始化非0的全局变量;

bss段:存放未初始化或初始化为0的全局变量;

Heap(堆)段:由程序员通过malloc/free申请和释放;

Stack(栈)段:存放局部变量和函数的入口地址;

        其中栈的方向是由栈顶自上而下的,堆的方向则是自下而上的,如果RAM空间有限而且一个程序中局部变量较多或申请的堆空间过大,便会造成堆和栈冲突,并造成系统崩溃(自己暂时写的程序较小,暂时没有遇到过类似问题)。

        栈,也叫堆栈,是一种先进后出,插入和删除操作都在栈顶操作的线性表。栈的作用通常是保存函数返回地址及保存局部变量。每个函数在运行时都有自己的栈空间,局部变量越多,占空间占用越大,函数间调用越深,栈空间也越大。CPU将打断前的程序运行到的地址、寄存器的值保存到栈中,即保护现场;当打断执行完以后,又从栈中读取之前保存的值,即恢复现场。

        如下是STM32启动文件(.s)中对栈和堆的定义,其中栈大小为0x400即1KB,堆大小为0x200即512Byte。

  1. ; <h> Stack Configuration
  2. ; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
  3. ; </h>
  4. Stack_Size EQU 0x400
  5. AREA STACK, NOINIT, READWRITE, ALIGN=3
  6. Stack_Mem SPACE Stack_Size
  7. __initial_sp
  8. ; <h> Heap Configuration
  9. ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
  10. ; </h>
  11. Heap_Size EQU 0x200
  12. AREA HEAP, NOINIT, READWRITE, ALIGN=3
  13. __heap_base
  14. Heap_Mem SPACE Heap_Size
  15. __heap_limit

三、kei中的map文件

如图在keil中编写如下程序代码,验证各变量的存储位置:

  1. int a;
  2. const int fconst[128] = {0};
  3. volatile unsigned int *p;
  4. volatile char *pc;
  5. volatile int *pi;
  6. volatile float *pf;
  7. /* USER CODE END 0 */
  8. /**
  9. * @brief The application entry point.
  10. * @retval int
  11. */
  12. int main(void)
  13. {
  14. /* USER CODE BEGIN 1 */
  15. volatile char c = 0;
  16. a = fconst[5];
  17. a = 123;
  18. p = (volatile unsigned int *)(0x40010800 + 0x0c);
  19. /* USER CODE END 1 */

其中:变量a为未初始化的全局变量,应保存在RAM的bss段;

           变量fconst为只读数据,应保存在Flash的只读数据段;

           变量p,pc,pi,pf均为指针型未初始化全局变量,也应保存在RAM的bss段,且均分配4字节的空间大小。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/75912
推荐阅读
相关标签
  

闽ICP备14008679号