📄 os_mem.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 947] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\os_mem.o --device=DARMP -O0 -IC:\Keil\ARM\INC\Philips ..\Source\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 1a000003 BNE |L1.44|
;;;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
;;;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 OS_ENTER_CRITICAL();
;;;92 pmem->OSMemAddr = addr; /* Store start address of memory partition */
;;;93 pmem->OSMemFreeList = addr; /* Initialize pointer to pool of free blocks */
;;;94 pmem->OSMemNFree = nblks; /* Store number of free blocks in MCB */
;;;95 pmem->OSMemNBlks = nblks;
;;;96 pmem->OSMemBlkSize = blksize; /* Store block size of each memory blocks */
;;;97 OS_EXIT_CRITICAL();
;;;98 *err = OS_NO_ERR;
;;;99 return (pmem);
;;;100 }
|L1.40|
000028 e8bd9ff0 POP {r4-r12,pc}
|L1.44|
00002c e3570002 CMP r7,#2 ;64
000030 2a000003 BCS |L1.68| ;64
000034 e3a0006f MOV r0,#0x6f ;65
000038 e5c90000 STRB r0,[r9,#0] ;65
00003c e3a00000 MOV r0,#0 ;66
000040 eafffff8 B |L1.40| ;66
|L1.68|
000044 e3580004 CMP r8,#4 ;68
000048 2a000003 BCS |L1.92| ;68
00004c e3a00070 MOV r0,#0x70 ;69
000050 e5c90000 STRB r0,[r9,#0] ;69
000054 e3a00000 MOV r0,#0 ;70
000058 eafffff2 B |L1.40| ;70
|L1.92|
00005c ef000002 SVC 0x2 ; formerly SWI ;73
000060 e59f0268 LDR r0,|L1.720| ;74
000064 e590a000 LDR r10,[r0,#0] ;74 ; OSMemFreeList
000068 e5900000 LDR r0,[r0,#0] ;75 ; OSMemFreeList
00006c e3500000 CMP r0,#0 ;75
000070 0a000004 BEQ |L1.136| ;75
000074 e59f0254 LDR r0,|L1.720| ;76
000078 e5900000 LDR r0,[r0,#0] ;76 ; OSMemFreeList
00007c e5900004 LDR r0,[r0,#4] ;76
000080 e59f1248 LDR r1,|L1.720| ;76
000084 e5810000 STR r0,[r1,#0] ;76 ; OSMemFreeList
|L1.136|
000088 ef000003 SVC 0x3 ; formerly SWI ;78
00008c e35a0000 CMP r10,#0 ;79
000090 1a000003 BNE |L1.164| ;79
000094 e3a0006e MOV r0,#0x6e ;80
000098 e5c90000 STRB r0,[r9,#0] ;80
00009c e3a00000 MOV r0,#0 ;81
0000a0 eaffffe0 B |L1.40| ;81
|L1.164|
0000a4 e1a05006 MOV r5,r6 ;83
0000a8 e1a05006 MOV r5,r6 ;84
0000ac e0864008 ADD r4,r6,r8 ;84
0000b0 e3a0b000 MOV r11,#0 ;85
0000b4 ea000003 B |L1.200| ;85
|L1.184|
0000b8 e5854000 STR r4,[r5,#0] ;86
0000bc e1a05004 MOV r5,r4 ;87
0000c0 e0844008 ADD r4,r4,r8 ;88
0000c4 e28bb001 ADD r11,r11,#1 ;85
|L1.200|
0000c8 e2470001 SUB r0,r7,#1 ;85
0000cc e150000b CMP r0,r11 ;85
0000d0 8afffff8 BHI |L1.184| ;85
0000d4 e3a00000 MOV r0,#0 ;90
0000d8 e5850000 STR r0,[r5,#0] ;90
0000dc ef000002 SVC 0x2 ; formerly SWI ;91
0000e0 e58a6000 STR r6,[r10,#0] ;92
0000e4 e58a6004 STR r6,[r10,#4] ;93
0000e8 e58a7010 STR r7,[r10,#0x10] ;94
0000ec e58a700c STR r7,[r10,#0xc] ;95
0000f0 e58a8008 STR r8,[r10,#8] ;96
0000f4 ef000003 SVC 0x3 ; formerly SWI ;97
0000f8 e3a00000 MOV r0,#0 ;98
0000fc e5c90000 STRB r0,[r9,#0] ;98
000100 e1a0000a MOV r0,r10 ;99
000104 eaffffc7 B |L1.40| ;99
ENDP
OSMemGet PROC
;;;122 void *OSMemGet (OS_MEM *pmem, INT8U *err)
;;;123 {
000108 e92d4070 PUSH {r4-r6,lr}
00010c e1a04000 MOV r4,r0
000110 e1a06001 MOV r6,r1
;;;124 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;125 OS_CPU_SR cpu_sr;
;;;126 #endif
;;;127 void *pblk;
;;;128
;;;129
;;;130 #if OS_ARG_CHK_EN > 0
;;;131 if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition */
000114 e3540000 CMP r4,#0
000118 1a000003 BNE |L1.300|
;;;132 *err = OS_MEM_INVALID_PMEM;
00011c e3a00074 MOV r0,#0x74
000120 e5c60000 STRB r0,[r6,#0]
;;;133 return ((OS_MEM *)0);
000124 e3a00000 MOV r0,#0
;;;134 }
;;;135 #endif
;;;136 OS_ENTER_CRITICAL();
;;;137 if (pmem->OSMemNFree > 0) { /* See if there are any free memory blocks */
;;;138 pblk = pmem->OSMemFreeList; /* Yes, point to next free memory block */
;;;139 pmem->OSMemFreeList = *(void **)pblk; /* Adjust pointer to new free list */
;;;140 pmem->OSMemNFree--; /* One less memory block in this partition */
;;;141 OS_EXIT_CRITICAL();
;;;142 *err = OS_NO_ERR; /* No error */
;;;143 return (pblk); /* Return memory block to caller */
;;;144 }
;;;145 OS_EXIT_CRITICAL();
;;;146 *err = OS_MEM_NO_FREE_BLKS; /* No, Notify caller of empty memory partition */
;;;147 return ((void *)0); /* Return NULL pointer to caller */
;;;148 }
|L1.296|
000128 e8bd8070 POP {r4-r6,pc}
|L1.300|
00012c ef000002 SVC 0x2 ; formerly SWI ;136
000130 e5940010 LDR r0,[r4,#0x10] ;137
000134 e3500000 CMP r0,#0 ;137
000138 0a00000a BEQ |L1.360| ;137
00013c e5945004 LDR r5,[r4,#4] ;138
000140 e5950000 LDR r0,[r5,#0] ;139
000144 e5840004 STR r0,[r4,#4] ;139
000148 e5940010 LDR r0,[r4,#0x10] ;140
00014c e2400001 SUB r0,r0,#1 ;140
000150 e5840010 STR r0,[r4,#0x10] ;140
000154 ef000003 SVC 0x3 ; formerly SWI ;141
000158 e3a00000 MOV r0,#0 ;142
00015c e5c60000 STRB r0,[r6,#0] ;142
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -