📄 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 + -