全局变量存储在静态区。
局部变量,以及形参,返回值等存储在栈中,由编译器自动分配和释放。
动态申请的内存,如malloc函数或new函数申请的存储与堆中。
程序代码下载存储在FLASH中,一些常量也存在这里。
单片机“系统堆、栈”分配
在FreeRTOS开发时,需要为每个任务分配一定的内存,作为“任务桟”,用来保存各个任务切换时的上下文环境。这里的“任务桟”并不是上述的“系统栈”,这段内存实际上可能位于静态区(静态分配的内存)或者堆中(动态分配的内存)。
FreeRTOS共支持6种内存管理方法(内存分配与释放方法),在STM32CubeMX软件生成的Keil工程中默认使用heap_4c.c文件定义的方法,这个方法实际上就是定义了一个大的数组(静态全局变量,存储在静态区),任务桟的内存都是从这个大数组中分出去的。另一种方法heap_3c.c文件定义的方法是使用malloc函数从堆中分配出内存(动态分配)。此处所说的堆即为图一、图二中的heap_size。需要注意的是,动态分配的内存大小一定不能超过了图一中设置的堆大小,否则申请失败。
|