前言
嵌入式工程师们免不了和堆栈打交道,深入理解了这两个东西,才能从代码编写时就考虑清楚内存管理,避免到后期出现各种莫名其妙的问题。
最近在使用CC2530时也遇到了一些问题,怀疑跟栈空间溢出有关,于是做了一次梳理。可能有些理解还不到位,等了解了再修正。
本文是以CC2530为例做了测试,我们可以借鉴到其他单片机上。
所谓栈空间,就是一块内存空间。而溢出,就是使用的内存区域超过了这块空间。占用栈空间的是局部变量。
TI的FAE说CC2530的栈空间大小为223字节左右,最好不要超出。我实际测试,超过250就会崩溃,表现为打印函数出不来。可以这么理解,超过223字节的时候,栈空间溢出了,此时有些内存区域出现了覆盖等不良情况,但还没影响到打印的这部分;但栈使用超过250字节时,效果就很明显了,打印函数都被波及。
转载请注明:http://blog.youkuaiyun.com/sadshen/
一、栈溢出的几种现象
我把自己目前认为的可导致栈溢出的行为,给列了出来。1.1和1.2都很容易理解。1.3可能会被忽视,但其实理一理,发现并不难理解,因为子函数在占用栈空间时,其外部的函数并没有释放出栈空间。
1.1 单个局部变量的溢出
void main(void)
{
uint8 tmp[250] = {0};
}
1.2 多个局部变量的溢出
void main(voi