新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于stm32f103zet6的內存管理的學習

        基于stm32f103zet6的內存管理的學習

        作者: 時間:2016-12-01 來源:網絡 收藏

        /***************************************************************************************
        名 稱: mem_malloc
        * 功 能: 內存分配(內部調用)
        * 參 數: *memx:所屬內存塊*size:要分配的內存大小(字節)
        * 返 回 值: 0XFFFFFFFF,代表錯誤;其他,內存偏移地址
        **************************************************************************************
        u32 mem_malloc(u8 memx,u32 size)
        {
        signed long offset=0;
        u16 nmemb;//需要的內存塊數
        u16 cmemb=0;//連續空內存塊數
        u32 i;
        if(!mallco_dev.memrdy[memx])mallco_dev.init(memx);//未初始化,先執行初始化
        if(size==0)return 0XFFFFFFFF;//不需要分配
        nmemb=size/memblksize[memx]; //獲取需要分配的連續內存塊數
        if(size%memblksize[memx])nmemb++;
        for(offset=memtblsize[memx]-1;offset>=0;offset--) //搜索整個內存控制區
        {
        if(!mallco_dev.memmap[memx][offset])cmemb++; //連續空內存塊數增加
        else cmemb=0; //連續內存塊清零
        if(cmemb==nmemb) //找到了連續nmemb個空內存塊
        {
        for(i=0;i {
        mallco_dev.memmap[memx][offset+i]=nmemb;
        }
        return (offset*memblksize[memx]);//返回偏移地址 }
        }
        return 0XFFFFFFFF;//未找到符合分配條件的內存塊
        }

        1、首先進行的是一個初始化,初始化的作用上面已經提及,再次不贅述,這里我們假設一塊內存為40個block(一個block為32字節,因為內存太小)那么接下來可以看到是通過我們傳入的參數計算出了總的內存塊數,并且如果不整除的話,還會多分配一個內存塊。nmemb = 64。內存管理表內容用于檢測該塊是否被占用。注意這里的內存塊一定是連續的,

        內存管理表的項值代表的意義為:當該項值為0的時候,代表對應的內存塊未被占用,當該項值非零的時候,代表該項對應的內存塊已經被占用,其數值則代表被連續占用的內存塊數。比如某項值為10,那么說明包括本項對應的內存塊在內,總共分配了10個內存塊給外部的某個指針。

        之后就是標志代碼了,注釋很詳細,接下來看看這個返回偏移地址的代碼:offset*memblksize[memx],這個偏移值就是memblksize【0】 = 0x20*offset

        2、好的,接下來就是將偏移值轉化為所謂的外部指針了。

        else return (void*)((u32)mallco_dev.membase[memx]+offset);
        這行代碼,返回一個void 類型的首地址就是mallco_dev.membase[0],這樣我們就得到了一個地址了。

        3、然后就是

        p=mymalloc(sramx,2048); //申請2K字節if(p!=NULL)sprintf((char*)p,"This is xiaobings Memory Malloc Test!!");//向p寫入一些內容 printf("%s",p); //顯示P的內容

        這就是把這個地址傳給指針p,那么我們接著就可以給指針p賦值內容了,這回爽到了吧?

        打印指針內容。

        4、很重要的一步

        myfree(sramx,p);//釋放內存,否則資源難以回收

        記得要釋放內存呀,看代碼函數

        /*************************************************************************************** 名 稱: mem_free* 功 能: 釋放內存(內部調用)* 參 數: *memx:所屬內存塊* offset:內存地址偏移* 返 回 值: 0,釋放成功;1,釋放失敗; **************************************************************************************/u8 mem_free(u8 memx,u32 offset) { int i; if(!mallco_dev.memrdy[memx])//未初始化,先執行初始化{mallco_dev.init(memx); return 1;//未初始化 } if(offset

        mallco_dev.memmap[memx][offset+i]=nmemb;標注非空了,那么也就是說,我們占用了的那些內存塊就會標記為nmenb,否則就是0。

        當我們釋放完內存后,記得加上這個 P = NULL.

        只是為了防止產生野指針,誰能保證,每次運行程序的時候,給變量分配地址的時候,不會使用到這個地址呢??所以這是個好習慣!


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 芦山县| 额济纳旗| 揭阳市| 新乡市| 临夏县| 望江县| 衡山县| 蕲春县| 达拉特旗| 启东市| 阿鲁科尔沁旗| 文昌市| 邵武市| 台东县| 尉氏县| 娄烦县| 罗定市| 原平市| 老河口市| 兴和县| 南康市| 盐池县| 土默特左旗| 鄂托克前旗| 美姑县| 灵丘县| 呼玛县| 通山县| 赤壁市| 大悟县| 丰都县| 蕲春县| 通城县| 洞头县| 黄冈市| 嘉荫县| 娄底市| 庄河市| 镇雄县| 确山县| 海林市|