针对单片机平台,在函数体实现中,如果要分配大容量的内存,最好是使用堆上分配的方式。
问题描述
目前遇到在函数实现中,多次定义256Bytes的数组,导致栈空间溢出。目前平台无法使用调试器调试,只能加日志打印或者使用代码注释的方式定位出问题的地方。最后发现是定义了256Bytes数组导致的。
解决方案
调整栈内存总大小
调整栈空间大小。这个需要在内存分配的时候,确定栈空间大小,这个不太好动态调整。如果项目要加代码,又要重新评估栈空间够不够用。
使用堆内存分配
使用堆内存分配有三种方式。需要根据实际情况选择使用。
static分配
使用static关键字申明,分配的内存会是在堆上。static分配可以是在全局,也可以是在局部,如果使用的内存是持久化的,并且只能内部单独使用,不同线程公用会有问题的话,适合使用这种分配方式,但是多次分配会造成堆内存的浪费。
全局变量
全局变量加不加static都是在堆上分配,这个适合多个地方同时都要使用这个内存,但是不会同时使用的情况,或者可以加锁让其可同时使用,使用不会是持久化的。
malloc分配
这种方式比较灵活,弥补了上述分配方式的不足。但是单片机平台,容易造成内存泄漏。一般MCU平台是能不用malloc就不用malloc的。