uc/os-ii的記憶體管理由自定義的分割槽(陣列)來完成,根據需要進行初始化、建立、獲得、釋放;
注意它只是做管理,並沒有提供真實使用的位址,使用的位址是通過osmemcreate由外部提供的。
而了解這種機制,在我們平時的程式開發有多記憶體的應用場合,可是採用這種思想進行裝置。
1、記憶體的初始化
之前有準備好的陣列osmemtbl,然後根據要初始化的os最大記憶體塊數量os_max_mem_part來初始化:
(1)如果只有乙個,那麼塊指向第乙個陣列元素,指明它的osmemname[0] = '?';
(2)如果數量有2個或以上,那麼就把相應數量的陣列元素的osmemname [0] = '?';
總之,可以看出初始化只是把相應數量的陣列元素的osmennames成員置為'?'。
}2、建立記憶體(難點)
根據返回的osmemfreelist指標查詢下乙個osmemfreelist,看是否他為free ,如果為free直接返回;
如果不為free那麼根據傳進來的記憶體開始位址、塊的數量、每塊的大小來初始化osmemfreelist。
難點:
os_mem *osmemcreate (void *addr, int32u nblks, int32u blksize, int8u *perr)
if (addr == (void *)0)
if (((int32u)addr & (sizeof(void *) - 1)) != 0)
if (nblks < 2)
if (blksize < sizeof(void *))
#endif
os_enter_critical();
pmem = osmemfreelist; /* get next free memory partition */
if (osmemfreelist != (os_mem *)0)
os_exit_critical();
if (pmem == (os_mem *)0)
plink = (void **)addr; /* create linked list of free memory blocks */
pblk = (int8u *)((int32u)addr + blksize);
for (i = 0; i < (nblks - 1); i++)
*plink = (void *)0; /* last memory block points to null */
pmem->osmemaddr = addr; /* store start address of memory partition */
pmem->osmemfreelist = addr; /* initialize pointer to pool of free blocks */
pmem->osmemnfree = nblks; /* store number of free blocks in mcb */
pmem->osmemnblks = nblks;
pmem->osmemblksize = blksize; /* store block size of each memory blocks */
*perr = os_err_none;
return (pmem);
}
3、記憶體的獲得
從行參pmem中獲得下乙個free的記憶體塊,並讓pmem的osmemfreelist指標指向這塊記憶體塊。
void *osmemget (os_mem *pmem, int8u *perr)
if (pmem == (os_mem *)0)
#endif
os_enter_critical();
if (pmem->osmemnfree > 0)
os_exit_critical();
*perr = os_err_mem_no_free_blks; /* no, notify caller of empty memory partition */
return ((void *)0); /* return null pointer to caller */
}
4、記憶體的釋放
與記憶體的獲得osmemget相反,這裡是把釋放的記憶體插入到控制項管理塊中。
int8u osmemput (os_mem *pmem, void *pblk)
if (pblk == (void *)0)
#endif
os_enter_critical();
if (pmem->osmemnfree >= pmem->osmemnblks)
*(void **)pblk = pmem->osmemfreelist; /* insert released block into free block list */
pmem->osmemfreelist = pblk;
pmem->osmemnfree++; /* one more memory block in this partition */
os_exit_critical();
return (os_err_none); /* notify caller that memory block was released */
}
實驗四 uC OS II 的記憶體管理
實驗四 uc os ii 的記憶體管理 一 實驗目的 掌握嵌入式實時作業系統 uc os ii 記憶體管理中記憶體分配和 的功能。二 實驗原理 注意 根據程式中設定的時間延遲,圖中的每個柵格對應100個系統時鐘週期。為了防止記憶體申請和釋放的不合理導致的大塊連續記憶體被分割成可用性小的小片的問題,u...
uC OS II記憶體管理函式的二維指標
uc os ii記憶體管理函式內最難理解的部分就是二維指標,本文以 並茂的方式對二維指標進行了詳細分析與講解。看完本文,相信對c裡面指標的概念又會有進一步的認識。一 osmemcreate 函式中有如下語句 os mem pmem int8u pblk void plink int32u i pli...
uC OS II就緒任務的管理
uc os ii就緒任務的管理 uc os ii總是在已就緒的任務中選擇乙個任務來執行。為了了解系統中的任務哪些是就緒任務,uc os ii在系統初始化時間裡了乙個供就緒任務登記的表,整個表就叫做就緒任務表。uc os ii的就緒任務表實質上是乙個型別為int8u的陣列osrdytbl 其中的每一位...