📄 os_mem.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 951] for uVision
; commandline ArmCC [--debug -c --asm --interleave -oos_mem.o --device=DARMP --apcs=interwork -O0 -IC:\Keil\ARM\INC\Philips uCosii\OS_MEM.C]
ARM
AREA ||.text.7||, CODE, READONLY, ALIGN=2
OSMemCreate PROC
;;;48 OS_MEM *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err)
;;;49 {
000000 e92d5ff0 PUSH {r4-r12,lr}
000004 e1a06000 MOV r6,r0
000008 e1a07001 MOV r7,r1
00000c e1a08002 MOV r8,r2
000010 e1a09003 MOV r9,r3
;;;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. */
000014 e3560000 CMP r6,#0
000018 1a000004 BNE |L1.48|
;;;61 *err = OS_MEM_INVALID_ADDR;
00001c e3a00076 MOV r0,#0x76
000020 e5c90000 STRB r0,[r9,#0]
;;;62 return ((OS_MEM *)0);
000024 e3a00000 MOV r0,#0
|L1.40|
000028 e8bd5ff0 POP {r4-r12,lr}
;;;63 }
;;;64 if (nblks < 2) { /* Must have at least 2 blocks per partition */
;;;65 *err = OS_MEM_INVALID_BLKS;
;;;66 return ((OS_MEM *)0);
;;;67 }
;;;68 if (blksize < sizeof(void *)) { /* Must contain space for at least a pointer */
;;;69 *err = OS_MEM_INVALID_SIZE;
;;;70 return ((OS_MEM *)0);
;;;71 }
;;;72 #endif
;;;73 OS_ENTER_CRITICAL();
;;;74 pmem = OSMemFreeList; /* Get next free memory partition */
;;;75 if (OSMemFreeList != (OS_MEM *)0) { /* See if pool of free partitions was empty */
;;;76 OSMemFreeList = (OS_MEM *)OSMemFreeList->OSMemFreeList;
;;;77 }
;;;78 OS_EXIT_CRITICAL();
;;;79 if (pmem == (OS_MEM *)0) { /* See if we have a memory partition */
;;;80 *err = OS_MEM_INVALID_PART;
;;;81 return ((OS_MEM *)0);
;;;82 }
;;;83 plink = (void **)addr; /* Create linked list of free memory blocks */
;;;84 pblk = (INT8U *)addr + blksize;
;;;85 for (i = 0; i < (nblks - 1); i++) {
;;;86 *plink = (void *)pblk;
;;;87 plink = (void **)pblk;
;;;88 pblk = pblk + blksize;
;;;89 }
;;;90 *plink = (void *)0; /* Last memory block points to NULL */
;;;91 pmem->OSMemAddr = addr; /* Store start address of memory partition */
;;;92 pmem->OSMemFreeList = addr; /* Initialize pointer to pool of free blocks */
;;;93 pmem->OSMemNFree = nblks; /* Store number of free blocks in MCB */
;;;94 pmem->OSMemNBlks = nblks;
;;;95 pmem->OSMemBlkSize = blksize; /* Store block size of each memory blocks */
;;;96 *err = OS_NO_ERR;
;;;97 return (pmem);
;;;98 }
00002c e12fff1e BX lr
|L1.48|
000030 e3570002 CMP r7,#2 ;64
000034 2a000003 BCS |L1.72| ;64
000038 e3a0006f MOV r0,#0x6f ;65
00003c e5c90000 STRB r0,[r9,#0] ;65
000040 e3a00000 MOV r0,#0 ;66
000044 eafffff7 B |L1.40| ;66
|L1.72|
000048 e3580004 CMP r8,#4 ;68
00004c 2a000003 BCS |L1.96| ;68
000050 e3a00070 MOV r0,#0x70 ;69
000054 e5c90000 STRB r0,[r9,#0] ;69
000058 e3a00000 MOV r0,#0 ;70
00005c eafffff1 B |L1.40| ;70
|L1.96|
000060 ef000002 SVC 0x2 ; formerly SWI ;73
000064 e59f0268 LDR r0,|L1.724| ;74
000068 e590a000 LDR r10,[r0,#0] ;74 ; OSMemFreeList
00006c e5900000 LDR r0,[r0,#0] ;75 ; OSMemFreeList
000070 e3500000 CMP r0,#0 ;75
000074 0a000004 BEQ |L1.140| ;75
000078 e59f0254 LDR r0,|L1.724| ;76
00007c e5900000 LDR r0,[r0,#0] ;76 ; OSMemFreeList
000080 e5900004 LDR r0,[r0,#4] ;76
000084 e59f1248 LDR r1,|L1.724| ;76
000088 e5810000 STR r0,[r1,#0] ;76 ; OSMemFreeList
|L1.140|
00008c ef000003 SVC 0x3 ; formerly SWI ;78
000090 e35a0000 CMP r10,#0 ;79
000094 1a000003 BNE |L1.168| ;79
000098 e3a0006e MOV r0,#0x6e ;80
00009c e5c90000 STRB r0,[r9,#0] ;80
0000a0 e3a00000 MOV r0,#0 ;81
0000a4 eaffffdf B |L1.40| ;81
|L1.168|
0000a8 e1a05006 MOV r5,r6 ;83
0000ac e1a05006 MOV r5,r6 ;84
0000b0 e0864008 ADD r4,r6,r8 ;84
0000b4 e3a0b000 MOV r11,#0 ;85
0000b8 ea000003 B |L1.204| ;85
|L1.188|
0000bc e5854000 STR r4,[r5,#0] ;86
0000c0 e1a05004 MOV r5,r4 ;87
0000c4 e0844008 ADD r4,r4,r8 ;88
0000c8 e28bb001 ADD r11,r11,#1 ;85
|L1.204|
0000cc e2470001 SUB r0,r7,#1 ;85
0000d0 e150000b CMP r0,r11 ;85
0000d4 8afffff8 BHI |L1.188| ;85
0000d8 e3a00000 MOV r0,#0 ;90
0000dc e5850000 STR r0,[r5,#0] ;90
0000e0 e58a6000 STR r6,[r10,#0] ;91
0000e4 e58a6004 STR r6,[r10,#4] ;92
0000e8 e58a7010 STR r7,[r10,#0x10] ;93
0000ec e58a700c STR r7,[r10,#0xc] ;94
0000f0 e58a8008 STR r8,[r10,#8] ;95
0000f4 e5c90000 STRB r0,[r9,#0] ;96
0000f8 e1a0000a MOV r0,r10 ;97
0000fc eaffffc9 B |L1.40| ;97
ENDP
OSMemGet PROC
;;;120 void *OSMemGet (OS_MEM *pmem, INT8U *err)
;;;121 {
000100 e92d4070 PUSH {r4-r6,lr}
000104 e1a04000 MOV r4,r0
000108 e1a06001 MOV r6,r1
;;;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 */
00010c e3540000 CMP r4,#0
000110 1a000004 BNE |L1.296|
;;;130 *err = OS_MEM_INVALID_PMEM;
000114 e3a00074 MOV r0,#0x74
000118 e5c60000 STRB r0,[r6,#0]
;;;131 return ((OS_MEM *)0);
00011c e3a00000 MOV r0,#0
|L1.288|
000120 e8bd4070 POP {r4-r6,lr}
;;;132 }
;;;133 #endif
;;;134 OS_ENTER_CRITICAL();
;;;135 if (pmem->OSMemNFree > 0) { /* See if there are any free memory blocks */
;;;136 pblk = pmem->OSMemFreeList; /* Yes, point to next free memory block */
;;;137 pmem->OSMemFreeList = *(void **)pblk; /* Adjust pointer to new free list */
;;;138 pmem->OSMemNFree--; /* One less memory block in this partition */
;;;139 OS_EXIT_CRITICAL();
;;;140 *err = OS_NO_ERR; /* No error */
;;;141 return (pblk); /* Return memory block to caller */
;;;142 }
;;;143 OS_EXIT_CRITICAL();
;;;144 *err = OS_MEM_NO_FREE_BLKS; /* No, Notify caller of empty memory partition */
;;;145 return ((void *)0); /* Return NULL pointer to caller */
;;;146 }
000124 e12fff1e BX lr
|L1.296|
000128 ef000002 SVC 0x2 ; formerly SWI ;134
00012c e5940010 LDR r0,[r4,#0x10] ;135
000130 e3500000 CMP r0,#0 ;135
000134 0a00000a BEQ |L1.356| ;135
000138 e5945004 LDR r5,[r4,#4] ;136
00013c e5950000 LDR r0,[r5,#0] ;137
000140 e5840004 STR r0,[r4,#4] ;137
000144 e5940010 LDR r0,[r4,#0x10] ;138
000148 e2400001 SUB r0,r0,#1 ;138
00014c e5840010 STR r0,[r4,#0x10] ;138
000150 ef000003 SVC 0x3 ; formerly SWI ;139
000154 e3a00000 MOV r0,#0 ;140
000158 e5c60000 STRB r0,[r6,#0] ;140
00015c e1a00005 MOV r0,r5 ;141
000160 eaffffee B |L1.288| ;141
|L1.356|
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -