• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > STM32學習――內存管理

    STM32學習――內存管理

    作者: 時間:2018-07-24 來源:網絡 收藏

    簡介:

    本文引用地址:http://www.czjhyjcfj.com/article/201807/383616.htm

    ,是指軟件運行時對mcu內存資源的分配和使用的技術。主要目的是高效快速的分配使用內存資源。在適當的時候釋放回收內存資源。實現的方式最終是實現兩個函數:malloc和free;malloc函數用于內存申請,free函數用于內存釋放。

    內存分配原理:

    當指針P調用malloc申請內存的時候,先判斷P要分配的內存塊數(m),然后從n項開始,向下查找,直到找到連續的m塊空間(即對應的內存管理項為“0”)。然后將這m個內存管理項的值都賦值為m(標記為占用)。,最后,把最后的內存地址返回給指針P,完成一次內存分配。注意:如果內存不夠用的時候,或者沒有連續的m塊內存時,則返回NULL給P,表示分配失敗。

    內存釋放原理:

    當P申請的內存用完后,需要釋放的時候,調用free函數實現。free函數先判斷P指向的內存地址所對應的內存塊數m。(內存管理項的值就是所分配的內存塊數)將這m個內存管理項的值清零,標記釋放,完成一次內存釋放。

    關鍵代碼示例:

    //內存分配(內部調用)

    //memx:所屬內存塊

    //size:要分配的內存大小(字節)

    //返回值:0XFFFFFFFF,代表錯誤;其他,內存偏移地址

    u32 mem_malloc(u32 size)

    {

    signed long offset=0;

    u16 nmemb; //需要的內存塊數

    u16 cmemb=0;//連續空內存塊數

    u32 i;

    if(!mallco_dev.memrdy)mallco_dev.init(); //未初始化,先執行初始化

    if(size==0)return 0XFFFFFFFF; //不需要分配

    nmemb=size/memblksize; //獲取需要分配的連續內存塊數

    if(size%memblksize)nmemb++;

    for(offset=memtblsize-1;offset>=0;offset--) //搜索整個內存控制區

    {

    if(!mallco_dev.memmap[offset])cmemb++; //連續空內存塊數增加

    else cmemb=0; //連續內存塊清零

    if(cmemb==nmemb) //找到了連續nmemb個空內存塊

    {

    for(i=0;i //標注內存塊非空

    {

    mallco_dev.memmap[offset+i]=nmemb;

    }

    return (offset*memblksize); //返回偏移地址

    }

    }

    return 0XFFFFFFFF;//未找到符合分配條件的內存塊

    }

    //釋放內存(內部調用)

    //offset:內存地址偏移

    //返回值:0,釋放成功;1,釋放失敗;

    u8 mem_free(u32 offset)

    {

    int i;

    if(!mallco_dev.memrdy)//未初始化,先執行初始化

    {

    mallco_dev.init();

    return 1;//未初始化

    }

    if(offset

    {

    int index=offset/memblksize; //偏移所在內存塊號碼

    int nmemb=mallco_dev.memmap[index]; //內存塊數量

    for(i=0;i //內存塊清零

    {

    mallco_dev.memmap[index+i]=0;

    }

    return 0;

    }else return 2;//偏移超區了.

    }

    //釋放內存(外部調用)

    //ptr:內存首地址

    void myfree(void *ptr)

    {

    u32 offset;

    if(ptr==NULL)return;//地址為0.

    offset=(u32)ptr-(u32)mallco_dev.membase;

    mem_free(offset); //釋放內存

    }

    //分配內存(外部調用)

    //size:內存大小(字節)

    //返回值:分配到的內存首地址.

    void *mymalloc(u32 size)

    {

    u32 offset;

    offset=mem_malloc(size);

    if(offset==0XFFFFFFFF)return NULL;

    else return (void*)((u32)mallco_dev.membase+offset);

    }

    //重新分配內存(外部調用)

    //*ptr:舊內存首地址

    //size:要分配的內存大小(字節)

    //返回值:新分配到的內存首地址.

    void *myrealloc(void *ptr,u32 size)

    {

    u32 offset;

    offset=mem_malloc(size);

    if(offset==0XFFFFFFFF)return NULL;

    else

    {

    mymemcpy((void*)((u32)mallco_dev.membase+offset),ptr,size); //拷貝舊內存內容到新內存

    myfree(ptr); //釋放舊內存

    return (void*)((u32)mallco_dev.membase+offset); //返回新內存首地址

    }

    }

    • 單片機中文官網
    • 單片機官方開發工具
    • 單片機參考設計


    關鍵詞: STM32 內存管理

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 芒康县| 安塞县| 永仁县| 宁波市| 诸暨市| 右玉县| 门头沟区| 房山区| 许昌市| 怀安县| 香港| 瑞丽市| 防城港市| 黑水县| 安宁市| 龙门县| 甘孜县| 甘肃省| 松原市| 监利县| 太原市| 甘肃省| 信丰县| 麦盖提县| 东阳市| 石台县| 札达县| 盐津县| 丹寨县| 翼城县| 永胜县| 武冈市| 女性| 黄冈市| 康保县| 星子县| 玉门市| 荆门市| 桐城市| 元阳县| 大邑县|