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

📄 os_mem.txt

📁 在KEIL下成功使用UCOS-II嵌入式操作系统
💻 TXT
📖 第 1 页 / 共 2 页
字号:
000160  e1a00005          MOV      r0,r5                 ;143
000164  eaffffef          B        |L1.296|              ;143
                  |L1.360|
000168  ef000003          SVC      0x3  ; formerly SWI   ;145
00016c  e3a00071          MOV      r0,#0x71              ;146
000170  e5c60000          STRB     r0,[r6,#0]            ;146
000174  e3a00000          MOV      r0,#0                 ;147
000178  eaffffea          B        |L1.296|              ;147
                          ENDP

                  OSMemPut PROC
;;;168    INT8U  OSMemPut (OS_MEM  *pmem, void *pblk)
;;;169    {
00017c  e92d4070          PUSH     {r4-r6,lr}
000180  e1a05000          MOV      r5,r0
000184  e1a04001          MOV      r4,r1
;;;170    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;171        OS_CPU_SR  cpu_sr;
;;;172    #endif    
;;;173        
;;;174        
;;;175    #if OS_ARG_CHK_EN > 0
;;;176        if (pmem == (OS_MEM *)0) {                   /* Must point to a valid memory partition             */
000188  e3550000          CMP      r5,#0
00018c  1a000001          BNE      |L1.408|
;;;177            return (OS_MEM_INVALID_PMEM);
000190  e3a00074          MOV      r0,#0x74
;;;178        }
;;;179        if (pblk == (void *)0) {                     /* Must release a valid block                         */
;;;180            return (OS_MEM_INVALID_PBLK);
;;;181        }
;;;182    #endif
;;;183        OS_ENTER_CRITICAL();
;;;184        if (pmem->OSMemNFree >= pmem->OSMemNBlks) {  /* Make sure all blocks not already returned          */
;;;185            OS_EXIT_CRITICAL();
;;;186            return (OS_MEM_FULL);
;;;187        }
;;;188        *(void **)pblk      = pmem->OSMemFreeList;   /* Insert released block into free block list         */
;;;189        pmem->OSMemFreeList = pblk;
;;;190        pmem->OSMemNFree++;                          /* One more memory block in this partition            */
;;;191        OS_EXIT_CRITICAL();
;;;192        return (OS_NO_ERR);                          /* Notify caller that memory block was released       */
;;;193    }
                  |L1.404|
000194  e8bd8070          POP      {r4-r6,pc}
                  |L1.408|
000198  e3540000          CMP      r4,#0                 ;179
00019c  1a000001          BNE      |L1.424|              ;179
0001a0  e3a00073          MOV      r0,#0x73              ;180
0001a4  eafffffa          B        |L1.404|              ;180
                  |L1.424|
0001a8  ef000002          SVC      0x2  ; formerly SWI   ;183
0001ac  e5950010          LDR      r0,[r5,#0x10]         ;184
0001b0  e595100c          LDR      r1,[r5,#0xc]          ;184
0001b4  e1500001          CMP      r0,r1                 ;184
0001b8  3a000002          BCC      |L1.456|              ;184
0001bc  ef000003          SVC      0x3  ; formerly SWI   ;185
0001c0  e3a00072          MOV      r0,#0x72              ;186
0001c4  eafffff2          B        |L1.404|              ;186
                  |L1.456|
0001c8  e5950004          LDR      r0,[r5,#4]            ;188
0001cc  e5840000          STR      r0,[r4,#0]            ;188
0001d0  e5854004          STR      r4,[r5,#4]            ;189
0001d4  e5950010          LDR      r0,[r5,#0x10]         ;190
0001d8  e2800001          ADD      r0,r0,#1              ;190
0001dc  e5850010          STR      r0,[r5,#0x10]         ;190
0001e0  ef000003          SVC      0x3  ; formerly SWI   ;191
0001e4  e3a00000          MOV      r0,#0                 ;192
0001e8  eaffffe9          B        |L1.404|              ;192
                          ENDP

                  OSMemQuery PROC
;;;214    INT8U  OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *pdata)
;;;215    {
0001ec  e92d4070          PUSH     {r4-r6,lr}
0001f0  e1a04000          MOV      r4,r0
0001f4  e1a05001          MOV      r5,r1
;;;216    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;217        OS_CPU_SR  cpu_sr;
;;;218    #endif    
;;;219        
;;;220        
;;;221    #if OS_ARG_CHK_EN > 0
;;;222        if (pmem == (OS_MEM *)0) {                   /* Must point to a valid memory partition             */
0001f8  e3540000          CMP      r4,#0
0001fc  1a000001          BNE      |L1.520|
;;;223            return (OS_MEM_INVALID_PMEM);
000200  e3a00074          MOV      r0,#0x74
;;;224        }
;;;225        if (pdata == (OS_MEM_DATA *)0) {             /* Must release a valid storage area for the data     */
;;;226            return (OS_MEM_INVALID_PDATA);
;;;227        }
;;;228    #endif
;;;229        OS_ENTER_CRITICAL();
;;;230        pdata->OSAddr     = pmem->OSMemAddr;
;;;231        pdata->OSFreeList = pmem->OSMemFreeList;
;;;232        pdata->OSBlkSize  = pmem->OSMemBlkSize;
;;;233        pdata->OSNBlks    = pmem->OSMemNBlks;
;;;234        pdata->OSNFree    = pmem->OSMemNFree;
;;;235        OS_EXIT_CRITICAL();
;;;236        pdata->OSNUsed    = pdata->OSNBlks - pdata->OSNFree;
;;;237        return (OS_NO_ERR);
;;;238    }
                  |L1.516|
000204  e8bd8070          POP      {r4-r6,pc}
                  |L1.520|
000208  e3550000          CMP      r5,#0                 ;225
00020c  1a000001          BNE      |L1.536|              ;225
000210  e3a00075          MOV      r0,#0x75              ;226
000214  eafffffa          B        |L1.516|              ;226
                  |L1.536|
000218  ef000002          SVC      0x2  ; formerly SWI   ;229
00021c  e5940000          LDR      r0,[r4,#0]            ;230
000220  e5850000          STR      r0,[r5,#0]            ;230
000224  e5940004          LDR      r0,[r4,#4]            ;231
000228  e5850004          STR      r0,[r5,#4]            ;231
00022c  e5940008          LDR      r0,[r4,#8]            ;232
000230  e5850008          STR      r0,[r5,#8]            ;232
000234  e594000c          LDR      r0,[r4,#0xc]          ;233
000238  e585000c          STR      r0,[r5,#0xc]          ;233
00023c  e5940010          LDR      r0,[r4,#0x10]         ;234
000240  e5850010          STR      r0,[r5,#0x10]         ;234
000244  ef000003          SVC      0x3  ; formerly SWI   ;235
000248  e285100c          ADD      r1,r5,#0xc            ;236
00024c  e8910003          LDM      r1,{r0,r1}            ;236
000250  e0400001          SUB      r0,r0,r1              ;236
000254  e5850014          STR      r0,[r5,#0x14]         ;236
000258  e3a00000          MOV      r0,#0                 ;237
00025c  eaffffe8          B        |L1.516|              ;237
                          ENDP

                  OS_MemInit PROC
;;;271    
;;;272        pmem = (OS_MEM *)&OSMemTbl[0];                    /* Point to memory control block (MCB)           */
000260  e59f106c          LDR      r1,|L1.724|
;;;273        for (i = 0; i < (OS_MAX_MEM_PART - 1); i++) {     /* Init. list of free memory partitions          */
000264  e3a00000          MOV      r0,#0
000268  ea00000c          B        |L1.672|
;;;274            pmem->OSMemFreeList = (void *)&OSMemTbl[i+1]; /* Chain list of free partitions                 */
                  |L1.620|
00026c  e2802001          ADD      r2,r0,#1
000270  e0822102          ADD      r2,r2,r2,LSL #2
000274  e59f3058          LDR      r3,|L1.724|
000278  e0832102          ADD      r2,r3,r2,LSL #2
00027c  e5812004          STR      r2,[r1,#4]
;;;275            pmem->OSMemAddr     = (void *)0;              /* Store start address of memory partition       */
000280  e3a02000          MOV      r2,#0
000284  e5812000          STR      r2,[r1,#0]
;;;276            pmem->OSMemNFree    = 0;                      /* No free blocks                                */
000288  e5812010          STR      r2,[r1,#0x10]
;;;277            pmem->OSMemNBlks    = 0;                      /* No blocks                                     */
00028c  e581200c          STR      r2,[r1,#0xc]
;;;278            pmem->OSMemBlkSize  = 0;                      /* Zero size                                     */
000290  e5812008          STR      r2,[r1,#8]
;;;279            pmem++;
000294  e2811014          ADD      r1,r1,#0x14
000298  e2802001          ADD      r2,r0,#1              ;273
00029c  e3c20801          BIC      r0,r2,#0x10000        ;273
                  |L1.672|
0002a0  e3500004          CMP      r0,#4                 ;273
0002a4  bafffff0          BLT      |L1.620|              ;273
;;;280        }
;;;281        pmem->OSMemFreeList = (void *)0;                  /* Initialize last node                          */
0002a8  e3a02000          MOV      r2,#0
0002ac  e5812004          STR      r2,[r1,#4]
;;;282        pmem->OSMemAddr     = (void *)0;                  /* Store start address of memory partition       */
0002b0  e5812000          STR      r2,[r1,#0]
;;;283        pmem->OSMemNFree    = 0;                          /* No free blocks                                */
0002b4  e5812010          STR      r2,[r1,#0x10]
;;;284        pmem->OSMemNBlks    = 0;                          /* No blocks                                     */
0002b8  e581200c          STR      r2,[r1,#0xc]
;;;285        pmem->OSMemBlkSize  = 0;                          /* Zero size                                     */
0002bc  e5812008          STR      r2,[r1,#8]
;;;286    
;;;287        OSMemFreeList       = (OS_MEM *)&OSMemTbl[0];     /* Point to beginning of free list               */
0002c0  e59f200c          LDR      r2,|L1.724|
0002c4  e59f3004          LDR      r3,|L1.720|
0002c8  e5832000          STR      r2,[r3,#0]  ; OSMemFreeList
;;;288    #endif
;;;289    }
0002cc  e12fff1e          BX       lr
                  |L1.720|
0002d0  00000000          DCD      OSMemFreeList
                  |L1.724|
0002d4  00000000          DCD      OSMemTbl
                          ENDP


⌨️ 快捷键说明

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