📄 os_mem.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 942] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_mem.o --depend=.\rvmdk\os_mem.d --device=DARMSTM --apcs=interwork -O1 -Otime -I. -I..\BSP -I..\..\..\..\..\uCOS-II\Ports\arm-cortex-m3\Generic\RealView -I..\..\..\..\..\uCOS-II\Source -I..\..\..\..\..\CPU\ST\STM32\inc -I..\..\..\..\..\uC-CPU -I..\..\..\..\..\uC-CPU\Arm-Cortex-M3\RealView -I..\..\..\..\..\uC-LIB -I..\..\..\..\..\uC-Probe\Target\Plugins\uCOS-II -I..\..\..\..\..\uC-Probe\Target\Communication\Generic\Source -I..\..\..\..\..\uC-Probe\Target\Communication\Generic\RS-232\Ports\ST\STM32 -I..\..\..\..\..\uC-Probe\Target\Communication\Generic\RS-232\Source -IC:\Keil\ARM\INC\ST\STM32F10x ..\..\..\..\..\uCOS-II\Source\os_mem.c]
THUMB
AREA ||.text||, CODE, READONLY, ALIGN=2
OSMemCreate PROC
;;;59 OS_MEM *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *perr)
;;;60 {
000000 e92d41f0 PUSH {r4-r8,lr}
000004 4606 MOV r6,r0
000006 460f MOV r7,r1
000008 4690 MOV r8,r2
00000a 461c MOV r4,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;
;;;67 #endif
;;;68
;;;69
;;;70
;;;71 #if OS_ARG_CHK_EN > 0
;;;72 if (perr == (INT8U *)0) { /* Validate 'perr' */
00000c b914 CBNZ r4,|L1.20|
;;;73 return ((OS_MEM *)0);
00000e 2000 MOVS r0,#0
;;;74 }
;;;75 if (addr == (void *)0) { /* Must pass a valid address for the memory part.*/
;;;76 *perr = 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 *perr = OS_ERR_MEM_INVALID_ADDR;
;;;81 return ((OS_MEM *)0);
;;;82 }
;;;83 if (nblks < 2) { /* Must have at least 2 blocks per partition */
;;;84 *perr = 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 *perr = OS_ERR_MEM_INVALID_SIZE;
;;;89 return ((OS_MEM *)0);
;;;90 }
;;;91 #endif
;;;92 OS_ENTER_CRITICAL();
;;;93 pmem = OSMemFreeList; /* Get next free memory partition */
;;;94 if (OSMemFreeList != (OS_MEM *)0) { /* See if pool of free partitions was empty */
;;;95 OSMemFreeList = (OS_MEM *)OSMemFreeList->OSMemFreeList;
;;;96 }
;;;97 OS_EXIT_CRITICAL();
;;;98 if (pmem == (OS_MEM *)0) { /* See if we have a memory partition */
;;;99 *perr = OS_ERR_MEM_INVALID_PART;
;;;100 return ((OS_MEM *)0);
;;;101 }
;;;102 plink = (void **)addr; /* Create linked list of free memory blocks */
;;;103 pblk = (INT8U *)((INT32U)addr + blksize);
;;;104 for (i = 0; i < (nblks - 1); i++) {
;;;105 *plink = (void *)pblk; /* Save pointer to NEXT block in CURRENT block */
;;;106 plink = (void **)pblk; /* Position to NEXT block */
;;;107 pblk = (INT8U *)((INT32U)pblk + blksize); /* Point to the FOLLOWING block */
;;;108 }
;;;109 *plink = (void *)0; /* Last memory block points to NULL */
;;;110 pmem->OSMemAddr = addr; /* Store start address of memory partition */
;;;111 pmem->OSMemFreeList = addr; /* Initialize pointer to pool of free blocks */
;;;112 pmem->OSMemNFree = nblks; /* Store number of free blocks in MCB */
;;;113 pmem->OSMemNBlks = nblks;
;;;114 pmem->OSMemBlkSize = blksize; /* Store block size of each memory blocks */
;;;115 *perr = OS_ERR_NONE;
;;;116 return (pmem);
;;;117 }
000010 e8bd81f0 POP {r4-r8,pc}
|L1.20|
000014 2062 MOVS r0,#0x62 ;75
000016 b91e CBNZ r6,|L1.32|
000018 7020 STRB r0,[r4,#0] ;76
00001a 2000 MOVS r0,#0 ;77
00001c e8bd81f0 POP {r4-r8,pc}
|L1.32|
000020 f0160f03 TST r6,#3 ;79
000024 d003 BEQ |L1.46|
000026 7020 STRB r0,[r4,#0] ;80
000028 2000 MOVS r0,#0 ;81
00002a e8bd81f0 POP {r4-r8,pc}
|L1.46|
00002e 2f02 CMP r7,#2 ;83
000030 d204 BCS |L1.60|
000032 205b MOVS r0,#0x5b ;84
000034 7020 STRB r0,[r4,#0] ;84
000036 2000 MOVS r0,#0 ;85
000038 e8bd81f0 POP {r4-r8,pc}
|L1.60|
00003c f1b80f04 CMP r8,#4 ;87
000040 d204 BCS |L1.76|
000042 205c MOVS r0,#0x5c ;88
000044 7020 STRB r0,[r4,#0] ;88
000046 2000 MOVS r0,#0 ;89
000048 e8bd81f0 POP {r4-r8,pc}
|L1.76|
00004c f7fffffe BL OS_CPU_SR_Save
000050 4980 LDR r1,|L1.596|
000052 680d LDR r5,[r1,#0] ;93 ; OSMemFreeList
000054 b10d CBZ r5,|L1.90|
000056 686a LDR r2,[r5,#4] ;95
000058 600a STR r2,[r1,#0] ;95 ; OSMemFreeList
|L1.90|
00005a f7fffffe BL OS_CPU_SR_Restore
00005e b925 CBNZ r5,|L1.106|
000060 205a MOVS r0,#0x5a ;99
000062 7020 STRB r0,[r4,#0] ;99
000064 2000 MOVS r0,#0 ;100
000066 e8bd81f0 POP {r4-r8,pc}
|L1.106|
00006a 4632 MOV r2,r6 ;103
00006c eb060008 ADD r0,r6,r8 ;103
000070 2100 MOVS r1,#0 ;104
000072 1e7b SUBS r3,r7,#1 ;104
000074 d006 BEQ |L1.132|
000076 1e7b SUBS r3,r7,#1 ;104
|L1.120|
000078 6010 STR r0,[r2,#0] ;105
00007a 4602 MOV r2,r0 ;106
00007c 4440 ADD r0,r0,r8 ;107
00007e 1c49 ADDS r1,r1,#1 ;104
000080 4299 CMP r1,r3 ;104
000082 d3f9 BCC |L1.120|
|L1.132|
000084 2000 MOVS r0,#0 ;109
000086 6010 STR r0,[r2,#0] ;109
000088 602e STR r6,[r5,#0] ;110
00008a 606e STR r6,[r5,#4] ;111
00008c 612f STR r7,[r5,#0x10] ;112
00008e 60ef STR r7,[r5,#0xc] ;113
000090 f8c58008 STR r8,[r5,#8] ;114
000094 7020 STRB r0,[r4,#0] ;115
000096 4628 MOV r0,r5 ;116
000098 e8bd81f0 POP {r4-r8,pc}
;;;118 /*$PAGE*/
ENDP
OSMemGet PROC
;;;139 void *OSMemGet (OS_MEM *pmem, INT8U *perr)
;;;140 {
00009c b570 PUSH {r4-r6,lr}
00009e 4604 MOV r4,r0
0000a0 460d MOV r5,r1
;;;141 void *pblk;
;;;142 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;143 OS_CPU_SR cpu_sr = 0;
;;;144 #endif
;;;145
;;;146
;;;147
;;;148 #if OS_ARG_CHK_EN > 0
;;;149 if (perr == (INT8U *)0) { /* Validate 'perr' */
0000a2 b90d CBNZ r5,|L1.168|
;;;150 return ((void *)0);
0000a4 2000 MOVS r0,#0
;;;151 }
;;;152 if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition */
;;;153 *perr = OS_ERR_MEM_INVALID_PMEM;
;;;154 return ((void *)0);
;;;155 }
;;;156 #endif
;;;157 OS_ENTER_CRITICAL();
;;;158 if (pmem->OSMemNFree > 0) { /* See if there are any free memory blocks */
;;;159 pblk = pmem->OSMemFreeList; /* Yes, point to next free memory block */
;;;160 pmem->OSMemFreeList = *(void **)pblk; /* Adjust pointer to new free list */
;;;161 pmem->OSMemNFree--; /* One less memory block in this partition */
;;;162 OS_EXIT_CRITICAL();
;;;163 *perr = OS_ERR_NONE; /* No error */
;;;164 return (pblk); /* Return memory block to caller */
;;;165 }
;;;166 OS_EXIT_CRITICAL();
;;;167 *perr = OS_ERR_MEM_NO_FREE_BLKS; /* No, Notify caller of empty memory partition */
;;;168 return ((void *)0); /* Return NULL pointer to caller */
;;;169 }
0000a6 bd70 POP {r4-r6,pc}
|L1.168|
0000a8 b91c CBNZ r4,|L1.178|
0000aa 2060 MOVS r0,#0x60 ;153
0000ac 7028 STRB r0,[r5,#0] ;153
0000ae 2000 MOVS r0,#0 ;154
0000b0 bd70 POP {r4-r6,pc}
|L1.178|
0000b2 f7fffffe BL OS_CPU_SR_Save
0000b6 6921 LDR r1,[r4,#0x10] ;158
0000b8 b151 CBZ r1,|L1.208|
0000ba 6866 LDR r6,[r4,#4] ;159
0000bc 6832 LDR r2,[r6,#0] ;160
0000be 6062 STR r2,[r4,#4] ;160
0000c0 1e49 SUBS r1,r1,#1 ;161
0000c2 6121 STR r1,[r4,#0x10] ;161
0000c4 f7fffffe BL OS_CPU_SR_Restore
0000c8 2000 MOVS r0,#0 ;163
0000ca 7028 STRB r0,[r5,#0] ;163
0000cc 4630 MOV r0,r6 ;164
0000ce bd70 POP {r4-r6,pc}
|L1.208|
0000d0 f7fffffe BL OS_CPU_SR_Restore
0000d4 205d MOVS r0,#0x5d ;167
0000d6 7028 STRB r0,[r5,#0] ;167
0000d8 2000 MOVS r0,#0 ;168
0000da bd70 POP {r4-r6,pc}
;;;170 /*$PAGE*/
ENDP
OSMemNameGet PROC
;;;193 INT8U OSMemNameGet (OS_MEM *pmem, INT8U *pname, INT8U *perr)
;;;194 {
0000dc e92d41f0 PUSH {r4-r8,lr}
0000e0 4605 MOV r5,r0
0000e2 460e MOV r6,r1
0000e4 4614 MOV r4,r2
;;;195 INT8U len;
;;;196 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;197 OS_CPU_SR cpu_sr = 0;
;;;198 #endif
;;;199
;;;200
;;;201
;;;202 #if OS_ARG_CHK_EN > 0
;;;203 if (perr == (INT8U *)0) { /* Validate 'perr' */
0000e6 b914 CBNZ r4,|L1.238|
;;;204 return (0);
0000e8 2000 MOVS r0,#0
;;;205 }
;;;206 if (pmem == (OS_MEM *)0) { /* Is 'pmem' a NULL pointer? */
;;;207 *perr = OS_ERR_MEM_INVALID_PMEM;
;;;208 return (0);
;;;209 }
;;;210 if (pname == (INT8U *)0) { /* Is 'pname' a NULL pointer? */
;;;211 *perr = OS_ERR_PNAME_NULL;
;;;212 return (0);
;;;213 }
;;;214 #endif
;;;215 if (OSIntNesting > 0) { /* See if trying to call from an ISR */
;;;216 *perr = OS_ERR_NAME_GET_ISR;
;;;217 return (0);
;;;218 }
;;;219 OS_ENTER_CRITICAL();
;;;220 len = OS_StrCopy(pname, pmem->OSMemName); /* Copy name from OS_MEM */
;;;221 OS_EXIT_CRITICAL();
;;;222 *perr = OS_ERR_NONE;
;;;223 return (len);
;;;224 }
0000ea e8bd81f0 POP {r4-r8,pc}
|L1.238|
0000ee b925 CBNZ r5,|L1.250|
0000f0 2060 MOVS r0,#0x60 ;207
0000f2 7020 STRB r0,[r4,#0] ;207
0000f4 2000 MOVS r0,#0 ;208
0000f6 e8bd81f0 POP {r4-r8,pc}
|L1.250|
0000fa b926 CBNZ r6,|L1.262|
0000fc 200c MOVS r0,#0xc ;211
0000fe 7020 STRB r0,[r4,#0] ;211
000100 2000 MOVS r0,#0 ;212
000102 e8bd81f0 POP {r4-r8,pc}
|L1.262|
000106 4854 LDR r0,|L1.600|
000108 7800 LDRB r0,[r0,#0] ;215 ; OSIntNesting
00010a b120 CBZ r0,|L1.278|
00010c 2011 MOVS r0,#0x11 ;216
00010e 7020 STRB r0,[r4,#0] ;216
000110 2000 MOVS r0,#0 ;217
000112 e8bd81f0 POP {r4-r8,pc}
|L1.278|
000116 f7fffffe BL OS_CPU_SR_Save
00011a 4607 MOV r7,r0 ;219
00011c f1050114 ADD r1,r5,#0x14 ;220
000120 4630 MOV r0,r6 ;220
000122 f7fffffe BL OS_StrCopy
000126 4605 MOV r5,r0 ;220
000128 4638 MOV r0,r7 ;221
00012a f7fffffe BL OS_CPU_SR_Restore
00012e 2000 MOVS r0,#0 ;222
000130 7020 STRB r0,[r4,#0] ;222
000132 4628 MOV r0,r5 ;223
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -