os_mem.txt
来自「uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的」· 文本 代码 · 共 369 行 · 第 1/2 页
TXT
369 行
000154 e5c50000 STRB r0,[r5,#0] ;144
000158 e3a00000 MOV r0,#0 ;145
00015c eaffffea B |L1.268|
;;;147 /*$PAGE*/
ENDP
OSMemPut PROC
;;;166 INT8U OSMemPut (OS_MEM *pmem, void *pblk)
;;;167 {
000160 e92d4070 PUSH {r4-r6,lr}
000164 e1a04000 MOV r4,r0
000168 e1a05001 MOV r5,r1
;;;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 */
00016c e3540000 CMP r4,#0
000170 1a000002 BNE |L1.384|
;;;175 return (OS_MEM_INVALID_PMEM);
000174 e3a00074 MOV r0,#0x74
|L1.376|
000178 e8bd4070 POP {r4-r6,lr}
;;;176 }
;;;177 if (pblk == (void *)0) { /* Must release a valid block */
;;;178 return (OS_MEM_INVALID_PBLK);
;;;179 }
;;;180 #endif
;;;181 OS_ENTER_CRITICAL();
;;;182 if (pmem->OSMemNFree >= pmem->OSMemNBlks) { /* Make sure all blocks not already returned */
;;;183 OS_EXIT_CRITICAL();
;;;184 return (OS_MEM_FULL);
;;;185 }
;;;186 *(void **)pblk = pmem->OSMemFreeList; /* Insert released block into free block list */
;;;187 pmem->OSMemFreeList = pblk;
;;;188 pmem->OSMemNFree++; /* One more memory block in this partition */
;;;189 OS_EXIT_CRITICAL();
;;;190 return (OS_NO_ERR); /* Notify caller that memory block was released */
;;;191 }
00017c e12fff1e BX lr
|L1.384|
000180 e3550000 CMP r5,#0 ;177
000184 1a000001 BNE |L1.400|
000188 e3a00073 MOV r0,#0x73 ;178
00018c eafffff9 B |L1.376|
|L1.400|
000190 ef000002 SVC #0x2 ;181
000194 e5940010 LDR r0,[r4,#0x10] ;182
000198 e594100c LDR r1,[r4,#0xc] ;182
00019c e1500001 CMP r0,r1 ;182
0001a0 3a000002 BCC |L1.432|
0001a4 ef000003 SVC #0x3 ;183
0001a8 e3a00072 MOV r0,#0x72 ;184
0001ac eafffff1 B |L1.376|
|L1.432|
0001b0 e5940004 LDR r0,[r4,#4] ;186
0001b4 e5850000 STR r0,[r5,#0] ;186
0001b8 e5845004 STR r5,[r4,#4] ;187
0001bc e5940010 LDR r0,[r4,#0x10] ;188
0001c0 e2800001 ADD r0,r0,#1 ;188
0001c4 e5840010 STR r0,[r4,#0x10] ;188
0001c8 ef000003 SVC #0x3 ;189
0001cc e3a00000 MOV r0,#0 ;190
0001d0 eaffffe8 B |L1.376|
;;;192 /*$PAGE*/
ENDP
OSMemQuery PROC
;;;212 INT8U OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *pdata)
;;;213 {
0001d4 e92d4070 PUSH {r4-r6,lr}
0001d8 e1a05000 MOV r5,r0
0001dc e1a04001 MOV r4,r1
;;;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 */
0001e0 e3550000 CMP r5,#0
0001e4 1a000002 BNE |L1.500|
;;;221 return (OS_MEM_INVALID_PMEM);
0001e8 e3a00074 MOV r0,#0x74
|L1.492|
0001ec e8bd4070 POP {r4-r6,lr}
;;;222 }
;;;223 if (pdata == (OS_MEM_DATA *)0) { /* Must release a valid storage area for the data */
;;;224 return (OS_MEM_INVALID_PDATA);
;;;225 }
;;;226 #endif
;;;227 OS_ENTER_CRITICAL();
;;;228 pdata->OSAddr = pmem->OSMemAddr;
;;;229 pdata->OSFreeList = pmem->OSMemFreeList;
;;;230 pdata->OSBlkSize = pmem->OSMemBlkSize;
;;;231 pdata->OSNBlks = pmem->OSMemNBlks;
;;;232 pdata->OSNFree = pmem->OSMemNFree;
;;;233 OS_EXIT_CRITICAL();
;;;234 pdata->OSNUsed = pdata->OSNBlks - pdata->OSNFree;
;;;235 return (OS_NO_ERR);
;;;236 }
0001f0 e12fff1e BX lr
|L1.500|
0001f4 e3540000 CMP r4,#0 ;223
0001f8 1a000001 BNE |L1.516|
0001fc e3a00075 MOV r0,#0x75 ;224
000200 eafffff9 B |L1.492|
|L1.516|
000204 ef000002 SVC #0x2 ;227
000208 e5950000 LDR r0,[r5,#0] ;228
00020c e5840000 STR r0,[r4,#0] ;228
000210 e5950004 LDR r0,[r5,#4] ;229
000214 e5840004 STR r0,[r4,#4] ;229
000218 e5950008 LDR r0,[r5,#8] ;230
00021c e5840008 STR r0,[r4,#8] ;230
000220 e595000c LDR r0,[r5,#0xc] ;231
000224 e584000c STR r0,[r4,#0xc] ;231
000228 e5950010 LDR r0,[r5,#0x10] ;232
00022c e5840010 STR r0,[r4,#0x10] ;232
000230 ef000003 SVC #0x3 ;233
000234 e284100c ADD r1,r4,#0xc ;234
000238 e8910003 LDM r1,{r0,r1} ;234
00023c e0400001 SUB r0,r0,r1 ;234
000240 e5840014 STR r0,[r4,#0x14] ;234
000244 e3a00000 MOV r0,#0 ;235
000248 eaffffe7 B |L1.492|
;;;237 #endif /* OS_MEM_QUERY_EN */
ENDP
OS_MemInit PROC
;;;269
;;;270 pmem = (OS_MEM *)&OSMemTbl[0]; /* Point to memory control block (MCB) */
00024c e59f005c LDR r0,|L1.688|
;;;271 for (i = 0; i < (OS_MAX_MEM_PART - 1); i++) { /* Init. list of free memory partitions */
000250 e3a01000 MOV r1,#0
000254 e59f3054 LDR r3,|L1.688|
000258 e3a02000 MOV r2,#0
|L1.604|
;;;272 pmem->OSMemFreeList = (void *)&OSMemTbl[i+1]; /* Chain list of free partitions */
00025c e2811001 ADD r1,r1,#1
000260 e081c101 ADD r12,r1,r1,LSL #2
000264 e083c10c ADD r12,r3,r12,LSL #2
000268 e580c004 STR r12,[r0,#4]
;;;273 pmem->OSMemAddr = (void *)0; /* Store start address of memory partition */
00026c e5802000 STR r2,[r0,#0]
;;;274 pmem->OSMemNFree = 0; /* No free blocks */
000270 e5802010 STR r2,[r0,#0x10]
;;;275 pmem->OSMemNBlks = 0; /* No blocks */
000274 e580200c STR r2,[r0,#0xc]
;;;276 pmem->OSMemBlkSize = 0; /* Zero size */
000278 e5802008 STR r2,[r0,#8]
;;;277 pmem++;
00027c e2800014 ADD r0,r0,#0x14
000280 e3c11801 BIC r1,r1,#0x10000 ;271
000284 e3510004 CMP r1,#4 ;271
000288 3afffff3 BCC |L1.604|
;;;278 }
;;;279 pmem->OSMemFreeList = (void *)0; /* Initialize last node */
00028c e5802004 STR r2,[r0,#4]
;;;280 pmem->OSMemAddr = (void *)0; /* Store start address of memory partition */
000290 e5802000 STR r2,[r0,#0]
;;;281 pmem->OSMemNFree = 0; /* No free blocks */
000294 e5802010 STR r2,[r0,#0x10]
;;;282 pmem->OSMemNBlks = 0; /* No blocks */
000298 e580200c STR r2,[r0,#0xc]
;;;283 pmem->OSMemBlkSize = 0; /* Zero size */
00029c e5802008 STR r2,[r0,#8]
;;;284
;;;285 OSMemFreeList = (OS_MEM *)&OSMemTbl[0]; /* Point to beginning of free list */
0002a0 e59f0004 LDR r0,|L1.684|
0002a4 e5803000 STR r3,[r0,#0] ; OSMemFreeList
;;;286 #endif
;;;287 }
0002a8 e12fff1e BX lr
;;;288 #endif /* OS_MEM_EN */
ENDP
|L1.684|
0002ac 00000000 DCD OSMemFreeList
|L1.688|
0002b0 00000000 DCD OSMemTbl
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?