os_mem.txt
来自「uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的」· 文本 代码 · 共 369 行 · 第 1/2 页
TXT
369 行
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 934] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_mem.o --depend=.\rvmdk\os_mem.d --device=DARMP --apcs=interwork -O1 -I. -I..\BSP -I..\..\..\..\uCOS-II\Ports\ARM\Generic\RealView -I..\..\..\..\uCOS-II\Source -I..\..\..\..\uC-CPU -I..\..\..\..\uC-CPU\ARM\RealView -I..\..\..\..\uC-LIB -I..\..\..\..\uC-TCPIP\IF -I..\..\..\..\uC-TCPIP\IF\Ether -I..\..\..\..\uC-TCPIP\NIC\ETHER\LPC2378 -I..\..\..\..\uC-TCPIP\NIC\ETHER\PHY -I..\..\..\..\uC-TCPIP\NIC\ETHER\PHY\DP83848 -I..\..\..\..\uC-TCPIP\OS\uCOS-II -I..\..\..\..\uC-TCPIP\Source -I..\..\..\..\uC-LCD\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\RS-232\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\TCPIP\Source -I..\..\..\..\uC-Probe\Target\Plugins\uCOS-II -Ie:\Keil_ARM\ARM\INC\Philips -D__IN_CHIP --omf_browse=.\rvmdk\os_mem.crf ..\Source\OS_MEM.C]
ARM
AREA ||.text||, CODE, READONLY, ALIGN=2
OSMemCreate PROC
;;;48 OS_MEM *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err)
;;;49 {
000000 e92d47f0 PUSH {r4-r10,lr}
000004 e1a06000 MOV r6,r0
000008 e1a09001 MOV r9,r1
00000c e1a07002 MOV r7,r2
000010 e1a08003 MOV r8,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 e5c80000 STRB r0,[r8,#0]
;;;62 return ((OS_MEM *)0);
000024 e3a00000 MOV r0,#0
|L1.40|
000028 e8bd47f0 POP {r4-r10,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 e3590002 CMP r9,#2 ;64
000034 2a000003 BCS |L1.72|
000038 e3a0006f MOV r0,#0x6f ;65
00003c e5c80000 STRB r0,[r8,#0] ;65
000040 e3a00000 MOV r0,#0 ;66
000044 eafffff7 B |L1.40|
|L1.72|
000048 e3570004 CMP r7,#4 ;68
00004c 2a000003 BCS |L1.96|
000050 e3a00070 MOV r0,#0x70 ;69
000054 e5c80000 STRB r0,[r8,#0] ;69
000058 e3a00000 MOV r0,#0 ;70
00005c eafffff1 B |L1.40|
|L1.96|
000060 ef000002 SVC #0x2 ;73
000064 e59f0240 LDR r0,|L1.684|
000068 e5904000 LDR r4,[r0,#0] ;74 ; OSMemFreeList
00006c e3540000 CMP r4,#0 ;75
000070 0a000001 BEQ |L1.124|
000074 e5941004 LDR r1,[r4,#4] ;76
000078 e5801000 STR r1,[r0,#0] ;76 ; OSMemFreeList
|L1.124|
00007c ef000003 SVC #0x3 ;78
000080 e3540000 CMP r4,#0 ;79
000084 1a000003 BNE |L1.152|
000088 e3a0006e MOV r0,#0x6e ;80
00008c e5c80000 STRB r0,[r8,#0] ;80
000090 e3a00000 MOV r0,#0 ;81
000094 eaffffe3 B |L1.40|
|L1.152|
000098 e1a05006 MOV r5,r6 ;84
00009c e0860007 ADD r0,r6,r7 ;84
0000a0 e3a01000 MOV r1,#0 ;85
0000a4 e2492001 SUB r2,r9,#1 ;85
|L1.168|
0000a8 e1510002 CMP r1,r2 ;85
0000ac 2a000004 BCS |L1.196|
0000b0 e5850000 STR r0,[r5,#0] ;86
0000b4 e1a05000 MOV r5,r0 ;87
0000b8 e0800007 ADD r0,r0,r7 ;88
0000bc e2811001 ADD r1,r1,#1 ;85
0000c0 eafffff8 B |L1.168|
|L1.196|
0000c4 e3a00000 MOV r0,#0 ;90
0000c8 e5850000 STR r0,[r5,#0] ;90
0000cc e5846000 STR r6,[r4,#0] ;91
0000d0 e5846004 STR r6,[r4,#4] ;92
0000d4 e5849010 STR r9,[r4,#0x10] ;93
0000d8 e584900c STR r9,[r4,#0xc] ;94
0000dc e5847008 STR r7,[r4,#8] ;95
0000e0 e5c80000 STRB r0,[r8,#0] ;96
0000e4 e1a00004 MOV r0,r4 ;97
0000e8 eaffffce B |L1.40|
;;;99 /*$PAGE*/
ENDP
OSMemGet PROC
;;;120 void *OSMemGet (OS_MEM *pmem, INT8U *err)
;;;121 {
0000ec e92d4070 PUSH {r4-r6,lr}
0000f0 e1a04000 MOV r4,r0
0000f4 e1a05001 MOV r5,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 */
0000f8 e3540000 CMP r4,#0
0000fc 1a000004 BNE |L1.276|
;;;130 *err = OS_MEM_INVALID_PMEM;
000100 e3a00074 MOV r0,#0x74
000104 e5c50000 STRB r0,[r5,#0]
;;;131 return ((OS_MEM *)0);
000108 e3a00000 MOV r0,#0
|L1.268|
00010c 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 }
000110 e12fff1e BX lr
|L1.276|
000114 ef000002 SVC #0x2 ;134
000118 e5940010 LDR r0,[r4,#0x10] ;135
00011c e3500000 CMP r0,#0 ;135
000120 0a000009 BEQ |L1.332|
000124 e5946004 LDR r6,[r4,#4] ;136
000128 e5961000 LDR r1,[r6,#0] ;137
00012c e5841004 STR r1,[r4,#4] ;137
000130 e2400001 SUB r0,r0,#1 ;138
000134 e5840010 STR r0,[r4,#0x10] ;138
000138 ef000003 SVC #0x3 ;139
00013c e3a00000 MOV r0,#0 ;140
000140 e5c50000 STRB r0,[r5,#0] ;140
000144 e1a00006 MOV r0,r6 ;141
000148 eaffffef B |L1.268|
|L1.332|
00014c ef000003 SVC #0x3 ;143
000150 e3a00071 MOV r0,#0x71 ;144
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?