os_mem.lst

来自「atmega单片机用的ucos系统 占用内存适中 是atmega单片机合适的操作」· LST 代码 · 共 1,065 行 · 第 1/4 页

LST
1,065
字号
   1               		.file	"os_mem.c"
   2               		.arch atmega128
   3               	__SREG__ = 0x3f
   4               	__SP_H__ = 0x3e
   5               	__SP_L__ = 0x3d
   6               	__tmp_reg__ = 0
   7               	__zero_reg__ = 1
   8               		.global __do_copy_data
   9               		.global __do_clear_bss
  11               		.text
  12               	.Ltext0:
  88               	.global	OSMemCreate
  90               	OSMemCreate:
   1:OSsrc/os_mem.c **** /*
   2:OSsrc/os_mem.c **** ***************************************************************************************************
   3:OSsrc/os_mem.c **** *                                                uC/OS-II
   4:OSsrc/os_mem.c **** *                                          The Real-Time Kernel
   5:OSsrc/os_mem.c **** *                                            MEMORY MANAGEMENT
   6:OSsrc/os_mem.c **** *
   7:OSsrc/os_mem.c **** *                          (c) Copyright 1992-2003, Jean J. Labrosse, Weston, FL
   8:OSsrc/os_mem.c **** *                                           All Rights Reserved
   9:OSsrc/os_mem.c **** *
  10:OSsrc/os_mem.c **** * File    : OS_MEM.C
  11:OSsrc/os_mem.c **** * By      : Jean J. Labrosse
  12:OSsrc/os_mem.c **** * Version : V2.76
  13:OSsrc/os_mem.c **** ***************************************************************************************************
  14:OSsrc/os_mem.c **** */
  15:OSsrc/os_mem.c **** 
  16:OSsrc/os_mem.c **** #ifndef  OS_MASTER_FILE
  17:OSsrc/os_mem.c **** #include "ucos_ii.h"
  18:OSsrc/os_mem.c **** #endif
  19:OSsrc/os_mem.c **** 
  20:OSsrc/os_mem.c **** #if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
  21:OSsrc/os_mem.c **** /*
  22:OSsrc/os_mem.c **** ***************************************************************************************************
  23:OSsrc/os_mem.c **** *                                        CREATE A MEMORY PARTITION
  24:OSsrc/os_mem.c **** *
  25:OSsrc/os_mem.c **** * Description : Create a fixed-sized memory partition that will be managed by uC/OS-II.
  26:OSsrc/os_mem.c **** *
  27:OSsrc/os_mem.c **** * Arguments   : addr     is the starting address of the memory partition
  28:OSsrc/os_mem.c **** *
  29:OSsrc/os_mem.c **** *               nblks    is the number of memory blocks to create from the partition.
  30:OSsrc/os_mem.c **** *
  31:OSsrc/os_mem.c **** *               blksize  is the size (in bytes) of each block in the memory partition.
  32:OSsrc/os_mem.c **** *
  33:OSsrc/os_mem.c **** *               err      is a pointer to a variable containing an error message which will be set b
  34:OSsrc/os_mem.c **** *                        this function to either:
  35:OSsrc/os_mem.c **** *
  36:OSsrc/os_mem.c **** *                        OS_NO_ERR            if the memory partition has been created correctly.
  37:OSsrc/os_mem.c **** *                        OS_MEM_INVALID_ADDR  you are specifying an invalid address for the memory 
  38:OSsrc/os_mem.c **** *                                             storage of the partition.
  39:OSsrc/os_mem.c **** *                        OS_MEM_INVALID_PART  no free partitions available
  40:OSsrc/os_mem.c **** *                        OS_MEM_INVALID_BLKS  user specified an invalid number of blocks (must be >
  41:OSsrc/os_mem.c **** *                        OS_MEM_INVALID_SIZE  user specified an invalid block size
  42:OSsrc/os_mem.c **** *                                             (must be greater than the size of a pointer)
  43:OSsrc/os_mem.c **** * Returns    : != (OS_MEM *)0  is the partition was created
  44:OSsrc/os_mem.c **** *              == (OS_MEM *)0  if the partition was not created because of invalid arguments or, no
  45:OSsrc/os_mem.c **** *                              free partition is available.
  46:OSsrc/os_mem.c **** ***************************************************************************************************
  47:OSsrc/os_mem.c **** */
  48:OSsrc/os_mem.c **** 
  49:OSsrc/os_mem.c **** OS_MEM  *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err)
  50:OSsrc/os_mem.c **** {
  92               	.LM1:
  93               	/* prologue: frame size=0 */
  94 0000 AF92      		push r10
  95 0002 BF92      		push r11
  96 0004 CF92      		push r12
  97 0006 DF92      		push r13
  98 0008 EF92      		push r14
  99 000a FF92      		push r15
 100 000c 0F93      		push r16
 101 000e 1F93      		push r17
 102 0010 CF93      		push r28
 103 0012 DF93      		push r29
 104               	/* prologue end (size=10) */
 105 0014 6C01      		movw r12,r24
 106 0016 5701      		movw r10,r14
  51:OSsrc/os_mem.c ****     OS_MEM    *pmem;
  52:OSsrc/os_mem.c ****     INT8U     *pblk;
  53:OSsrc/os_mem.c ****     void     **plink;
  54:OSsrc/os_mem.c ****     INT32U     i;
  55:OSsrc/os_mem.c **** #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register  
  56:OSsrc/os_mem.c ****     OS_CPU_SR  cpu_sr;
  57:OSsrc/os_mem.c **** 
  58:OSsrc/os_mem.c **** 
  59:OSsrc/os_mem.c **** 
  60:OSsrc/os_mem.c ****     cpu_sr = 0;                                       /* Prevent compiler warning                  
  61:OSsrc/os_mem.c **** #endif    
  62:OSsrc/os_mem.c **** #if OS_ARG_CHK_EN > 0
  63:OSsrc/os_mem.c ****     if (addr == (void *)0) {                          /* Must pass a valid address for the memory p
 108               	.LM2:
 109 0018 892B      		or r24,r25
 110 001a 29F4      		brne .L2
  64:OSsrc/os_mem.c ****         *err = OS_MEM_INVALID_ADDR;
 112               	.LM3:
 113 001c 86E7      		ldi r24,lo8(118)
 114 001e D701      		movw r26,r14
 115 0020 8C93      		st X,r24
  65:OSsrc/os_mem.c ****         return ((OS_MEM *)0);
 117               	.LM4:
 118 0022 C601      		movw r24,r12
 119 0024 50C0      		rjmp .L1
 120               	.L2:
  66:OSsrc/os_mem.c ****     }
  67:OSsrc/os_mem.c ****     if (nblks < 2) {                                  /* Must have at least 2 blocks per partition 
 122               	.LM5:
 123 0026 4230      		cpi r20,lo8(2)
 124 0028 5105      		cpc r21,__zero_reg__
 125 002a 6105      		cpc r22,__zero_reg__
 126 002c 7105      		cpc r23,__zero_reg__
 127 002e 20F4      		brsh .L3
  68:OSsrc/os_mem.c ****         *err = OS_MEM_INVALID_BLKS;
 129               	.LM6:
 130 0030 8FE6      		ldi r24,lo8(111)
 131 0032 F701      		movw r30,r14
 132 0034 8083      		st Z,r24
 133 0036 08C0      		rjmp .L15
 134               	.L3:
  69:OSsrc/os_mem.c ****         return ((OS_MEM *)0);
  70:OSsrc/os_mem.c ****     }
  71:OSsrc/os_mem.c ****     if (blksize < sizeof(void *)) {                   /* Must contain space for at least a pointer 
 136               	.LM7:
 137 0038 0230      		cpi r16,lo8(2)
 138 003a 1105      		cpc r17,__zero_reg__
 139 003c 2105      		cpc r18,__zero_reg__
 140 003e 3105      		cpc r19,__zero_reg__
 141 0040 30F4      		brsh .L4
  72:OSsrc/os_mem.c ****         *err = OS_MEM_INVALID_SIZE;
 143               	.LM8:
 144 0042 80E7      		ldi r24,lo8(112)
 145 0044 D701      		movw r26,r14
 146 0046 8C93      		st X,r24
 147               	.L15:
  73:OSsrc/os_mem.c ****         return ((OS_MEM *)0);
 149               	.LM9:
 150 0048 80E0      		ldi r24,lo8(0)
 151 004a 90E0      		ldi r25,hi8(0)
 152 004c 3CC0      		rjmp .L1
 153               	.L4:
  74:OSsrc/os_mem.c ****     }
  75:OSsrc/os_mem.c **** #endif
  76:OSsrc/os_mem.c ****     OS_ENTER_CRITICAL();
 155               	.LM10:
 156               	/* #APP */
 157 004e 0FB6      		in __tmp_reg__,__SREG__
 158 0050 F894      		cli
 159 0052 0F92      		push __tmp_reg__
  77:OSsrc/os_mem.c ****     pmem = OSMemFreeList;                             /* Get next free memory partition            
 161               	.LM11:
 162               	/* #NOAPP */
 163 0054 E091 0000 		lds r30,OSMemFreeList
 164 0058 F091 0000 		lds r31,(OSMemFreeList)+1
  78:OSsrc/os_mem.c ****     if (OSMemFreeList != (OS_MEM *)0) {               /* See if pool of free partitions was empty  
 166               	.LM12:
 167 005c 3097      		sbiw r30,0
 168 005e 31F0      		breq .L5
  79:OSsrc/os_mem.c ****         OSMemFreeList = (OS_MEM *)OSMemFreeList->OSMemFreeList;
 170               	.LM13:
 171 0060 8281      		ldd r24,Z+2
 172 0062 9381      		ldd r25,Z+3
 173 0064 9093 0000 		sts (OSMemFreeList)+1,r25
 174 0068 8093 0000 		sts OSMemFreeList,r24
 175               	.L5:
  80:OSsrc/os_mem.c ****     }
  81:OSsrc/os_mem.c ****     OS_EXIT_CRITICAL();
 177               	.LM14:
 178               	/* #APP */
 179 006c 0F90      		pop __tmp_reg__
 180 006e 0FBE      		out __SREG__,__tmp_reg__
  82:OSsrc/os_mem.c ****     if (pmem == (OS_MEM *)0) {                        /* See if we have a memory partition         
 182               	.LM15:
 183               	/* #NOAPP */
 184 0070 3097      		sbiw r30,0
 185 0072 21F4      		brne .L6
  83:OSsrc/os_mem.c ****         *err = OS_MEM_INVALID_PART;
 187               	.LM16:
 188 0074 8EE6      		ldi r24,lo8(110)
 189 0076 D501      		movw r26,r10
 190 0078 8C93      		st X,r24
 191 007a 24C0      		rjmp .L14
 192               	.L6:
  84:OSsrc/os_mem.c ****         return ((OS_MEM *)0);
  85:OSsrc/os_mem.c ****     }
  86:OSsrc/os_mem.c ****     plink = (void **)addr;                            /* Create linked list of free memory blocks  
 194               	.LM17:
 195 007c E601      		movw r28,r12
  87:OSsrc/os_mem.c ****     pblk  = (INT8U *)((INT32U)addr + blksize);
 197               	.LM18:
 198 007e 7601      		movw r14,r12
 199 0080 E00E      		add r14,r16
 200 0082 F11E      		adc r15,r17
  88:OSsrc/os_mem.c ****     for (i = 0; i < (nblks - 1); i++) {
 202               	.LM19:
 203 0084 DB01      		movw r26,r22
 204 0086 CA01      		movw r24,r20
 205               	.L13:
 206 0088 0197      		sbiw r24,1
 207 008a A109      		sbc r26,__zero_reg__
 208 008c B109      		sbc r27,__zero_reg__
 209 008e 31F0      		breq .L12
  89:OSsrc/os_mem.c ****        *plink = (void *)pblk;                         /* Save pointer to NEXT block in CURRENT bloc
 211               	.LM20:
 212 0090 E882      		st Y,r14
 213 0092 F982      		std Y+1,r15
  90:OSsrc/os_mem.c ****         plink = (void **)pblk;                        /* Position to  NEXT      block              
 215               	.LM21:
 216 0094 E701      		movw r28,r14
  91:OSsrc/os_mem.c ****         pblk  = (INT8U *)((INT32U)pblk + blksize);    /* Point to the FOLLOWING block              
 218               	.LM22:
 219 0096 E00E      		add r14,r16
 220 0098 F11E      		adc r15,r17
 221 009a F6CF      		rjmp .L13
 222               	.L12:
  92:OSsrc/os_mem.c ****     }
  93:OSsrc/os_mem.c ****     *plink              = (void *)0;                  /* Last memory block points to NULL          
 224               	.LM23:
 225 009c 1882      		st Y,__zero_reg__
 226 009e 1982      		std Y+1,__zero_reg__
  94:OSsrc/os_mem.c ****     pmem->OSMemAddr     = addr;                       /* Store start address of memory partition   
 228               	.LM24:
 229 00a0 C082      		st Z,r12
 230 00a2 D182      		std Z+1,r13
  95:OSsrc/os_mem.c ****     pmem->OSMemFreeList = addr;                       /* Initialize pointer to pool of free blocks 
 232               	.LM25:
 233 00a4 C282      		std Z+2,r12
 234 00a6 D382      		std Z+3,r13
  96:OSsrc/os_mem.c ****     pmem->OSMemNFree    = nblks;                      /* Store number of free blocks in MCB        
 236               	.LM26:
 237 00a8 4487      		std Z+12,r20
 238 00aa 5587      		std Z+13,r21
 239 00ac 6687      		std Z+14,r22
 240 00ae 7787      		std Z+15,r23
  97:OSsrc/os_mem.c ****     pmem->OSMemNBlks    = nblks;
 242               	.LM27:
 243 00b0 4087      		std Z+8,r20
 244 00b2 5187      		std Z+9,r21
 245 00b4 6287      		std Z+10,r22
 246 00b6 7387      		std Z+11,r23
  98:OSsrc/os_mem.c ****     pmem->OSMemBlkSize  = blksize;                    /* Store block size of each memory blocks    
 248               	.LM28:
 249 00b8 0483      		std Z+4,r16
 250 00ba 1583      		std Z+5,r17
 251 00bc 2683      		std Z+6,r18
 252 00be 3783      		std Z+7,r19
  99:OSsrc/os_mem.c ****     *err                = OS_NO_ERR;
 254               	.LM29:
 255 00c0 D501      		movw r26,r10
 256 00c2 1C92      		st X,__zero_reg__
 257               	.L14:
 100:OSsrc/os_mem.c ****     return (pmem);
 259               	.LM30:
 260 00c4 CF01      		movw r24,r30
 261               	.L1:
 262               	/* epilogue: frame size=0 */
 263 00c6 DF91      		pop r29
 264 00c8 CF91      		pop r28
 265 00ca 1F91      		pop r17
 266 00cc 0F91      		pop r16
 267 00ce FF90      		pop r15
 268 00d0 EF90      		pop r14
 269 00d2 DF90      		pop r13
 270 00d4 CF90      		pop r12
 271 00d6 BF90      		pop r11
 272 00d8 AF90      		pop r10
 273 00da 0895      		ret
 274               	/* epilogue end (size=11) */

⌨️ 快捷键说明

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