<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于stm32f103zet6的內(nèi)存管理的學(xué)習(xí)

          基于stm32f103zet6的內(nèi)存管理的學(xué)習(xí)

          作者: 時(shí)間:2016-12-01 來(lái)源:網(wǎng)絡(luò) 收藏

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

          1、首先進(jìn)行的是一個(gè)初始化,初始化的作用上面已經(jīng)提及,再次不贅述,這里我們假設(shè)一塊內(nèi)存為40個(gè)block(一個(gè)block為32字節(jié),因?yàn)閮?nèi)存太?。┠敲唇酉聛?lái)可以看到是通過(guò)我們傳入的參數(shù)計(jì)算出了總的內(nèi)存塊數(shù),并且如果不整除的話,還會(huì)多分配一個(gè)內(nèi)存塊。nmemb = 64。內(nèi)存管理表內(nèi)容用于檢測(cè)該塊是否被占用。注意這里的內(nèi)存塊一定是連續(xù)的,

          內(nèi)存管理表的項(xiàng)值代表的意義為:當(dāng)該項(xiàng)值為0的時(shí)候,代表對(duì)應(yīng)的內(nèi)存塊未被占用,當(dāng)該項(xiàng)值非零的時(shí)候,代表該項(xiàng)對(duì)應(yīng)的內(nèi)存塊已經(jīng)被占用,其數(shù)值則代表被連續(xù)占用的內(nèi)存塊數(shù)。比如某項(xiàng)值為10,那么說(shuō)明包括本項(xiàng)對(duì)應(yīng)的內(nèi)存塊在內(nèi),總共分配了10個(gè)內(nèi)存塊給外部的某個(gè)指針。

          之后就是標(biāo)志代碼了,注釋很詳細(xì),接下來(lái)看看這個(gè)返回偏移地址的代碼:offset*memblksize[memx],這個(gè)偏移值就是memblksize【0】 = 0x20*offset

          2、好的,接下來(lái)就是將偏移值轉(zhuǎn)化為所謂的外部指針了。

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

          3、然后就是

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

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

          打印指針內(nèi)容。

          4、很重要的一步

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

          記得要釋放內(nèi)存呀,看代碼函數(shù)

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

          mallco_dev.memmap[memx][offset+i]=nmemb;標(biāo)注非空了,那么也就是說(shuō),我們占用了的那些內(nèi)存塊就會(huì)標(biāo)記為nmenb,否則就是0。

          當(dāng)我們釋放完內(nèi)存后,記得加上這個(gè) P = NULL.

          只是為了防止產(chǎn)生野指針,誰(shuí)能保證,每次運(yùn)行程序的時(shí)候,給變量分配地址的時(shí)候,不會(huì)使用到這個(gè)地址呢??所以這是個(gè)好習(xí)慣!


          上一頁(yè) 1 2 下一頁(yè)

          關(guān)鍵詞: stm32f103zet6內(nèi)存管

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();