单片机常用的堆栈知识汇总
先来聊聊为什么要说这个吧,因为今天代码首先遇到在运行Freertos代码,只能运行一个task,另一个task无法运行,debug后,报hardfault错误,查询后,可能是堆栈分配异常。查阅资料后,修改代码,又遇到了代码No space in execution regions with .问题,单片机资源有限,报这个错误,是我之前并没有考虑过的,因此做出这个汇总,以便阅者和作者自查。
首先关于堆栈空间分配问题
这里0x400,默认是1024(1K)字节(Byte)大小。
讲到字节,我们就来聊聊一点基础知识:
1字节=8位(1 byte = 8bit)
1字=2字节(1 word = 2 byte)
char = uint_8 = 1字节
uint_16 = u16 = 2字节
int_32 = int = 4字节
来举个例子 char a[1024],也就是1024字节空间
接下来继续:
栈(stack)空间,用于局部变量,函数调时现场保护和返回地址,函数的形参等。
堆(heap)空间,主要用于动态内存分配,也就是说用 malloc,calloc, realloc 等函数分配的变量空间是在堆上。
全局区(static)
文字常亮区程序代码区
我们再来聊聊一点基础知识:
- stm32f103c8t6 小容量芯片 RAM容量为20KB,FLASH容量为64KB
使用CubeMX对该芯片创建一个工程,然后点击魔术棒可以看到: