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

📄 os_mem.s43

📁 ucos2.52在msp430上移植
💻 S43
📖 第 1 页 / 共 2 页
字号:
	ADD	#65535,12(R12)	
	ADDC	#-1,14(R12)	
; 139.	        OS_EXIT_CRITICAL();
	EINT		
; 140.	        *err = OS_NO_ERR;                             /*      No error                                 */
	MOV.B	#0,0(R14)	
; 141.	        return (pblk);                                /*      Return memory block to caller            */
	MOV	R13,R12	
; 142.	    }
	RET		
?0076:
; 143.	    OS_EXIT_CRITICAL();
	EINT		
; 144.	    *err = OS_MEM_NO_FREE_BLKS;                       /* No,  Notify caller of empty memory partition  */
	MOV.B	#113,0(R14)	
; 145.	    return ((void *)0);                               /*      Return NULL pointer to caller            */
	MOV	#0,R12	
; 146.	}
	RET		
OSMemPut:
; 147.	/*$PAGE*/
; 148.	/*
; 149.	*********************************************************************************************************
; 150.	*                                         RELEASE A MEMORY BLOCK
; 151.	*
; 152.	* Description : Returns a memory block to a partition
; 153.	*
; 154.	* Arguments   : pmem    is a pointer to the memory partition control block
; 155.	*
; 156.	*               pblk    is a pointer to the memory block being released.
; 157.	*
; 158.	* Returns     : OS_NO_ERR            if the memory block was inserted into the partition
; 159.	*               OS_MEM_FULL          if you are returning a memory block to an already FULL memory 
; 160.	*                                    partition (You freed more blocks than you allocated!)
; 161.	*               OS_MEM_INVALID_PMEM  if you passed a NULL pointer for 'pmem'
; 162.	*               OS_MEM_INVALID_PBLK  if you passed a NULL pointer for the block to release.
; 163.	*********************************************************************************************************
; 164.	*/
; 165.	
; 166.	INT8U  OSMemPut (OS_MEM  *pmem, void *pblk)
; 167.	{
	PUSH	R10	
	PUSH	R11	
; 168.	#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
; 169.	    OS_CPU_SR  cpu_sr;
; 170.	#endif    
; 171.	    
; 172.	    
; 173.	#if OS_ARG_CHK_EN > 0
; 174.	    if (pmem == (OS_MEM *)0) {                   /* Must point to a valid memory partition             */
	CMP	#0,R12	
	JNE	(?0079)	
; 175.	        return (OS_MEM_INVALID_PMEM);
	MOV.B	#116,R12	
; 176.	    }
	JMP	(?0084)	
?0079:
; 177.	    if (pblk == (void *)0) {                     /* Must release a valid block                         */
	CMP	#0,R14	
	JNE	(?0081)	
; 178.	        return (OS_MEM_INVALID_PBLK);
	MOV.B	#115,R12	
; 179.	    }
	JMP	(?0084)	
?0081:
; 180.	#endif
; 181.	    OS_ENTER_CRITICAL();
	DINT		
; 182.	    if (pmem->OSMemNFree >= pmem->OSMemNBlks) {  /* Make sure all blocks not already returned          */
	MOV	12(R12),R10	
	MOV	14(R12),R11	
	SUB	8(R12),R10	
	SUBC	10(R12),R11	
	JNC	(?0083)	
; 183.	        OS_EXIT_CRITICAL();
	EINT		
; 184.	        return (OS_MEM_FULL);
	MOV.B	#114,R12	
; 185.	    }
	JMP	(?0084)	
?0083:
; 186.	    *(void **)pblk      = pmem->OSMemFreeList;   /* Insert released block into free block list         */
	MOV	2(R12),0(R14)	
; 187.	    pmem->OSMemFreeList = pblk;
	MOV	R14,2(R12)	
; 188.	    pmem->OSMemNFree++;                          /* One more memory block in this partition            */
	ADD	#1,12(R12)	
	ADDC	#0,14(R12)	
; 189.	    OS_EXIT_CRITICAL();
	EINT		
; 190.	    return (OS_NO_ERR);                          /* Notify caller that memory block was released       */
	MOV.B	#0,R12	
; 191.	}
?0084:
	POP	R11	
	POP	R10	
	RET		
OSMemQuery:
; 192.	/*$PAGE*/
; 193.	/*
; 194.	*********************************************************************************************************
; 195.	*                                          QUERY MEMORY PARTITION
; 196.	*
; 197.	* Description : This function is used to determine the number of free memory blocks and the number of
; 198.	*               used memory blocks from a memory partition.
; 199.	*
; 200.	* Arguments   : pmem    is a pointer to the memory partition control block
; 201.	*
; 202.	*               pdata   is a pointer to a structure that will contain information about the memory
; 203.	*                       partition.
; 204.	*
; 205.	* Returns     : OS_NO_ERR            If no errors were found.
; 206.	*               OS_MEM_INVALID_PMEM  if you passed a NULL pointer for 'pmem'
; 207.	*               OS_MEM_INVALID_PDATA if you passed a NULL pointer for the block to release.
; 208.	*********************************************************************************************************
; 209.	*/
; 210.	
; 211.	#if OS_MEM_QUERY_EN > 0
; 212.	INT8U  OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *pdata)
; 213.	{
; 214.	#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
; 215.	    OS_CPU_SR  cpu_sr;
; 216.	#endif    
; 217.	    
; 218.	    
; 219.	#if OS_ARG_CHK_EN > 0
; 220.	    if (pmem == (OS_MEM *)0) {                   /* Must point to a valid memory partition             */
	CMP	#0,R12	
	JNE	(?0086)	
; 221.	        return (OS_MEM_INVALID_PMEM);
	MOV.B	#116,R12	
; 222.	    }
	RET		
?0086:
; 223.	    if (pdata == (OS_MEM_DATA *)0) {             /* Must release a valid storage area for the data     */
	CMP	#0,R14	
	JNE	(?0088)	
; 224.	        return (OS_MEM_INVALID_PDATA);
	MOV.B	#117,R12	
; 225.	    }
	RET		
?0088:
; 226.	#endif
; 227.	    OS_ENTER_CRITICAL();
	DINT		
; 228.	    pdata->OSAddr     = pmem->OSMemAddr;
	MOV	@R12,0(R14)	
; 229.	    pdata->OSFreeList = pmem->OSMemFreeList;
	MOV	2(R12),2(R14)	
; 230.	    pdata->OSBlkSize  = pmem->OSMemBlkSize;
	MOV	4(R12),4(R14)	
	MOV	6(R12),6(R14)	
; 231.	    pdata->OSNBlks    = pmem->OSMemNBlks;
	MOV	8(R12),8(R14)	
	MOV	10(R12),10(R14)	
; 232.	    pdata->OSNFree    = pmem->OSMemNFree;
	MOV	12(R12),12(R14)	
	MOV	14(R12),14(R14)	
; 233.	    OS_EXIT_CRITICAL();
	EINT		
; 234.	    pdata->OSNUsed    = pdata->OSNBlks - pdata->OSNFree;
	MOV	8(R14),R12	
	MOV	10(R14),R13	
	SUB	12(R14),R12	
	SUBC	14(R14),R13	
	MOV	R12,16(R14)	
	MOV	R13,18(R14)	
; 235.	    return (OS_NO_ERR);
	MOV.B	#0,R12	
; 236.	}
	RET		
OS_MemInit:
; 237.	#endif                                           /* OS_MEM_QUERY_EN                                    */
; 238.	/*$PAGE*/
; 239.	/*
; 240.	*********************************************************************************************************
; 241.	*                                    INITIALIZE MEMORY PARTITION MANAGER
; 242.	*
; 243.	* Description : This function is called by uC/OS-II to initialize the memory partition manager.  Your
; 244.	*               application MUST NOT call this function.
; 245.	*
; 246.	* Arguments   : none
; 247.	*
; 248.	* Returns     : none
; 249.	*
; 250.	* Note(s)    : This function is INTERNAL to uC/OS-II and your application should not call it.
; 251.	*********************************************************************************************************
; 252.	*/
; 253.	
; 254.	void  OS_MemInit (void)
; 255.	{
; 256.	#if OS_MAX_MEM_PART == 1
; 257.	    OSMemFreeList                = (OS_MEM *)&OSMemTbl[0]; /* Point to beginning of free list          */
; 258.	    OSMemFreeList->OSMemFreeList = (void *)0;              /* Initialize last node                     */
; 259.	    OSMemFreeList->OSMemAddr     = (void *)0;              /* Store start address of memory partition  */
; 260.	    OSMemFreeList->OSMemNFree    = 0;                      /* No free blocks                           */
; 261.	    OSMemFreeList->OSMemNBlks    = 0;                      /* No blocks                                */
; 262.	    OSMemFreeList->OSMemBlkSize  = 0;                      /* Zero size                                */
; 263.	#endif
; 264.	
; 265.	#if OS_MAX_MEM_PART >= 2
; 266.	    OS_MEM  *pmem;
; 267.	    INT16U   i;
; 268.	
; 269.	
; 270.	    pmem = (OS_MEM *)&OSMemTbl[0];                    /* Point to memory control block (MCB)           */
	MOV	#OSMemTbl,R13	
; 271.	    for (i = 0; i < (OS_MAX_MEM_PART - 1); i++) {     /* Init. list of free memory partitions          */
	MOV	#0,R12	
?0091:
	CMP	#4,R12	
	JC	(?0090)	
; 272.	        pmem->OSMemFreeList = (void *)&OSMemTbl[i+1]; /* Chain list of free partitions                 */
	MOV	R12,R14	
	ADD	R14,R14	
	ADD	R14,R14	
	ADD	R14,R14	
	ADD	R14,R14	
	ADD	#(OSMemTbl+16),R14	
	MOV	R14,2(R13)	
; 273.	        pmem->OSMemAddr     = (void *)0;              /* Store start address of memory partition       */
	MOV	#0,0(R13)	
; 274.	        pmem->OSMemNFree    = 0;                      /* No free blocks                                */
	MOV	#0,12(R13)	
	MOV	#0,14(R13)	
; 275.	        pmem->OSMemNBlks    = 0;                      /* No blocks                                     */
	MOV	#0,8(R13)	
	MOV	#0,10(R13)	
; 276.	        pmem->OSMemBlkSize  = 0;                      /* Zero size                                     */
	MOV	#0,4(R13)	
	MOV	#0,6(R13)	
; 277.	        pmem++;
	ADD	#16,R13	
	ADD	#1,R12	
	JMP	(?0091)	
?0090:
; 278.	    }
; 279.	    pmem->OSMemFreeList = (void *)0;                  /* Initialize last node                          */
	MOV	#0,2(R13)	
; 280.	    pmem->OSMemAddr     = (void *)0;                  /* Store start address of memory partition       */
	MOV	#0,0(R13)	
; 281.	    pmem->OSMemNFree    = 0;                          /* No free blocks                                */
	MOV	#0,12(R13)	
	MOV	#0,14(R13)	
; 282.	    pmem->OSMemNBlks    = 0;                          /* No blocks                                     */
	MOV	#0,8(R13)	
	MOV	#0,10(R13)	
; 283.	    pmem->OSMemBlkSize  = 0;                          /* Zero size                                     */
	MOV	#0,4(R13)	
	MOV	#0,6(R13)	
; 284.	
; 285.	    OSMemFreeList       = (OS_MEM *)&OSMemTbl[0];     /* Point to beginning of free list               */
	MOV	#OSMemTbl,&OSMemFreeList	
; 286.	#endif
; 287.	}
	RET		
; 288.	#endif                                           /* OS_MEM_EN                                          */
	END

⌨️ 快捷键说明

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