⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_mem.c

📁 avr ucos 代码 测试环境:source insight WINAVR 4个进程
💻 C
📖 第 1 页 / 共 2 页
字号:
*                                         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 + -