<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于stm32f103zet6的內存管理的學(xué)習

基于stm32f103zet6的內存管理的學(xué)習

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

/***************************************************************************************
名 稱(chēng): 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--) //搜索整個(gè)內存控制區
{
if(!mallco_dev.memmap[memx][offset])cmemb++; //連續空內存塊數增加
else cmemb=0; //連續內存塊清零
if(cmemb==nmemb) //找到了連續nmemb個(gè)空內存塊
{
for(i=0;i {
mallco_dev.memmap[memx][offset+i]=nmemb;
}
return (offset*memblksize[memx]);//返回偏移地址 }
}
return 0XFFFFFFFF;//未找到符合分配條件的內存塊
}

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

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

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

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

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

3、然后就是

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

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

打印指針內容。

4、很重要的一步

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

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

/*************************************************************************************** 名 稱(chēng): 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;標注非空了,那么也就是說(shuō),我們占用了的那些內存塊就會(huì )標記為nmenb,否則就是0。

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

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


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

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

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>