⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_mem.txt

📁 在KEIL下成功使用UCOS-II嵌入式操作系统
💻 TXT
📖 第 1 页 / 共 2 页
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 947] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\os_mem.o --device=DARMP -O0 -IC:\Keil\ARM\INC\Philips ..\Source\OS_MEM.C]

                          ARM

                          AREA ||.text.7||, CODE, READONLY, ALIGN=2

                  OSMemCreate PROC
;;;48     OS_MEM  *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err)
;;;49     {
000000  e92d5ff0          PUSH     {r4-r12,lr}
000004  e1a06000          MOV      r6,r0
000008  e1a07001          MOV      r7,r1
00000c  e1a08002          MOV      r8,r2
000010  e1a09003          MOV      r9,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  1a000003          BNE      |L1.44|
;;;61             *err = OS_MEM_INVALID_ADDR;
00001c  e3a00076          MOV      r0,#0x76
000020  e5c90000          STRB     r0,[r9,#0]
;;;62             return ((OS_MEM *)0);
000024  e3a00000          MOV      r0,#0
;;;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         OS_ENTER_CRITICAL();
;;;92         pmem->OSMemAddr     = addr;                       /* Store start address of memory partition       */
;;;93         pmem->OSMemFreeList = addr;                       /* Initialize pointer to pool of free blocks     */
;;;94         pmem->OSMemNFree    = nblks;                      /* Store number of free blocks in MCB            */
;;;95         pmem->OSMemNBlks    = nblks;
;;;96         pmem->OSMemBlkSize  = blksize;                    /* Store block size of each memory blocks        */
;;;97         OS_EXIT_CRITICAL();
;;;98         *err   = OS_NO_ERR;
;;;99         return (pmem);
;;;100    }
                  |L1.40|
000028  e8bd9ff0          POP      {r4-r12,pc}
                  |L1.44|
00002c  e3570002          CMP      r7,#2                 ;64
000030  2a000003          BCS      |L1.68|               ;64
000034  e3a0006f          MOV      r0,#0x6f              ;65
000038  e5c90000          STRB     r0,[r9,#0]            ;65
00003c  e3a00000          MOV      r0,#0                 ;66
000040  eafffff8          B        |L1.40|               ;66
                  |L1.68|
000044  e3580004          CMP      r8,#4                 ;68
000048  2a000003          BCS      |L1.92|               ;68
00004c  e3a00070          MOV      r0,#0x70              ;69
000050  e5c90000          STRB     r0,[r9,#0]            ;69
000054  e3a00000          MOV      r0,#0                 ;70
000058  eafffff2          B        |L1.40|               ;70
                  |L1.92|
00005c  ef000002          SVC      0x2  ; formerly SWI   ;73
000060  e59f0268          LDR      r0,|L1.720|           ;74
000064  e590a000          LDR      r10,[r0,#0]           ;74  ; OSMemFreeList
000068  e5900000          LDR      r0,[r0,#0]            ;75  ; OSMemFreeList
00006c  e3500000          CMP      r0,#0                 ;75
000070  0a000004          BEQ      |L1.136|              ;75
000074  e59f0254          LDR      r0,|L1.720|           ;76
000078  e5900000          LDR      r0,[r0,#0]            ;76  ; OSMemFreeList
00007c  e5900004          LDR      r0,[r0,#4]            ;76
000080  e59f1248          LDR      r1,|L1.720|           ;76
000084  e5810000          STR      r0,[r1,#0]            ;76  ; OSMemFreeList
                  |L1.136|
000088  ef000003          SVC      0x3  ; formerly SWI   ;78
00008c  e35a0000          CMP      r10,#0                ;79
000090  1a000003          BNE      |L1.164|              ;79
000094  e3a0006e          MOV      r0,#0x6e              ;80
000098  e5c90000          STRB     r0,[r9,#0]            ;80
00009c  e3a00000          MOV      r0,#0                 ;81
0000a0  eaffffe0          B        |L1.40|               ;81
                  |L1.164|
0000a4  e1a05006          MOV      r5,r6                 ;83
0000a8  e1a05006          MOV      r5,r6                 ;84
0000ac  e0864008          ADD      r4,r6,r8              ;84
0000b0  e3a0b000          MOV      r11,#0                ;85
0000b4  ea000003          B        |L1.200|              ;85
                  |L1.184|
0000b8  e5854000          STR      r4,[r5,#0]            ;86
0000bc  e1a05004          MOV      r5,r4                 ;87
0000c0  e0844008          ADD      r4,r4,r8              ;88
0000c4  e28bb001          ADD      r11,r11,#1            ;85
                  |L1.200|
0000c8  e2470001          SUB      r0,r7,#1              ;85
0000cc  e150000b          CMP      r0,r11                ;85
0000d0  8afffff8          BHI      |L1.184|              ;85
0000d4  e3a00000          MOV      r0,#0                 ;90
0000d8  e5850000          STR      r0,[r5,#0]            ;90
0000dc  ef000002          SVC      0x2  ; formerly SWI   ;91
0000e0  e58a6000          STR      r6,[r10,#0]           ;92
0000e4  e58a6004          STR      r6,[r10,#4]           ;93
0000e8  e58a7010          STR      r7,[r10,#0x10]        ;94
0000ec  e58a700c          STR      r7,[r10,#0xc]         ;95
0000f0  e58a8008          STR      r8,[r10,#8]           ;96
0000f4  ef000003          SVC      0x3  ; formerly SWI   ;97
0000f8  e3a00000          MOV      r0,#0                 ;98
0000fc  e5c90000          STRB     r0,[r9,#0]            ;98
000100  e1a0000a          MOV      r0,r10                ;99
000104  eaffffc7          B        |L1.40|               ;99
                          ENDP

                  OSMemGet PROC
;;;122    void  *OSMemGet (OS_MEM *pmem, INT8U *err)
;;;123    {
000108  e92d4070          PUSH     {r4-r6,lr}
00010c  e1a04000          MOV      r4,r0
000110  e1a06001          MOV      r6,r1
;;;124    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;125        OS_CPU_SR  cpu_sr;
;;;126    #endif    
;;;127        void      *pblk;
;;;128    
;;;129    
;;;130    #if OS_ARG_CHK_EN > 0
;;;131        if (pmem == (OS_MEM *)0) {                        /* Must point to a valid memory partition         */
000114  e3540000          CMP      r4,#0
000118  1a000003          BNE      |L1.300|
;;;132            *err = OS_MEM_INVALID_PMEM;
00011c  e3a00074          MOV      r0,#0x74
000120  e5c60000          STRB     r0,[r6,#0]
;;;133            return ((OS_MEM *)0);
000124  e3a00000          MOV      r0,#0
;;;134        }
;;;135    #endif
;;;136        OS_ENTER_CRITICAL();
;;;137        if (pmem->OSMemNFree > 0) {                       /* See if there are any free memory blocks       */
;;;138            pblk                = pmem->OSMemFreeList;    /* Yes, point to next free memory block          */
;;;139            pmem->OSMemFreeList = *(void **)pblk;         /*      Adjust pointer to new free list          */
;;;140            pmem->OSMemNFree--;                           /*      One less memory block in this partition  */
;;;141            OS_EXIT_CRITICAL();
;;;142            *err = OS_NO_ERR;                             /*      No error                                 */
;;;143            return (pblk);                                /*      Return memory block to caller            */
;;;144        }
;;;145        OS_EXIT_CRITICAL();
;;;146        *err = OS_MEM_NO_FREE_BLKS;                       /* No,  Notify caller of empty memory partition  */
;;;147        return ((void *)0);                               /*      Return NULL pointer to caller            */
;;;148    }
                  |L1.296|
000128  e8bd8070          POP      {r4-r6,pc}
                  |L1.300|
00012c  ef000002          SVC      0x2  ; formerly SWI   ;136
000130  e5940010          LDR      r0,[r4,#0x10]         ;137
000134  e3500000          CMP      r0,#0                 ;137
000138  0a00000a          BEQ      |L1.360|              ;137
00013c  e5945004          LDR      r5,[r4,#4]            ;138
000140  e5950000          LDR      r0,[r5,#0]            ;139
000144  e5840004          STR      r0,[r4,#4]            ;139
000148  e5940010          LDR      r0,[r4,#0x10]         ;140
00014c  e2400001          SUB      r0,r0,#1              ;140
000150  e5840010          STR      r0,[r4,#0x10]         ;140
000154  ef000003          SVC      0x3  ; formerly SWI   ;141
000158  e3a00000          MOV      r0,#0                 ;142
00015c  e5c60000          STRB     r0,[r6,#0]            ;142

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -