日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Tiniux 3.0 / Memory.c / OSMemMalloc 和 OSMemCalloc

發布時間:2024/10/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Tiniux 3.0 / Memory.c / OSMemMalloc 和 OSMemCalloc 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
--------------------------------------------- -- 時間:2018-11-13 -- 創建人:Ruo_Xiao -- 郵箱:xclsoftware@163.com -- 若大神不吝拋磚,小菜感激不盡! ---------------------------------------------

一、OSMemMalloc?

void* OSMemMalloc(uOSMemSize_t size) { // 變量初始化//返回最終的已分配的內存塊的首地址(不包括tOSMem_t)uOS8_t * pResult = OS_NULL;//gpOSMemBegin(堆)的迭代器uOSMemSize_t ptr = 0U;//分配完內存塊之后剩余的空閑塊的在堆中的位置,也是迭代器uOSMemSize_t ptr2 = 0U;//開始時是較大空閑塊的首地址,由于堆分配是從低地址向高地址分配,分配完成之后,//該地址變成了要分配的內存塊的首地址,但是包含tOSMem_t,去掉tOSMem_t之后就是pResult。tOSMem_t *ptOSMemTemp = OS_NULL;//分配完內存塊剩余的空閑塊的首地址tOSMem_t *ptOSMemTemp2 = OS_NULL; // 初始化堆,詳見:https://blog.csdn.net/itworld123/article/details/83998064if(gpOSMemEnd==OS_NULL){OSMemInit();if(gpOSMemEnd==OS_NULL){return pResult;}} // 不需要分配則返回OS_NULLif (size == 0) {return pResult;} // 對齊要分配的內存塊 size = OSMEM_ALIGN_SIZE(size); // 分配的內存塊至少要大于OSMIN_SIZE_ALIGNEDif(size < OSMIN_SIZE_ALIGNED) {// every data block must be at least OSMIN_SIZE_ALIGNED long size = OSMIN_SIZE_ALIGNED;} // 分配的內存塊大小超過堆最大值,則返回OS_NULLif (size > OSMEM_SIZE_ALIGNED) {return pResult;}// protect the heap from concurrent access OSIntLock();// 2018-11-10// (uOSMemSize_t)((uOS8_t *)gpOSMemLFree - gpOSMemBegin) 確定閑置tOSMem_t首地址相對Begin的位置// OSMEM_SIZE_ALIGNED - size 搜索的范圍不能超過待分配內存塊的最高地址處// ptr = ((tOSMem_t *)(void *)&gpOSMemBegin[ptr])->NextMem 確定下一個tOSMem_t的位置 for (ptr = (uOSMemSize_t)((uOS8_t *)gpOSMemLFree - gpOSMemBegin); ptr < OSMEM_SIZE_ALIGNED - size;ptr = ((tOSMem_t *)(void *)&gpOSMemBegin[ptr])->NextMem) {ptOSMemTemp = (tOSMem_t *)(void *)&gpOSMemBegin[ptr];//1、ptOSMemTemp->Used 該內存塊不能被用//2、ptOSMemTemp->NextMem - (ptr + SIZEOF_OSMEM_ALIGNED)) >= size // 計算該free指定的空閑塊的大小,其中不包括tOSMem_t,故減掉 SIZEOF_OSMEM_ALIGNEDif ((!ptOSMemTemp->Used) && (ptOSMemTemp->NextMem - (ptr + SIZEOF_OSMEM_ALIGNED)) >= size) { // 分配內存的過程就是插入節點(tOSMem_t)的過程。// ptOSMemTemp 當前節點的首地址(tOSMem_t)// ptOSMemTemp->NextMem 下一個節點的首地址(tOSMem_t)// ptOSMemTemp->NextMem - (ptr + SIZEOF_OSMEM_ALIGNED) 當前節點對應的內存塊到下一個內存塊對應的tOSMem_t首地址之間的大小// (size + SIZEOF_OSMEM_ALIGNED + OSMIN_SIZE_ALIGNED) 申請內存完內存之后,在申請的內存后面插入新的tOSMem_t,// tOSMem_t和下一個節點之間至少要有一個OSMIN_SIZE_ALIGNED大小的內存小塊,否則兩個tOSMem_t就連在// 了一起。// 如果滿足上述要求,就插入一個節點,否則直接將該內存塊設置為要申請的內存if (ptOSMemTemp->NextMem - (ptr + SIZEOF_OSMEM_ALIGNED) >= (size + SIZEOF_OSMEM_ALIGNED + OSMIN_SIZE_ALIGNED)) { ptr2 = ptr + SIZEOF_OSMEM_ALIGNED + size;// 創建 ptOSMemTemp2 信息塊,該信息塊對應的內存塊大小至少為 OSMIN_SIZE_ALIGNEDptOSMemTemp2 = (tOSMem_t *)(void *)&gpOSMemBegin[ptr2];ptOSMemTemp2->Used = 0;ptOSMemTemp2->NextMem = ptOSMemTemp->NextMem;ptOSMemTemp2->PrevMem = ptr;ptOSMemTemp->NextMem = ptr2;ptOSMemTemp->Used = 1;if (ptOSMemTemp2->NextMem != OSMEM_SIZE_ALIGNED) {((tOSMem_t *)(void *)&gpOSMemBegin[ptOSMemTemp2->NextMem])->PrevMem = ptr2;}} else {ptOSMemTemp->Used = 1;}//循環第一次,此時ptOSMemTemp=gpOSMemLFree。if (ptOSMemTemp == gpOSMemLFree) {//若gpOSMemLFree完成了內存分配,即:Used為1,則更新Free指針。while (gpOSMemLFree->Used && gpOSMemLFree != gpOSMemEnd) {gpOSMemLFree = (tOSMem_t *)(void *)&gpOSMemBegin[gpOSMemLFree->NextMem];}}// 返回tOSMem_t對應的的內存塊的地址pResult = (uOS8_t *)ptOSMemTemp + SIZEOF_OSMEM_ALIGNED;break;}}OSIntUnlock();return pResult; }

二、OSMemCalloc?

//Calloc和 Malloc的關系是,前者調用后者并且若申請內存塊成功則初始化buffer。 //詳見:https://blog.csdn.net/itworld123/article/details/79187109 void* OSMemCalloc(uOSMemSize_t count, uOSMemSize_t size) {void *pMem = OS_NULL;// allocate 'count' objects of size 'size' pMem = OSMemMalloc(count * size);if (pMem) {// zero the memory memset(pMem, 0, count * size);}return pMem; }

注:建議將代碼復制下來,用 VS Code 或者 Notepad++ 審閱效果更加。

?

?

(SAW:Game Over!)

總結

以上是生活随笔為你收集整理的Tiniux 3.0 / Memory.c / OSMemMalloc 和 OSMemCalloc的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。