📄 os_mem.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 919] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_mem.o --depend=.\rvmdk\os_mem.d --device=DARMP --apcs=interwork -I. -I..\BSP -I..\..\..\..\..\uCOS-II\Ports\ARM\Generic\RealView -I..\..\..\..\..\uCOS-II\Source -I..\..\..\..\..\uCOSView\Source -I..\..\..\..\..\uCOSView\Ports\ARM7\LPC2000\IAR -I..\..\..\..\..\uC-CPU -I..\..\..\..\..\uC-CPU\ARM\RealView -I..\..\..\..\..\uC-LIB -I..\..\..\..\..\uC-Probe\Target\Plugins\uCOS-II -IC:\Keil\ARM\INC\Philips --omf_browse=.\rvmdk\os_mem.crf ..\..\..\..\..\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 *perr)
;;;60 {
000000 e92d47f0 PUSH {r4-r10,lr}
000004 e1a06000 MOV r6,r0
000008 e1a08001 MOV r8,r1
00000c e1a07002 MOV r7,r2
000010 e1a09003 MOV r9,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' */
;;;73 return ((OS_MEM *)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();
000014 ebfffffe BL OS_CPU_SR_Save
;;;93 pmem = OSMemFreeList; /* Get next free memory partition */
000018 e59f12bc LDR r1,|L1.732|
00001c e5914000 LDR r4,[r1,#0] ; OSMemFreeList
;;;94 if (OSMemFreeList != (OS_MEM *)0) { /* See if pool of free partitions was empty */
000020 e3540000 CMP r4,#0
;;;95 OSMemFreeList = (OS_MEM *)OSMemFreeList->OSMemFreeList;
000024 15942004 LDRNE r2,[r4,#4]
000028 15812000 STRNE r2,[r1,#0] ; OSMemFreeList
;;;96 }
;;;97 OS_EXIT_CRITICAL();
00002c ebfffffe BL OS_CPU_SR_Restore
;;;98 if (pmem == (OS_MEM *)0) { /* See if we have a memory partition */
000030 e3540000 CMP r4,#0
;;;99 *perr = OS_ERR_MEM_INVALID_PART;
000034 03a0005a MOVEQ r0,#0x5a
000038 05c90000 STRBEQ r0,[r9,#0]
;;;100 return ((OS_MEM *)0);
00003c 03a00000 MOVEQ r0,#0
000040 0a000012 BEQ |L1.144|
;;;101 }
;;;102 plink = (void **)addr; /* Create linked list of free memory blocks */
;;;103 pblk = (INT8U *)((INT32U)addr + blksize);
000044 e1a05006 MOV r5,r6
000048 e0860007 ADD r0,r6,r7
;;;104 for (i = 0; i < (nblks - 1); i++) {
00004c e3a01000 MOV r1,#0
000050 e2482001 SUB r2,r8,#1
|L1.84|
000054 e1510002 CMP r1,r2
;;;105 *plink = (void *)pblk; /* Save pointer to NEXT block in CURRENT block */
000058 35850000 STRCC r0,[r5,#0]
;;;106 plink = (void **)pblk; /* Position to NEXT block */
00005c 31a05000 MOVCC r5,r0
;;;107 pblk = (INT8U *)((INT32U)pblk + blksize); /* Point to the FOLLOWING block */
000060 30800007 ADDCC r0,r0,r7
000064 32811001 ADDCC r1,r1,#1 ;104
000068 3afffff9 BCC |L1.84|
;;;108 }
;;;109 *plink = (void *)0; /* Last memory block points to NULL */
00006c e3a00000 MOV r0,#0
;;;110 pmem->OSMemAddr = addr; /* Store start address of memory partition */
000070 e5850000 STR r0,[r5,#0]
;;;111 pmem->OSMemFreeList = addr; /* Initialize pointer to pool of free blocks */
000074 e5846000 STR r6,[r4,#0]
;;;112 pmem->OSMemNFree = nblks; /* Store number of free blocks in MCB */
;;;113 pmem->OSMemNBlks = nblks;
000078 e5846004 STR r6,[r4,#4]
;;;114 pmem->OSMemBlkSize = blksize; /* Store block size of each memory blocks */
00007c e2841008 ADD r1,r4,#8
000080 e5848010 STR r8,[r4,#0x10] ;113
000084 e8810180 STM r1,{r7,r8}
;;;115 *perr = OS_ERR_NONE;
000088 e5c90000 STRB r0,[r9,#0]
;;;116 return (pmem);
00008c e1a00004 MOV r0,r4
|L1.144|
000090 e8bd47f0 POP {r4-r10,lr}
;;;117 }
000094 e12fff1e BX lr
;;;118 /*$PAGE*/
ENDP
OSMemGet PROC
;;;139 void *OSMemGet (OS_MEM *pmem, INT8U *perr)
;;;140 {
000098 e92d4070 PUSH {r4-r6,lr}
00009c e1a04000 MOV r4,r0
0000a0 e1a06001 MOV r6,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' */
;;;150 return ((void *)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();
0000a4 ebfffffe BL OS_CPU_SR_Save
;;;158 if (pmem->OSMemNFree > 0) { /* See if there are any free memory blocks */
0000a8 e5941010 LDR r1,[r4,#0x10]
0000ac e3510000 CMP r1,#0
0000b0 0a00000a BEQ |L1.224|
;;;159 pblk = pmem->OSMemFreeList; /* Yes, point to next free memory block */
;;;160 pmem->OSMemFreeList = *(void **)pblk; /* Adjust pointer to new free list */
0000b4 e5945004 LDR r5,[r4,#4]
;;;161 pmem->OSMemNFree--; /* One less memory block in this partition */
0000b8 e2411001 SUB r1,r1,#1
0000bc e5952000 LDR r2,[r5,#0] ;160
0000c0 e5a42004 STR r2,[r4,#4]!
0000c4 e584100c STR r1,[r4,#0xc]
;;;162 OS_EXIT_CRITICAL();
0000c8 ebfffffe BL OS_CPU_SR_Restore
;;;163 *perr = OS_ERR_NONE; /* No error */
0000cc e3a00000 MOV r0,#0
0000d0 e5c60000 STRB r0,[r6,#0]
;;;164 return (pblk); /* Return memory block to caller */
0000d4 e1a00005 MOV r0,r5
|L1.216|
0000d8 e8bd4070 POP {r4-r6,lr}
;;;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 }
0000dc e12fff1e BX lr
|L1.224|
0000e0 ebfffffe BL OS_CPU_SR_Restore
0000e4 e3a0005d MOV r0,#0x5d ;167
0000e8 e5c60000 STRB r0,[r6,#0] ;167
0000ec e3a00000 MOV r0,#0 ;168
0000f0 eafffff8 B |L1.216|
;;;170 /*$PAGE*/
ENDP
OSMemNameGet PROC
;;;193 INT8U OSMemNameGet (OS_MEM *pmem, INT8U *pname, INT8U *perr)
;;;194 {
0000f4 e92d41f0 PUSH {r4-r8,lr}
0000f8 e1a05000 MOV r5,r0
;;;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' */
;;;204 return (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 */
0000fc e59f01dc LDR r0,|L1.736|
000100 e1a04002 MOV r4,r2 ;194
000104 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000108 e1a07001 MOV r7,r1 ;194
00010c e3500000 CMP r0,#0
;;;216 *perr = OS_ERR_NAME_GET_ISR;
000110 13a00011 MOVNE r0,#0x11
000114 15c40000 STRBNE r0,[r4,#0]
;;;217 return (0);
000118 13a00000 MOVNE r0,#0
00011c 1a00000a BNE |L1.332|
;;;218 }
;;;219 OS_ENTER_CRITICAL();
000120 ebfffffe BL OS_CPU_SR_Save
000124 e1a06000 MOV r6,r0
;;;220 len = OS_StrCopy(pname, pmem->OSMemName); /* Copy name from OS_MEM */
000128 e2851014 ADD r1,r5,#0x14
00012c e1a00007 MOV r0,r7
000130 ebfffffe BL OS_StrCopy
000134 e1a05000 MOV r5,r0
;;;221 OS_EXIT_CRITICAL();
000138 e1a00006 MOV r0,r6
00013c ebfffffe BL OS_CPU_SR_Restore
;;;222 *perr = OS_ERR_NONE;
000140 e3a00000 MOV r0,#0
000144 e5c40000 STRB r0,[r4,#0]
;;;223 return (len);
000148 e1a00005 MOV r0,r5
|L1.332|
00014c e8bd41f0 POP {r4-r8,lr}
;;;224 }
000150 e12fff1e BX lr
;;;225 #endif
ENDP
OSMemNameSet PROC
;;;251 void OSMemNameSet (OS_MEM *pmem, INT8U *pname, INT8U *perr)
;;;252 {
000154 e92d41f0 PUSH {r4-r8,lr}
000158 e1a05000 MOV r5,r0
;;;253 INT8U len;
;;;254 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;255 OS_CPU_SR cpu_sr = 0;
;;;256 #endif
;;;257
;;;258
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -