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

📄 os_mem.src

📁 AT89C55WD上移植的ucos-ii, 非常有用, 串口观看输出与调试。
💻 SRC
📖 第 1 页 / 共 2 页
字号:
;     *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        */
;     *err                = OS_NO_ERR;
;     return (pmem);
; }
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                          GET A MEMORY BLOCK
; *
; * Description : Get a memory block from a partition
; *
; * Arguments   : pmem    is a pointer to the memory partition control block
; *
; *               err     is a pointer to a variable containing an error message which will be set by this
; *                       function to either:
; *
; *                       OS_NO_ERR           if the memory partition has been created correctly.
; *                       OS_MEM_NO_FREE_BLKS if there are no more free memory blocks to allocate to caller
; *                       OS_MEM_INVALID_PMEM if you passed a NULL pointer for 'pmem'
; *
; * Returns     : A pointer to a memory block if no error is detected
; *               A pointer to NULL if an error is detected
; *********************************************************************************************************
; */
; 
; void  *OSMemGet (OS_MEM *pmem, INT8U *err)LG_REENTRANT
; {
; #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;     OS_CPU_SR  cpu_sr;
; #endif    
;     void      *pblk;
; 
; 
; #if OS_ARG_CHK_EN > 0
;     if (pmem == (OS_MEM *)0) {                        /* Must point to a valid memory partition         */
;         *err = OS_MEM_INVALID_PMEM;
;         return ((OS_MEM *)0);
;     }
; #endif
;     OS_ENTER_CRITICAL();
;     if (pmem->OSMemNFree > 0) {                       /* See if there are any free memory blocks       */
;         pblk                = pmem->OSMemFreeList;    /* Yes, point to next free memory block          */
;         pmem->OSMemFreeList = *(void **)pblk;         /*      Adjust pointer to new free list          */
;         pmem->OSMemNFree--;                           /*      One less memory block in this partition  */
;         OS_EXIT_CRITICAL();
;         *err = OS_NO_ERR;                             /*      No error                                 */
;         return (pblk);                                /*      Return memory block to caller            */
;     }
;     OS_EXIT_CRITICAL();
;     *err = OS_MEM_NO_FREE_BLKS;                       /* No,  Notify caller of empty memory partition  */
;     return ((void *)0);                               /*      Return NULL pointer to caller            */
; }
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                         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.
; *********************************************************************************************************
; */
; 
; INT8U  OSMemPut (OS_MEM  *pmem, void *pblk)LG_REENTRANT
; {
; #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.
; *********************************************************************************************************
; */
; 
; #if OS_MEM_QUERY_EN > 0
; INT8U  OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *os_pdata)LG_REENTRANT
; {
; #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 (os_pdata == (OS_MEM_DATA *)0) {             /* Must release a valid storage area for the data     */
;         return (OS_MEM_INVALID_PDATA);
;     }
; #endif
;     OS_ENTER_CRITICAL();
;     os_pdata->OSAddr     = pmem->OSMemAddr;
;     os_pdata->OSFreeList = pmem->OSMemFreeList;
;     os_pdata->OSBlkSize  = pmem->OSMemBlkSize;
;     os_pdata->OSNBlks    = pmem->OSMemNBlks;
;     os_pdata->OSNFree    = pmem->OSMemNFree;
;     OS_EXIT_CRITICAL();
;     os_pdata->OSNUsed    = os_pdata->OSNBlks - os_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.
; *********************************************************************************************************
; */
; 
; void  OS_MemInit (void)LG_REENTRANT
; {
; #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                                          */
; *** sync lost ***
; *** sync lost ***
; *** sync lost ***
	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -