📄 os_mem.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 903] for uVision
; commandline ArmCC [--debug -c --asm --interleave -oos_mem.o --depend=os_mem.d --device=DARMP --apcs=interwork -I. -I..\BSP -I..\..\..\..\..\uCOS-II\Ports\ARM\Generic\RVMDK -I..\..\..\..\..\uCOS-II\Source -I..\..\..\..\..\uC-CPU -I..\..\..\..\..\uC-CPU\ARM\RVMDK -I..\..\..\..\..\uC-LIB -I..\..\..\..\..\uCOSView\Source -I..\..\..\..\..\uCOSView\Ports\ARM7\LPC2468\IAR -Id:\Keil\ARM\INC\Philips ..\..\..\..\..\uCOS-II\Source\os_mem.c]
ARM
AREA ||.text||, CODE, READONLY, ALIGN=2
OSMemCreate PROC
;;;59 OS_MEM *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err)
;;;60 {
000000 e92d4ff8 PUSH {r3-r11,lr}
000004 e1a04000 MOV r4,r0
000008 e1a05001 MOV r5,r1
00000c e1a06002 MOV r6,r2
000010 e1a07003 MOV r7,r3
;;;61 OS_MEM *pmem;
;;;62 INT8U *pblk;
;;;63 void **plink;
;;;64 INT32U i;
;;;65 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;66 OS_CPU_SR cpu_sr = 0;
000014 e3a00000 MOV r0,#0
000018 e58d0000 STR r0,[sp,#0]
;;;67 #endif
;;;68
;;;69
;;;70
;;;71 #if OS_ARG_CHK_EN > 0
;;;72 if (err == (INT8U *)0) { /* Validate 'err' */
00001c e3570000 CMP r7,#0
000020 1a000002 BNE |L1.48|
;;;73 return ((OS_MEM *)0);
000024 e3a00000 MOV r0,#0
|L1.40|
000028 e8bd4ff8 POP {r3-r11,lr}
;;;74 }
;;;75 if (addr == (void *)0) { /* Must pass a valid address for the memory part.*/
;;;76 *err = OS_ERR_MEM_INVALID_ADDR;
;;;77 return ((OS_MEM *)0);
;;;78 }
;;;79 if (((INT32U)addr & (sizeof(void *) - 1)) != 0){ /* Must be pointer size aligned */
;;;80 *err = OS_ERR_MEM_INVALID_ADDR;
;;;81 return ((OS_MEM *)0);
;;;82 }
;;;83 if (nblks < 2) { /* Must have at least 2 blocks per partition */
;;;84 *err = OS_ERR_MEM_INVALID_BLKS;
;;;85 return ((OS_MEM *)0);
;;;86 }
;;;87 if (blksize < sizeof(void *)) { /* Must contain space for at least a pointer */
;;;88 *err = OS_ERR_MEM_INVALID_SIZE;
;;;89 return ((OS_MEM *)0);
;;;90 }
;;;91 if ((blksize % sizeof(void *)) != 0) { /* Must contain space for an integral number ... */
;;;92 *err = OS_ERR_MEM_INVALID_SIZE; /* ... of pointer sized items */
;;;93 return ((OS_MEM *)0);
;;;94 }
;;;95 #endif
;;;96 OS_ENTER_CRITICAL();
;;;97 pmem = OSMemFreeList; /* Get next free memory partition */
;;;98 if (OSMemFreeList != (OS_MEM *)0) { /* See if pool of free partitions was empty */
;;;99 OSMemFreeList = (OS_MEM *)OSMemFreeList->OSMemFreeList;
;;;100 }
;;;101 OS_EXIT_CRITICAL();
;;;102 if (pmem == (OS_MEM *)0) { /* See if we have a memory partition */
;;;103 *err = OS_ERR_MEM_INVALID_PART;
;;;104 return ((OS_MEM *)0);
;;;105 }
;;;106 plink = (void **)addr; /* Create linked list of free memory blocks */
;;;107 pblk = (INT8U *)((INT32U)addr + blksize);
;;;108 for (i = 0; i < (nblks - 1); i++) {
;;;109 *plink = (void *)pblk; /* Save pointer to NEXT block in CURRENT block */
;;;110 plink = (void **)pblk; /* Position to NEXT block */
;;;111 pblk = (INT8U *)((INT32U)pblk + blksize); /* Point to the FOLLOWING block */
;;;112 }
;;;113 *plink = (void *)0; /* Last memory block points to NULL */
;;;114 pmem->OSMemAddr = addr; /* Store start address of memory partition */
;;;115 pmem->OSMemFreeList = addr; /* Initialize pointer to pool of free blocks */
;;;116 pmem->OSMemNFree = nblks; /* Store number of free blocks in MCB */
;;;117 pmem->OSMemNBlks = nblks;
;;;118 pmem->OSMemBlkSize = blksize; /* Store block size of each memory blocks */
;;;119 *err = OS_ERR_NONE;
;;;120 return (pmem);
;;;121 }
00002c e12fff1e BX lr
|L1.48|
000030 e3540000 CMP r4,#0
000034 1a000003 BNE |L1.72|
000038 e3a00062 MOV r0,#0x62
00003c e5c70000 STRB r0,[r7,#0]
000040 e3a00000 MOV r0,#0
000044 eafffff7 B |L1.40|
|L1.72|
000048 e3140003 TST r4,#3
00004c 0a000003 BEQ |L1.96|
000050 e3a00062 MOV r0,#0x62
000054 e5c70000 STRB r0,[r7,#0]
000058 e3a00000 MOV r0,#0
00005c eafffff1 B |L1.40|
|L1.96|
000060 e3550002 CMP r5,#2
000064 2a000003 BCS |L1.120|
000068 e3a0005b MOV r0,#0x5b
00006c e5c70000 STRB r0,[r7,#0]
000070 e3a00000 MOV r0,#0
000074 eaffffeb B |L1.40|
|L1.120|
000078 e3560004 CMP r6,#4
00007c 2a000003 BCS |L1.144|
000080 e3a0005c MOV r0,#0x5c
000084 e5c70000 STRB r0,[r7,#0]
000088 e3a00000 MOV r0,#0
00008c eaffffe5 B |L1.40|
|L1.144|
000090 e3160003 TST r6,#3
000094 0a000003 BEQ |L1.168|
000098 e3a0005c MOV r0,#0x5c
00009c e5c70000 STRB r0,[r7,#0]
0000a0 e3a00000 MOV r0,#0
0000a4 eaffffdf B |L1.40|
|L1.168|
0000a8 ebfffffe BL OS_CPU_SR_Save
0000ac e58d0000 STR r0,[sp,#0]
0000b0 e59f0408 LDR r0,|L1.1216|
0000b4 e5908000 LDR r8,[r0,#0] ; OSMemFreeList
0000b8 e5900000 LDR r0,[r0,#0] ; OSMemFreeList
0000bc e3500000 CMP r0,#0
0000c0 0a000004 BEQ |L1.216|
0000c4 e59f03f4 LDR r0,|L1.1216|
0000c8 e5900000 LDR r0,[r0,#0] ; OSMemFreeList
0000cc e5900004 LDR r0,[r0,#4]
0000d0 e59f13e8 LDR r1,|L1.1216|
0000d4 e5810000 STR r0,[r1,#0] ; OSMemFreeList
|L1.216|
0000d8 e59d0000 LDR r0,[sp,#0]
0000dc ebfffffe BL OS_CPU_SR_Restore
0000e0 e3580000 CMP r8,#0
0000e4 1a000003 BNE |L1.248|
0000e8 e3a0005a MOV r0,#0x5a
0000ec e5c70000 STRB r0,[r7,#0]
0000f0 e3a00000 MOV r0,#0
0000f4 eaffffcb B |L1.40|
|L1.248|
0000f8 e1a0a004 MOV r10,r4
0000fc e0849006 ADD r9,r4,r6
000100 e3a0b000 MOV r11,#0
000104 ea000003 B |L1.280|
|L1.264|
000108 e58a9000 STR r9,[r10,#0]
00010c e1a0a009 MOV r10,r9
000110 e0899006 ADD r9,r9,r6
000114 e28bb001 ADD r11,r11,#1
|L1.280|
000118 e2450001 SUB r0,r5,#1
00011c e150000b CMP r0,r11
000120 8afffff8 BHI |L1.264|
000124 e3a00000 MOV r0,#0
000128 e58a0000 STR r0,[r10,#0]
00012c e5884000 STR r4,[r8,#0]
000130 e5884004 STR r4,[r8,#4]
000134 e5885010 STR r5,[r8,#0x10]
000138 e588500c STR r5,[r8,#0xc]
00013c e5886008 STR r6,[r8,#8]
000140 e5c70000 STRB r0,[r7,#0]
000144 e1a00008 MOV r0,r8
000148 eaffffb6 B |L1.40|
ENDP
OSMemGet PROC
;;;143 void *OSMemGet (OS_MEM *pmem, INT8U *err)
;;;144 {
00014c e92d41f0 PUSH {r4-r8,lr}
000150 e1a04000 MOV r4,r0
000154 e1a05001 MOV r5,r1
;;;145 void *pblk;
;;;146 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;147 OS_CPU_SR cpu_sr = 0;
000158 e3a07000 MOV r7,#0
;;;148 #endif
;;;149
;;;150
;;;151
;;;152 #if OS_ARG_CHK_EN > 0
;;;153 if (err == (INT8U *)0) { /* Validate 'err' */
00015c e3550000 CMP r5,#0
000160 1a000002 BNE |L1.368|
;;;154 return ((void *)0);
000164 e3a00000 MOV r0,#0
|L1.360|
000168 e8bd41f0 POP {r4-r8,lr}
;;;155 }
;;;156 if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition */
;;;157 *err = OS_ERR_MEM_INVALID_PMEM;
;;;158 return ((void *)0);
;;;159 }
;;;160 #endif
;;;161 OS_ENTER_CRITICAL();
;;;162 if (pmem->OSMemNFree > 0) { /* See if there are any free memory blocks */
;;;163 pblk = pmem->OSMemFreeList; /* Yes, point to next free memory block */
;;;164 pmem->OSMemFreeList = *(void **)pblk; /* Adjust pointer to new free list */
;;;165 pmem->OSMemNFree--; /* One less memory block in this partition */
;;;166 OS_EXIT_CRITICAL();
;;;167 *err = OS_ERR_NONE; /* No error */
;;;168 return (pblk); /* Return memory block to caller */
;;;169 }
;;;170 OS_EXIT_CRITICAL();
;;;171 *err = OS_ERR_MEM_NO_FREE_BLKS; /* No, Notify caller of empty memory partition */
;;;172 return ((void *)0); /* Return NULL pointer to caller */
;;;173 }
00016c e12fff1e BX lr
|L1.368|
000170 e3540000 CMP r4,#0
000174 1a000003 BNE |L1.392|
000178 e3a00060 MOV r0,#0x60
00017c e5c50000 STRB r0,[r5,#0]
000180 e3a00000 MOV r0,#0
000184 eafffff7 B |L1.360|
|L1.392|
000188 ebfffffe BL OS_CPU_SR_Save
00018c e1a07000 MOV r7,r0
000190 e5940010 LDR r0,[r4,#0x10]
000194 e3500000 CMP r0,#0
000198 0a00000b BEQ |L1.460|
00019c e5946004 LDR r6,[r4,#4]
0001a0 e5960000 LDR r0,[r6,#0]
0001a4 e5840004 STR r0,[r4,#4]
0001a8 e5940010 LDR r0,[r4,#0x10]
0001ac e2400001 SUB r0,r0,#1
0001b0 e5840010 STR r0,[r4,#0x10]
0001b4 e1a00007 MOV r0,r7
0001b8 ebfffffe BL OS_CPU_SR_Restore
0001bc e3a00000 MOV r0,#0
0001c0 e5c50000 STRB r0,[r5,#0]
0001c4 e1a00006 MOV r0,r6
0001c8 eaffffe6 B |L1.360|
|L1.460|
0001cc e1a00007 MOV r0,r7
0001d0 ebfffffe BL OS_CPU_SR_Restore
0001d4 e3a0005d MOV r0,#0x5d
0001d8 e5c50000 STRB r0,[r5,#0]
0001dc e3a00000 MOV r0,#0
0001e0 eaffffe0 B |L1.360|
ENDP
OSMemNameGet PROC
;;;196 INT8U OSMemNameGet (OS_MEM *pmem, INT8U *pname, INT8U *err)
;;;197 {
0001e4 e92d41f0 PUSH {r4-r8,lr}
0001e8 e1a04000 MOV r4,r0
0001ec e1a05001 MOV r5,r1
0001f0 e1a06002 MOV r6,r2
;;;198 INT8U len;
;;;199 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;200 OS_CPU_SR cpu_sr = 0;
0001f4 e3a07000 MOV r7,#0
;;;201 #endif
;;;202
;;;203
;;;204
;;;205 OS_ENTER_CRITICAL();
0001f8 ebfffffe BL OS_CPU_SR_Save
0001fc e1a07000 MOV r7,r0
;;;206 #if OS_ARG_CHK_EN > 0
;;;207 if (err == (INT8U *)0) { /* Validate 'err' */
000200 e3560000 CMP r6,#0
000204 1a000004 BNE |L1.540|
;;;208 OS_EXIT_CRITICAL();
000208 e1a00007 MOV r0,r7
00020c ebfffffe BL OS_CPU_SR_Restore
;;;209 return (0);
000210 e3a00000 MOV r0,#0
|L1.532|
000214 e8bd41f0 POP {r4-r8,lr}
;;;210 }
;;;211 if (pmem == (OS_MEM *)0) { /* Is 'pmem' a NULL pointer? */
;;;212 OS_EXIT_CRITICAL(); /* Yes */
;;;213 *err = OS_ERR_MEM_INVALID_PMEM;
;;;214 return (0);
;;;215 }
;;;216 if (pname == (INT8U *)0) { /* Is 'pname' a NULL pointer? */
;;;217 OS_EXIT_CRITICAL(); /* Yes */
;;;218 *err = OS_ERR_PNAME_NULL;
;;;219 return (0);
;;;220 }
;;;221 #endif
;;;222 len = OS_StrCopy(pname, pmem->OSMemName); /* Copy name from OS_MEM */
;;;223 OS_EXIT_CRITICAL();
;;;224 *err = OS_ERR_NONE;
;;;225 return (len);
;;;226 }
000218 e12fff1e BX lr
|L1.540|
00021c e3540000 CMP r4,#0
000220 1a000005 BNE |L1.572|
000224 e1a00007 MOV r0,r7
000228 ebfffffe BL OS_CPU_SR_Restore
00022c e3a00060 MOV r0,#0x60
000230 e5c60000 STRB r0,[r6,#0]
000234 e3a00000 MOV r0,#0
000238 eafffff5 B |L1.532|
|L1.572|
00023c e3550000 CMP r5,#0
000240 1a000005 BNE |L1.604|
000244 e1a00007 MOV r0,r7
000248 ebfffffe BL OS_CPU_SR_Restore
00024c e3a0000c MOV r0,#0xc
000250 e5c60000 STRB r0,[r6,#0]
000254 e3a00000 MOV r0,#0
000258 eaffffed B |L1.532|
|L1.604|
00025c e2841014 ADD r1,r4,#0x14
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -