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

📄 os_mem.s43

📁 IAR project for MSP430 and uC/OS. All configured to start filling with tasks.
💻 S43
📖 第 1 页 / 共 2 页
字号:
	NAME	os_mem(16)
	RSEG	CODE(1)
	PUBLIC	OSMemCreate
	EXTERN	OSMemFreeList
	PUBLIC	OSMemGet
	PUBLIC	OSMemPut
	PUBLIC	OSMemQuery
	EXTERN	OSMemTbl
	PUBLIC	OS_MemInit
	EXTERN	?CL430_1_26_L08
	RSEG	CODE
OSMemCreate:
; 1.	/*
; 2.	*********************************************************************************************************
; 3.	*                                                uC/OS-II
; 4.	*                                          The Real-Time Kernel
; 5.	*                                            MEMORY MANAGEMENT
; 6.	*
; 7.	*                          (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
; 8.	*                                           All Rights Reserved
; 9.	*
; 10.	* File : OS_MEM.C
; 11.	* By   : Jean J. Labrosse
; 12.	*********************************************************************************************************
; 13.	*/
; 14.	
; 15.	#ifndef  OS_MASTER_FILE
; 16.	#include "includes.h"
; 17.	#endif
; 18.	
; 19.	#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
; 20.	/*
; 21.	*********************************************************************************************************
; 22.	*                                        CREATE A MEMORY PARTITION
; 23.	*
; 24.	* Description : Create a fixed-sized memory partition that will be managed by uC/OS-II.
; 25.	*
; 26.	* Arguments   : addr     is the starting address of the memory partition
; 27.	*
; 28.	*               nblks    is the number of memory blocks to create from the partition.
; 29.	*
; 30.	*               blksize  is the size (in bytes) of each block in the memory partition.
; 31.	*
; 32.	*               err      is a pointer to a variable containing an error message which will be set by
; 33.	*                        this function to either:
; 34.	*
; 35.	*                        OS_NO_ERR            if the memory partition has been created correctly.
; 36.	*                        OS_MEM_INVALID_ADDR  you are specifying an invalid address for the memory 
; 37.	*                                             storage of the partition.
; 38.	*                        OS_MEM_INVALID_PART  no free partitions available
; 39.	*                        OS_MEM_INVALID_BLKS  user specified an invalid number of blocks (must be >= 2)
; 40.	*                        OS_MEM_INVALID_SIZE  user specified an invalid block size
; 41.	*                                             (must be greater than the size of a pointer)
; 42.	* Returns    : != (OS_MEM *)0  is the partition was created
; 43.	*              == (OS_MEM *)0  if the partition was not created because of invalid arguments or, no
; 44.	*                              free partition is available.
; 45.	*********************************************************************************************************
; 46.	*/
; 47.	
; 48.	OS_MEM  *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err)
; 49.	{
	PUSH	R10	
	PUSH	R11	
	PUSH	R8	
	PUSH	R9	
	PUSH	R6	
	PUSH	R7	
	PUSH	R4	
	PUSH	R5	
	SUB	#6,SP	
	MOV	R12,R10	
	MOV	24(SP),R8	
	MOV	26(SP),R9	
	MOV	28(SP),R11	
; 50.	#if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
; 51.	    OS_CPU_SR  cpu_sr;
; 52.	#endif    
; 53.	    OS_MEM    *pmem;
; 54.	    INT8U     *pblk;
; 55.	    void     **plink;
; 56.	    INT32U     i;
; 57.	
; 58.	
; 59.	#if OS_ARG_CHK_EN > 0
; 60.	    if (addr == (void *)0) {                          /* Must pass a valid address for the memory part. */
	CMP	#0,R10	
	JNE	(?0059)	
; 61.	        *err = OS_MEM_INVALID_ADDR;
	MOV.B	#118,0(R11)	
; 62.	        return ((OS_MEM *)0);
	MOV	#0,R12	
; 63.	    }
	JMP	(?0072)	
?0059:
; 64.	    if (nblks < 2) {                                  /* Must have at least 2 blocks per partition      */
	MOV	R14,R12	
	MOV	R15,R13	
	SUB	#2,R12	
	SUBC	#0,R13	
	JC	(?0061)	
; 65.	        *err = OS_MEM_INVALID_BLKS;
	MOV.B	#111,0(R11)	
; 66.	        return ((OS_MEM *)0);
	MOV	#0,R12	
; 67.	    }
	JMP	(?0072)	
?0061:
; 68.	    if (blksize < sizeof(void *)) {                   /* Must contain space for at least a pointer      */
	MOV	R8,R12	
	MOV	R9,R13	
	SUB	#2,R12	
	SUBC	#0,R13	
	JC	(?0063)	
; 69.	        *err = OS_MEM_INVALID_SIZE;
	MOV.B	#112,0(R11)	
; 70.	        return ((OS_MEM *)0);
	MOV	#0,R12	
; 71.	    }
	JMP	(?0072)	
?0063:
; 72.	#endif
; 73.	    OS_ENTER_CRITICAL();
	DINT		
; 74.	    pmem = OSMemFreeList;                             /* Get next free memory partition                */
	MOV	&OSMemFreeList,R4	
; 75.	    if (OSMemFreeList != (OS_MEM *)0) {               /* See if pool of free partitions was empty      */
	CMP	#0,&OSMemFreeList	
	JEQ	(?0065)	
; 76.	        OSMemFreeList = (OS_MEM *)OSMemFreeList->OSMemFreeList;
	MOV	&OSMemFreeList,R12	
	MOV	2(R12),&OSMemFreeList	
?0065:
; 77.	    }
; 78.	    OS_EXIT_CRITICAL();
	EINT		
; 79.	    if (pmem == (OS_MEM *)0) {                        /* See if we have a memory partition             */
	CMP	#0,R4	
	JNE	(?0067)	
; 80.	        *err = OS_MEM_INVALID_PART;
	MOV.B	#110,0(R11)	
; 81.	        return ((OS_MEM *)0);
	MOV	#0,R12	
; 82.	    }
	JMP	(?0072)	
?0067:
; 83.	    plink = (void **)addr;                            /* Create linked list of free memory blocks      */
	MOV	R10,0(SP)	
; 84.	    pblk  = (INT8U *)addr + blksize;
	MOV	R10,R5	
	ADD	R8,R5	
; 85.	    for (i = 0; i < (nblks - 1); i++) {
	MOV	#0,2(SP)	
	MOV	#0,4(SP)	
?0069:
	MOV	R14,R6	
	MOV	R15,R7	
	ADD	#65535,R6	
	ADDC	#-1,R7	
	MOV	2(SP),R12	
	MOV	4(SP),R13	
	SUB	R6,R12	
	SUBC	R7,R13	
	MOV	@SP,R12	
	JC	(?0068)	
; 86.	        *plink = (void *)pblk;
	MOV	R5,0(R12)	
; 87.	        plink  = (void **)pblk;
	MOV	R5,0(SP)	
; 88.	        pblk   = pblk + blksize;
	ADD	R8,R5	
	ADD	#1,2(SP)	
	ADDC	#0,4(SP)	
	JMP	(?0069)	
?0068:
; 89.	    }
; 90.	    *plink              = (void *)0;                  /* Last memory block points to NULL              */
	MOV	#0,0(R12)	
; 91.	    pmem->OSMemAddr     = addr;                       /* Store start address of memory partition       */
	MOV	R10,0(R4)	
; 92.	    pmem->OSMemFreeList = addr;                       /* Initialize pointer to pool of free blocks     */
	MOV	R10,2(R4)	
; 93.	    pmem->OSMemNFree    = nblks;                      /* Store number of free blocks in MCB            */
	MOV	R14,12(R4)	
	MOV	R15,14(R4)	
; 94.	    pmem->OSMemNBlks    = nblks;
	MOV	R14,8(R4)	
	MOV	R15,10(R4)	
; 95.	    pmem->OSMemBlkSize  = blksize;                    /* Store block size of each memory blocks        */
	MOV	R8,4(R4)	
	MOV	R9,6(R4)	
; 96.	    *err                = OS_NO_ERR;
	MOV.B	#0,0(R11)	
; 97.	    return (pmem);
	MOV	R4,R12	
; 98.	}
?0072:
	ADD	#6,SP	
	POP	R5	
	POP	R4	
	POP	R7	
	POP	R6	
	POP	R9	
	POP	R8	
	POP	R11	
	POP	R10	
	RET		
OSMemGet:
; 99.	/*$PAGE*/
; 100.	/*
; 101.	*********************************************************************************************************
; 102.	*                                          GET A MEMORY BLOCK
; 103.	*
; 104.	* Description : Get a memory block from a partition
; 105.	*
; 106.	* Arguments   : pmem    is a pointer to the memory partition control block
; 107.	*
; 108.	*               err     is a pointer to a variable containing an error message which will be set by this
; 109.	*                       function to either:
; 110.	*
; 111.	*                       OS_NO_ERR           if the memory partition has been created correctly.
; 112.	*                       OS_MEM_NO_FREE_BLKS if there are no more free memory blocks to allocate to caller
; 113.	*                       OS_MEM_INVALID_PMEM if you passed a NULL pointer for 'pmem'
; 114.	*
; 115.	* Returns     : A pointer to a memory block if no error is detected
; 116.	*               A pointer to NULL if an error is detected
; 117.	*********************************************************************************************************
; 118.	*/
; 119.	
; 120.	void  *OSMemGet (OS_MEM *pmem, INT8U *err)
; 121.	{
; 122.	#if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
; 123.	    OS_CPU_SR  cpu_sr;
; 124.	#endif    
; 125.	    void      *pblk;
; 126.	
; 127.	
; 128.	#if OS_ARG_CHK_EN > 0
; 129.	    if (pmem == (OS_MEM *)0) {                        /* Must point to a valid memory partition         */
	CMP	#0,R12	
	JNE	(?0074)	
; 130.	        *err = OS_MEM_INVALID_PMEM;
	MOV.B	#116,0(R14)	
; 131.	        return ((OS_MEM *)0);
; 132.	    }
	RET		
?0074:
; 133.	#endif
; 134.	    OS_ENTER_CRITICAL();
	DINT		
; 135.	    if (pmem->OSMemNFree > 0) {                       /* See if there are any free memory blocks       */
	MOV	12(R12),R13	
	BIS	14(R12),R13	
	CMP	#0,R13	
	JEQ	(?0076)	
; 136.	        pblk                = pmem->OSMemFreeList;    /* Yes, point to next free memory block          */
	MOV	2(R12),R13	
; 137.	        pmem->OSMemFreeList = *(void **)pblk;         /*      Adjust pointer to new free list          */
	MOV	@R13,2(R12)	
; 138.	        pmem->OSMemNFree--;                           /*      One less memory block in this partition  */

⌨️ 快捷键说明

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