os_mem.txt

来自「uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的」· 文本 代码 · 共 369 行 · 第 1/2 页

TXT
369
字号
000154  e5c50000          STRB     r0,[r5,#0]            ;144
000158  e3a00000          MOV      r0,#0                 ;145
00015c  eaffffea          B        |L1.268|
;;;147    /*$PAGE*/
                          ENDP

                  OSMemPut PROC
;;;166    INT8U  OSMemPut (OS_MEM  *pmem, void *pblk)
;;;167    {
000160  e92d4070          PUSH     {r4-r6,lr}
000164  e1a04000          MOV      r4,r0
000168  e1a05001          MOV      r5,r1
;;;168    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;169        OS_CPU_SR  cpu_sr;
;;;170    #endif    
;;;171        
;;;172        
;;;173    #if OS_ARG_CHK_EN > 0
;;;174        if (pmem == (OS_MEM *)0) {                   /* Must point to a valid memory partition             */
00016c  e3540000          CMP      r4,#0
000170  1a000002          BNE      |L1.384|
;;;175            return (OS_MEM_INVALID_PMEM);
000174  e3a00074          MOV      r0,#0x74
                  |L1.376|
000178  e8bd4070          POP      {r4-r6,lr}
;;;176        }
;;;177        if (pblk == (void *)0) {                     /* Must release a valid block                         */
;;;178            return (OS_MEM_INVALID_PBLK);
;;;179        }
;;;180    #endif
;;;181        OS_ENTER_CRITICAL();
;;;182        if (pmem->OSMemNFree >= pmem->OSMemNBlks) {  /* Make sure all blocks not already returned          */
;;;183            OS_EXIT_CRITICAL();
;;;184            return (OS_MEM_FULL);
;;;185        }
;;;186        *(void **)pblk      = pmem->OSMemFreeList;   /* Insert released block into free block list         */
;;;187        pmem->OSMemFreeList = pblk;
;;;188        pmem->OSMemNFree++;                          /* One more memory block in this partition            */
;;;189        OS_EXIT_CRITICAL();
;;;190        return (OS_NO_ERR);                          /* Notify caller that memory block was released       */
;;;191    }
00017c  e12fff1e          BX       lr
                  |L1.384|
000180  e3550000          CMP      r5,#0                 ;177
000184  1a000001          BNE      |L1.400|
000188  e3a00073          MOV      r0,#0x73              ;178
00018c  eafffff9          B        |L1.376|
                  |L1.400|
000190  ef000002          SVC      #0x2                  ;181
000194  e5940010          LDR      r0,[r4,#0x10]         ;182
000198  e594100c          LDR      r1,[r4,#0xc]          ;182
00019c  e1500001          CMP      r0,r1                 ;182
0001a0  3a000002          BCC      |L1.432|
0001a4  ef000003          SVC      #0x3                  ;183
0001a8  e3a00072          MOV      r0,#0x72              ;184
0001ac  eafffff1          B        |L1.376|
                  |L1.432|
0001b0  e5940004          LDR      r0,[r4,#4]            ;186
0001b4  e5850000          STR      r0,[r5,#0]            ;186
0001b8  e5845004          STR      r5,[r4,#4]            ;187
0001bc  e5940010          LDR      r0,[r4,#0x10]         ;188
0001c0  e2800001          ADD      r0,r0,#1              ;188
0001c4  e5840010          STR      r0,[r4,#0x10]         ;188
0001c8  ef000003          SVC      #0x3                  ;189
0001cc  e3a00000          MOV      r0,#0                 ;190
0001d0  eaffffe8          B        |L1.376|
;;;192    /*$PAGE*/
                          ENDP

                  OSMemQuery PROC
;;;212    INT8U  OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *pdata)
;;;213    {
0001d4  e92d4070          PUSH     {r4-r6,lr}
0001d8  e1a05000          MOV      r5,r0
0001dc  e1a04001          MOV      r4,r1
;;;214    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;215        OS_CPU_SR  cpu_sr;
;;;216    #endif    
;;;217        
;;;218        
;;;219    #if OS_ARG_CHK_EN > 0
;;;220        if (pmem == (OS_MEM *)0) {                   /* Must point to a valid memory partition             */
0001e0  e3550000          CMP      r5,#0
0001e4  1a000002          BNE      |L1.500|
;;;221            return (OS_MEM_INVALID_PMEM);
0001e8  e3a00074          MOV      r0,#0x74
                  |L1.492|
0001ec  e8bd4070          POP      {r4-r6,lr}
;;;222        }
;;;223        if (pdata == (OS_MEM_DATA *)0) {             /* Must release a valid storage area for the data     */
;;;224            return (OS_MEM_INVALID_PDATA);
;;;225        }
;;;226    #endif
;;;227        OS_ENTER_CRITICAL();
;;;228        pdata->OSAddr     = pmem->OSMemAddr;
;;;229        pdata->OSFreeList = pmem->OSMemFreeList;
;;;230        pdata->OSBlkSize  = pmem->OSMemBlkSize;
;;;231        pdata->OSNBlks    = pmem->OSMemNBlks;
;;;232        pdata->OSNFree    = pmem->OSMemNFree;
;;;233        OS_EXIT_CRITICAL();
;;;234        pdata->OSNUsed    = pdata->OSNBlks - pdata->OSNFree;
;;;235        return (OS_NO_ERR);
;;;236    }
0001f0  e12fff1e          BX       lr
                  |L1.500|
0001f4  e3540000          CMP      r4,#0                 ;223
0001f8  1a000001          BNE      |L1.516|
0001fc  e3a00075          MOV      r0,#0x75              ;224
000200  eafffff9          B        |L1.492|
                  |L1.516|
000204  ef000002          SVC      #0x2                  ;227
000208  e5950000          LDR      r0,[r5,#0]            ;228
00020c  e5840000          STR      r0,[r4,#0]            ;228
000210  e5950004          LDR      r0,[r5,#4]            ;229
000214  e5840004          STR      r0,[r4,#4]            ;229
000218  e5950008          LDR      r0,[r5,#8]            ;230
00021c  e5840008          STR      r0,[r4,#8]            ;230
000220  e595000c          LDR      r0,[r5,#0xc]          ;231
000224  e584000c          STR      r0,[r4,#0xc]          ;231
000228  e5950010          LDR      r0,[r5,#0x10]         ;232
00022c  e5840010          STR      r0,[r4,#0x10]         ;232
000230  ef000003          SVC      #0x3                  ;233
000234  e284100c          ADD      r1,r4,#0xc            ;234
000238  e8910003          LDM      r1,{r0,r1}            ;234
00023c  e0400001          SUB      r0,r0,r1              ;234
000240  e5840014          STR      r0,[r4,#0x14]         ;234
000244  e3a00000          MOV      r0,#0                 ;235
000248  eaffffe7          B        |L1.492|
;;;237    #endif                                           /* OS_MEM_QUERY_EN                                    */
                          ENDP

                  OS_MemInit PROC
;;;269    
;;;270        pmem = (OS_MEM *)&OSMemTbl[0];                    /* Point to memory control block (MCB)           */
00024c  e59f005c          LDR      r0,|L1.688|
;;;271        for (i = 0; i < (OS_MAX_MEM_PART - 1); i++) {     /* Init. list of free memory partitions          */
000250  e3a01000          MOV      r1,#0
000254  e59f3054          LDR      r3,|L1.688|
000258  e3a02000          MOV      r2,#0
                  |L1.604|
;;;272            pmem->OSMemFreeList = (void *)&OSMemTbl[i+1]; /* Chain list of free partitions                 */
00025c  e2811001          ADD      r1,r1,#1
000260  e081c101          ADD      r12,r1,r1,LSL #2
000264  e083c10c          ADD      r12,r3,r12,LSL #2
000268  e580c004          STR      r12,[r0,#4]
;;;273            pmem->OSMemAddr     = (void *)0;              /* Store start address of memory partition       */
00026c  e5802000          STR      r2,[r0,#0]
;;;274            pmem->OSMemNFree    = 0;                      /* No free blocks                                */
000270  e5802010          STR      r2,[r0,#0x10]
;;;275            pmem->OSMemNBlks    = 0;                      /* No blocks                                     */
000274  e580200c          STR      r2,[r0,#0xc]
;;;276            pmem->OSMemBlkSize  = 0;                      /* Zero size                                     */
000278  e5802008          STR      r2,[r0,#8]
;;;277            pmem++;
00027c  e2800014          ADD      r0,r0,#0x14
000280  e3c11801          BIC      r1,r1,#0x10000        ;271
000284  e3510004          CMP      r1,#4                 ;271
000288  3afffff3          BCC      |L1.604|
;;;278        }
;;;279        pmem->OSMemFreeList = (void *)0;                  /* Initialize last node                          */
00028c  e5802004          STR      r2,[r0,#4]
;;;280        pmem->OSMemAddr     = (void *)0;                  /* Store start address of memory partition       */
000290  e5802000          STR      r2,[r0,#0]
;;;281        pmem->OSMemNFree    = 0;                          /* No free blocks                                */
000294  e5802010          STR      r2,[r0,#0x10]
;;;282        pmem->OSMemNBlks    = 0;                          /* No blocks                                     */
000298  e580200c          STR      r2,[r0,#0xc]
;;;283        pmem->OSMemBlkSize  = 0;                          /* Zero size                                     */
00029c  e5802008          STR      r2,[r0,#8]
;;;284    
;;;285        OSMemFreeList       = (OS_MEM *)&OSMemTbl[0];     /* Point to beginning of free list               */
0002a0  e59f0004          LDR      r0,|L1.684|
0002a4  e5803000          STR      r3,[r0,#0]  ; OSMemFreeList
;;;286    #endif
;;;287    }
0002a8  e12fff1e          BX       lr
;;;288    #endif                                           /* OS_MEM_EN                                          */
                          ENDP

                  |L1.684|
0002ac  00000000          DCD      OSMemFreeList
                  |L1.688|
0002b0  00000000          DCD      OSMemTbl

⌨️ 快捷键说明

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