FLASH主要用于存放代码和数据。地址从0x0800 0000开始的,是向上增长的。
Flash可以分为文本段、只读段、数据复制段。文本段可以分为可执行代码和常量。
数据复制段存放STM32的flash是从地址0x0800 0000开始的,是向上增长的。
一、内存组成
从内存高地址到内存低地址,依次分布着栈区、堆区、全局区(静态区)、常量区、代码区,其中全局区中高地址分布着.bss段,低地址分布着.data段。
ram中包含了如下几个部分:
1、.data 段: 存放初始化为非 0 值的全局变量
2、.bss段 : 存放未初始化或者是初始化为 0 的全局变量
3、堆 (heap)区 : 由 malloc 申请,由 free 释放。用于存放程序在运行时,所需要动态申请、删除的内存段。
4、栈 (Stack) 区: 由系统自行分配、释放。存放局部变量、函数入参和函数的返回值。
5、 常量区:存放不可修改的值,如定义的字符串,常量变量等。
6、代码区:存放代码可执行文件。
其中data和bss比较好理解就是一些全局变量。堆和栈的空间可以由我们来自由设定如下图所示,只要这些部分加起来不超过STM32的RAM空间。
Stack Size 定义了栈空间 Head Size定义了堆空间。
存放函数执行时的局部变量、中断入口,函数运行时消耗的空间为栈空间,结束时释放对应的空间。堆是手动申请得到的空间,主要通过 malloc、new等函数申请,但是使用结束时需要通过free delete函数释放已申请的空间,否则会造成内存泄漏。
二、大小端存储问题
单片机中采用小端存储,即低位在前,高位在后。如下图所示。
图-1 RAM中的大小端
图-2 ROM中的大小端