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标准的堆申请。

 

posted @ 2023-07-31 20:58  SweetTea_lllpc  阅读(62)  评论(0编辑  收藏  举报