CH57x/CH58x堆栈
前言:
堆(Heap):顺序任意。由程序员分配和回收。
栈(Stack):先进后出。由系统自动分配和回收。存放函数的参数值,局部变量的值等。可以应用于进入中断并保留现场,即压栈处理。
概念:
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),导致申请内存使用出问题,因此需要通过算法进行计算或者先释放掉再去申请内存。
总结:
申请堆通过蓝牙的tmos_msg_allocate函数申请,如果没有使用蓝牙功能,则通过第三方封装的函数进行申请。避免使用C标准的堆申请。