?? os_mem.c
字號:
* RELEASE A MEMORY BLOCK
*
* Description : Returns a memory block to a partition
*
* Arguments : pmem is a pointer to the memory partition control block
*
* pblk is a pointer to the memory block being released.
*
* Returns : OS_NO_ERR if the memory block was inserted into the partition
* OS_MEM_FULL if you are returning a memory block to an already FULL memory
* partition (You freed more blocks than you allocated!)
* OS_MEM_INVALID_PMEM if you passed a NULL pointer for 'pmem'
* OS_MEM_INVALID_PBLK if you passed a NULL pointer for the block to release.
*********************************************************************************************************
*/
/*
*********************************************************************************************************
釋放一個內存塊
描述:返回一個內存塊到分割區中
參數;pmem:指向內存分割控制塊的指針
pblk:指向將被釋放內存塊的指針
返回:OS_NO_ERR:如果內存塊成功插入到分割區
OS_MEM_FULL:如果返回內存塊到一個已滿的內存分割區中
OS_MEM_INVALID_PMEM:如果你傳遞一個空指針到“pmem”
OS_MEM_INVALID_PBLK:如果傳一個空指針到將釋放的塊
備注:此函數并不知道內存塊是屬于哪個分區的,也就是說,如果用戶程序
從一個包含32B內存塊的分區中分配了一個內存塊,用完后千萬不要將一個包含
120B內存塊給返回來,因為如果下次一個程序申請120B內存時,只會得到32B
*********************************************************************************************************
*/
INT8U OSMemPut (OS_MEM *pmem, void *pblk)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
#if OS_ARG_CHK_EN > 0
if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition */
return (OS_MEM_INVALID_PMEM);//必須是可行的內存分割區
}
if (pblk == (void *)0) { /* Must release a valid block */
return (OS_MEM_INVALID_PBLK);//必須釋放一個可行的內存塊
}
#endif
OS_ENTER_CRITICAL();
if (pmem->OSMemNFree >= pmem->OSMemNBlks) { /* Make sure all blocks not already returned */
OS_EXIT_CRITICAL();//檢查內存分區是否已滿,
return (OS_MEM_FULL);//如果滿了,返回滿了
}
*(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_NO_ERR); /* Notify caller that memory block was released */
}
/*$PAGE*/
/*
*********************************************************************************************************
* QUERY MEMORY PARTITION
*
* Description : This function is used to determine the number of free memory blocks and the number of
* used memory blocks from a memory partition.
*
* Arguments : pmem is a pointer to the memory partition control block
*
* pdata is a pointer to a structure that will contain information about the memory
* partition.
*
* Returns : OS_NO_ERR If no errors were found.
* OS_MEM_INVALID_PMEM if you passed a NULL pointer for 'pmem'
* OS_MEM_INVALID_PDATA if you passed a NULL pointer for the block to release.
*********************************************************************************************************
*/
/*
*********************************************************************************************************
查詢一個內存分區狀態
描述:查詢一億內存分割區的空內存塊和已用內存塊
參數:pmem:指向一個內存分割控制塊的指針
pdata: 將要包含內存分割區信息的結構指針
返回:OS_NO_ERR:沒有發現錯誤
OS_MEM_INVALID_PMEM :如果傳送一個空指針給‘pmem’
OS_MEM_INVALID_PDATA:如果傳一個空指針到將釋放的塊
*********************************************************************************************************
*/
#if OS_MEM_QUERY_EN > 0
INT8U OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
#if OS_ARG_CHK_EN > 0
if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition */
return (OS_MEM_INVALID_PMEM);//必須是可行的分割區
}
if (pdata == (OS_MEM_DATA *)0) { /* Must release a valid storage area for the data */
return (OS_MEM_INVALID_PDATA);//必須為數據釋放一個可行的存儲空間
}//OS_MEM_DATA中存放了特定內存分區中內存塊的大小,可用內存塊數目和
//已用內存塊數目等信息。
#endif
OS_ENTER_CRITICAL();
pdata->OSAddr = pmem->OSMemAddr;//將指定內存分區的信息全部復制到指定變量的
pdata->OSFreeList = pmem->OSMemFreeList;//相應區域,此過程中,中斷被關,防止在此過程中
pdata->OSBlkSize = pmem->OSMemBlkSize;//數據被改
pdata->OSNBlks = pmem->OSMemNBlks;
pdata->OSNFree = pmem->OSMemNFree;
OS_EXIT_CRITICAL();
pdata->OSNUsed = pdata->OSNBlks - pdata->OSNFree;//計算已用塊
return (OS_NO_ERR);
}
#endif /* OS_MEM_QUERY_EN */
/*$PAGE*/
/*
*********************************************************************************************************
* INITIALIZE MEMORY PARTITION MANAGER
*
* Description : This function is called by uC/OS-II to initialize the memory partition manager. Your
* application MUST NOT call this function.
*
* Arguments : none
*
* Returns : none
*
* Note(s) : This function is INTERNAL to uC/OS-II and your application should not call it.
*********************************************************************************************************
*/
/*
*********************************************************************************************************
初始化內存分割區管理
描述:ucos內部調用,其它應用程序不能調用
參數:無
返回:元
備注:ucos內部調用,其它應用程序不能調用
*********************************************************************************************************
*/
void OS_MemInit (void)
{
#if OS_MAX_MEM_PART == 1//分割區為一塊
OSMemFreeList = (OS_MEM *)&OSMemTbl[0]; /* Point to beginning of free list */
//指向空閑列表開始的指針
OSMemFreeList->OSMemFreeList = (void *)0; /* Initialize last node */
//初始化最后結點?什么意思?它是指向空內存塊指針的
OSMemFreeList->OSMemAddr = (void *)0; /* Store start address of memory partition */
//保存內存分割區的開始地址
OSMemFreeList->OSMemNFree = 0; /* No free blocks */
//為零表明沒有空塊
OSMemFreeList->OSMemNBlks = 0; /* No blocks */
//分割區中沒有內存塊
OSMemFreeList->OSMemBlkSize = 0; /* Zero size */
//大小為零
#endif
#if OS_MAX_MEM_PART >= 2//如果分割區有兩塊以上
OS_MEM *pmem;//內存結構
INT16U i;
pmem = (OS_MEM *)&OSMemTbl[0]; /* Point to memory control block (MCB) */
//指向內存控制塊的指針
for (i = 0; i < (OS_MAX_MEM_PART - 1); i++) { /* Init. list of free memory partitions */
//對每一塊內存分割區進行初始化
pmem->OSMemFreeList = (void *)&OSMemTbl[i+1]; /* Chain list of free partitions */
//內存管理空間鏈表
pmem->OSMemAddr = (void *)0; /* Store start address of memory partition */
//內存分割區存儲開始地址
pmem->OSMemNFree = 0; /* No free blocks */
//無空閑塊
pmem->OSMemNBlks = 0; /* No blocks */
//無塊
pmem->OSMemBlkSize = 0; /* Zero size */
//大小為零
pmem++;//內存控制塊加一?
}
pmem->OSMemFreeList = (void *)0; /* Initialize last node */
//初始化最后一個結點,空余內存塊列表指針
pmem->OSMemAddr = (void *)0; /* Store start address of memory partition */
//開始地址
pmem->OSMemNFree = 0; /* No free blocks */
pmem->OSMemNBlks = 0; /* No blocks */
pmem->OSMemBlkSize = 0; /* Zero size */
OSMemFreeList = (OS_MEM *)&OSMemTbl[0]; /* Point to beginning of free list */
//空表開始指針
#endif
}
#endif /* OS_MEM_EN */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -