CH57x/CH58x堆栈
前言:
堆(Heap):顺序任意。由程序员分配和回收。
栈(Stack):先进后出。由系统自动分配和回收。存放函数的参数值,局部变量的值等。可以应用于进入中断并保留现场,即压栈处理。
| 特性 | 堆 (Heap) | 栈 (Stack) |
|---|---|---|
| 分配方式 | 手动分配 (malloc/free) |
自动分配(函数调用时) |
| 释放方式 | 手动释放 (free) |
自动释放(函数返回时) |
| 生命周期 | 由程序员控制 | 与函数调用周期一致 |
| 内存管理 | 相对复杂,可能产生碎片 | 简单,LIFO(后进先出) |
概念:
int a = 0; //全局初始化区域
char *p1; //全局未初始化区域
main(){
static int c = 0; //全局(静态)初始化区
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //"123456\0"在常量区,p3在栈上;
p1 = (char *)malloc(10);
p2 = (char *)malloc(20); //分配得来的10和20字节的区域在堆区
}
注意点:
可以使用GATT_bm_alloc和GATT_bm_free进行内存的申请和释放,这是专门针对蓝牙收发函数使用的;
可以使用tmos_msg_allocate和tmos_msg_deallocate进行内存的申请和释放,这是专门针对蓝牙协议栈使用的(个人建议使用)。
也可以使用C语言的malloc进行内存的分配,但是会涉及到内存碎片的问题。如总共8K内存,先申请2K内存,再申请200BYTE,再申请300BYTE,然后释放2K的内存,则还剩余7K的RAM,但是此时直接申请7K的内存,则会出现碎片(中间夹杂着200BYTE&300BYTE),导致申请内存使用出问题,因此需要通过算法进行计算或者先释放掉再去申请内存。
+-------------------+ 高地址
| 栈 | ← 栈向下生长
| (Stack) |
+-------------------+
| 堆 | ← 堆向上生长
| (Heap) |
+-------------------+
| 数据段 | ← 全局变量、静态变量
| (Data/BSS) |
+-------------------+
| 蓝牙协议栈缓存 | ← 固定的8K
| (8KB) |
+-------------------+ 低地址
总结:
申请堆通过蓝牙的tmos_msg_allocate函数申请,如果没有使用蓝牙功能,则通过第三方封装的函数进行申请。避免使用C标准的堆申请。
浙公网安备 33010602011771号