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 + -
显示快捷键?