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 + -
显示快捷键?