?? os_mem.txt
字號:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 914] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_mem.o --depend=.\rvmdk\os_mem.d --device=DARMSTM -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 -ID:\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 e92de92d 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
000010 e8bde8bd POP {r4-r8,pc}
|L1.20|
;;;74 }
;;;75 if (addr == (void *)0) { /* Must pass a valid address for the memory part.*/
000014 2062 MOVS r0,#0x62
000016 b91e CBNZ r6,|L1.32|
;;;76 *perr = OS_ERR_MEM_INVALID_ADDR;
000018 7020 STRB r0,[r4,#0]
;;;77 return ((OS_MEM *)0);
00001a 2000 MOVS r0,#0
00001c e8bde8bd POP {r4-r8,pc}
|L1.32|
;;;78 }
;;;79 if (((INT32U)addr & (sizeof(void *) - 1)) != 0){ /* Must be pointer size aligned */
000020 f016f016 TST r6,#3
000024 d003 BEQ |L1.46|
;;;80 *perr = OS_ERR_MEM_INVALID_ADDR;
000026 7020 STRB r0,[r4,#0]
;;;81 return ((OS_MEM *)0);
000028 2000 MOVS r0,#0
00002a e8bde8bd POP {r4-r8,pc}
|L1.46|
;;;82 }
;;;83 if (nblks < 2) { /* Must have at least 2 blocks per partition */
00002e 2f02 CMP r7,#2
000030 d204 BCS |L1.60|
;;;84 *perr = OS_ERR_MEM_INVALID_BLKS;
000032 205b MOVS r0,#0x5b
000034 7020 STRB r0,[r4,#0]
;;;85 return ((OS_MEM *)0);
000036 2000 MOVS r0,#0
000038 e8bde8bd POP {r4-r8,pc}
|L1.60|
;;;86 }
;;;87 if (blksize < sizeof(void *)) { /* Must contain space for at least a pointer */
00003c f1b8f1b8 CMP r8,#4
000040 d204 BCS |L1.76|
;;;88 *perr = OS_ERR_MEM_INVALID_SIZE;
000042 205c MOVS r0,#0x5c
000044 7020 STRB r0,[r4,#0]
;;;89 return ((OS_MEM *)0);
000046 2000 MOVS r0,#0
000048 e8bde8bd POP {r4-r8,pc}
|L1.76|
;;;90 }
;;;91 #endif
;;;92 OS_ENTER_CRITICAL();
00004c f7fff7ff BL OS_CPU_SR_Save
;;;93 pmem = OSMemFreeList; /* Get next free memory partition */
000050 4980 LDR r1,|L1.596|
000052 680d LDR r5,[r1,#0] ; OSMemFreeList
;;;94 if (OSMemFreeList != (OS_MEM *)0) { /* See if pool of free partitions was empty */
000054 b10d CBZ r5,|L1.90|
;;;95 OSMemFreeList = (OS_MEM *)OSMemFreeList->OSMemFreeList;
000056 686a LDR r2,[r5,#4]
000058 600a STR r2,[r1,#0] ; OSMemFreeList
|L1.90|
;;;96 }
;;;97 OS_EXIT_CRITICAL();
00005a f7fff7ff BL OS_CPU_SR_Restore
;;;98 if (pmem == (OS_MEM *)0) { /* See if we have a memory partition */
00005e b925 CBNZ r5,|L1.106|
;;;99 *perr = OS_ERR_MEM_INVALID_PART;
000060 205a MOVS r0,#0x5a
000062 7020 STRB r0,[r4,#0]
;;;100 return ((OS_MEM *)0);
000064 2000 MOVS r0,#0
000066 e8bde8bd POP {r4-r8,pc}
|L1.106|
;;;101 }
;;;102 plink = (void **)addr; /* Create linked list of free memory blocks */
;;;103 pblk = (INT8U *)((INT32U)addr + blksize);
00006a 4632 MOV r2,r6
00006c eb06eb06 ADD r0,r6,r8
;;;104 for (i = 0; i < (nblks - 1); i++) {
000070 2100 MOVS r1,#0
000072 1e7b SUBS r3,r7,#1
000074 d006 BEQ |L1.132|
000076 1e7b SUBS r3,r7,#1
|L1.120|
;;;105 *plink = (void *)pblk; /* Save pointer to NEXT block in CURRENT block */
000078 6010 STR r0,[r2,#0]
;;;106 plink = (void **)pblk; /* Position to NEXT block */
00007a 4602 MOV r2,r0
;;;107 pblk = (INT8U *)((INT32U)pblk + blksize); /* Point to the FOLLOWING block */
00007c 4440 ADD r0,r0,r8
00007e 1c49 ADDS r1,r1,#1
000080 4299 CMP r1,r3
000082 d3f9 BCC |L1.120|
|L1.132|
;;;108 }
;;;109 *plink = (void *)0; /* Last memory block points to NULL */
000084 2000 MOVS r0,#0
000086 6010 STR r0,[r2,#0]
;;;110 pmem->OSMemAddr = addr; /* Store start address of memory partition */
000088 602e STR r6,[r5,#0]
;;;111 pmem->OSMemFreeList = addr; /* Initialize pointer to pool of free blocks */
00008a 606e STR r6,[r5,#4]
;;;112 pmem->OSMemNFree = nblks; /* Store number of free blocks in MCB */
00008c 612f STR r7,[r5,#0x10]
;;;113 pmem->OSMemNBlks = nblks;
00008e 60ef STR r7,[r5,#0xc]
;;;114 pmem->OSMemBlkSize = blksize; /* Store block size of each memory blocks */
000090 f8c5f8c5 STR r8,[r5,#8]
;;;115 *perr = OS_ERR_NONE;
000094 7020 STRB r0,[r4,#0]
;;;116 return (pmem);
000096 4628 MOV r0,r5
;;;117 }
000098 e8bde8bd 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
0000ac 7028 STRB r0,[r5,#0]
0000ae 2000 MOVS r0,#0
0000b0 bd70 POP {r4-r6,pc}
|L1.178|
0000b2 f7fff7ff BL OS_CPU_SR_Save
0000b6 6921 LDR r1,[r4,#0x10]
0000b8 b151 CBZ r1,|L1.208|
0000ba 6866 LDR r6,[r4,#4]
0000bc 6832 LDR r2,[r6,#0]
0000be 6062 STR r2,[r4,#4]
0000c0 1e49 SUBS r1,r1,#1
0000c2 6121 STR r1,[r4,#0x10]
0000c4 f7fff7ff BL OS_CPU_SR_Restore
0000c8 2000 MOVS r0,#0
0000ca 7028 STRB r0,[r5,#0]
0000cc 4630 MOV r0,r6
0000ce bd70 POP {r4-r6,pc}
|L1.208|
0000d0 f7fff7ff BL OS_CPU_SR_Restore
0000d4 205d MOVS r0,#0x5d
0000d6 7028 STRB r0,[r5,#0]
0000d8 2000 MOVS r0,#0
0000da bd70 POP {r4-r6,pc}
;;;170 /*$PAGE*/
ENDP
OSMemNameGet PROC
;;;193 INT8U OSMemNameGet (OS_MEM *pmem, INT8U *pname, INT8U *perr)
;;;194 {
0000dc e92de92d 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
0000ea e8bde8bd POP {r4-r8,pc}
|L1.238|
;;;205 }
;;;206 if (pmem == (OS_MEM *)0) { /* Is 'pmem' a NULL pointer? */
0000ee b925 CBNZ r5,|L1.250|
;;;207 *perr = OS_ERR_MEM_INVALID_PMEM;
0000f0 2060 MOVS r0,#0x60
0000f2 7020 STRB r0,[r4,#0]
;;;208 return (0);
0000f4 2000 MOVS r0,#0
0000f6 e8bde8bd POP {r4-r8,pc}
|L1.250|
;;;209 }
;;;210 if (pname == (INT8U *)0) { /* Is 'pname' a NULL pointer? */
0000fa b926 CBNZ r6,|L1.262|
;;;211 *perr = OS_ERR_PNAME_NULL;
0000fc 200c MOVS r0,#0xc
0000fe 7020 STRB r0,[r4,#0]
;;;212 return (0);
000100 2000 MOVS r0,#0
000102 e8bde8bd POP {r4-r8,pc}
|L1.262|
;;;213 }
;;;214 #endif
;;;215 if (OSIntNesting > 0) { /* See if trying to call from an ISR */
000106 4854 LDR r0,|L1.600|
000108 7800 LDRB r0,[r0,#0] ; OSIntNesting
00010a b120 CBZ r0,|L1.278|
;;;216 *perr = OS_ERR_NAME_GET_ISR;
00010c 2011 MOVS r0,#0x11
00010e 7020 STRB r0,[r4,#0]
;;;217 return (0);
000110 2000 MOVS r0,#0
000112 e8bde8bd POP {r4-r8,pc}
|L1.278|
;;;218 }
;;;219 OS_ENTER_CRITICAL();
000116 f7fff7ff BL OS_CPU_SR_Save
00011a 4607 MOV r7,r0
;;;220 len = OS_StrCopy(pname, pmem->OSMemName); /* Copy name from OS_MEM */
00011c f105f105 ADD r1,r5,#0x14
000120 4630 MOV r0,r6
000122 f7fff7ff BL OS_StrCopy
000126 4605 MOV r5,r0
;;;221 OS_EXIT_CRITICAL();
000128 4638 MOV r0,r7
00012a f7fff7ff BL OS_CPU_SR_Restore
;;;222 *perr = OS_ERR_NONE;
00012e 2000 MOVS r0,#0
000130 7020 STRB r0,[r4,#0]
;;;223 return (len);
000132 4628 MOV r0,r5
;;;224 }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -