如图所示位STM32F103ZET6的参数:
单片机的ROM(内部FLASH):512KB,用来存放程序代码的空间。
单片机的RAM:64KB,一般都被分配为堆、栈、变量等的空间。
单片机中的堆和栈是用来存储程序运行时的数据的两个重要区域。堆和栈都存在于单片机的RAM(随机存储器)中。
堆是用来存储动态分配的内存空间的区域。在单片机中,堆的大小取决于程序的需求,但是总大小不能超过单片机硬件的实际RAM大小。堆的分配和释放是由程序员手动控制的,通常使用malloc()和free()等函数来进行操作。
栈是用来存储函数调用和局部变量的区域。每当一个函数被调用时,函数的参数、返回地址和局部变量等信息都会被压入栈中。当函数执行完毕后,这些信息会被弹出栈。栈的大小是由编译器在编译时确定的,通常是根据函数的嵌套深度和局部变量的大小来决定的。
堆和栈都是用来存储程序运行时的数据的区域,但是它们的分配和使用方式有所不同。
栈:向低地址扩展,从上往下扩展;
堆:向高地址扩展,从下网上扩展;
如果设置了堆的空间大小,但堆空间没有分配使用
那么程序在运行的时候,我们栈的空间超过本身设置的空间,进入到堆里面,那么程序是不会出错的;但是超过了堆的空间了,进入到全局变量区域,就会出现莫名其妙的错误。
打开KEIL工程中的Map File文件后,在文件内容最下方可以看到如下统计。
图中,各代号含义如下,
Code:代码存储区。这部分是存放代码的。
RO-Data:只读数据区。这部分保存程序中用 const 定义的全局常量数据和字符串。
RW-Data:已初始化的读写数据。程序中定义的已经初始化的全局变量和静态变量。
ZI-Data:未初始化的读写数据。程序中定义的未初始化的全局变量和静态变量。这部分内容是在程序运行的时候保存在RAM中的。