上大学时学过一个用STM32进行图像二值化处理的一个代码,屏幕像素是240*240像素,我当时定义了一个二维数组char lcd[240][240];用来表示最终显示在屏幕上的额二值化处理结果,现在看来,其实具有很大的优化空间,可以使用一个char lcd30的数组来保存数据,因为二进制只有0,1值,使用char类型每八个像素存放在一个数据中,显示函数需要重新写一下,可以提高更高的帧率,,,咳咳 扯远了,这篇文章讲的是堆与栈的区别。
堆栈都属于内存,就是电脑上常说的内存条(RAM),STM32F103C8T6内存大小为20KB。

栈(stack):由系统自动分配,例如声明一个局部变量int b; 还有上面的char lcd[240][240];,系统自动在栈中为b、lcd数组开辟空间(这里存在错误)。

堆(heap): 一般来说就是动态申请,程序员使用malloc函数进行申请,比如:p1 = (char *)malloc(10);但是需要注意的是,使用动态方法申请内存时,p1这个指针存在于栈区。

总体来说,在程序中的全局变量或者是静态局部变量存在于栈区,动态申请的存在于堆区,我们在使用动态申请时,使用完成之后必须及时free,否则可能会导致内存泄漏,另外、动态内存申请实际上是遍历内存链表,有合适大小的内存块时才进行操作,所以动态内存申请可能会比较慢,并且在使用过程中,频繁的动态申请内存可能会导致内存块增加。

2022/4/8
STM32编译后分为Code、RO-data、RW-data、ZI-data这几个段:
Code是存储程序代码的。
​RO-data是存储const常量和指令。
​RW-data是存储初始化值不为0的全局变量。
​ZI-data是存储未初始化的全局变量或初始化值为0的全局变量。
Flash=Code + RO Data + RW Data;
RAM= RW-data+ZI-data;
由此得到占用相应的FLASH和RAM的大小,但是除此之外还有两个数据段也会占用RAM,那就是堆和栈,堆栈的大小设置可以在启动文件中设置,堆栈在RAM上的分配是在RW-data+ZI-data之后的地址开始分配的。
堆:是编译器调用动态内存分配的内存区域。
栈:是程序运行的时候局部变量的地方,所以局部变量用数组太大了都有可能造成栈溢出。