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

📄 os_mem.txt

📁 ucos2 is a file system for embedded applications which can be used on any media, for which you can p
💻 TXT
📖 第 1 页 / 共 2 页
字号:
;;;259    
;;;260    #if OS_ARG_CHK_EN > 0
;;;261        if (perr == (INT8U *)0) {                    /* Validate 'perr'                                    */
;;;262            return;
;;;263        }
;;;264        if (pmem == (OS_MEM *)0) {                   /* Is 'pmem' a NULL pointer?                          */
;;;265            *perr = OS_ERR_MEM_INVALID_PMEM;
;;;266            return;
;;;267        }
;;;268        if (pname == (INT8U *)0) {                   /* Is 'pname' a NULL pointer?                         */
;;;269            *perr = OS_ERR_PNAME_NULL;
;;;270            return;
;;;271        }
;;;272    #endif
;;;273        if (OSIntNesting > 0) {                      /* See if trying to call from an ISR                  */
00015c  e59f017c          LDR      r0,|L1.736|
000160  e1a06001          MOV      r6,r1                 ;252
000164  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000168  e1a04002          MOV      r4,r2                 ;252
00016c  e3500000          CMP      r0,#0
;;;274            *perr = OS_ERR_NAME_SET_ISR;
000170  13a00012          MOVNE    r0,#0x12
;;;275            return;
000174  1a00000f          BNE      |L1.440|
;;;276        }
;;;277        OS_ENTER_CRITICAL();
000178  ebfffffe          BL       OS_CPU_SR_Save
00017c  e1a07000          MOV      r7,r0
;;;278        len = OS_StrLen(pname);                      /* Can we fit the string in the storage area?         */
000180  e1a00006          MOV      r0,r6
000184  ebfffffe          BL       OS_StrLen
;;;279        if (len > (OS_MEM_NAME_SIZE - 1)) {          /* No                                                 */
000188  e350000f          CMP      r0,#0xf
00018c  9a000003          BLS      |L1.416|
;;;280            OS_EXIT_CRITICAL();
000190  e1a00007          MOV      r0,r7
000194  ebfffffe          BL       OS_CPU_SR_Restore
;;;281            *perr = OS_ERR_MEM_NAME_TOO_LONG;
000198  e3a00063          MOV      r0,#0x63
;;;282            return;
00019c  ea000005          B        |L1.440|
                  |L1.416|
;;;283        }
;;;284        (void)OS_StrCopy(pmem->OSMemName, pname);    /* Yes, copy name to the memory partition header      */
0001a0  e1a01006          MOV      r1,r6
0001a4  e2850014          ADD      r0,r5,#0x14
0001a8  ebfffffe          BL       OS_StrCopy
;;;285        OS_EXIT_CRITICAL();
0001ac  e1a00007          MOV      r0,r7
0001b0  ebfffffe          BL       OS_CPU_SR_Restore
;;;286        *perr = OS_ERR_NONE;
0001b4  e3a00000          MOV      r0,#0
                  |L1.440|
0001b8  e5c40000          STRB     r0,[r4,#0]
;;;287    }
0001bc  e8bd41f0          POP      {r4-r8,lr}
0001c0  e12fff1e          BX       lr
;;;288    #endif
                          ENDP

                  OSMemPut PROC
;;;309    INT8U  OSMemPut (OS_MEM *pmem, void *pblk)
;;;310    {
0001c4  e92d4070          PUSH     {r4-r6,lr}
0001c8  e1a04000          MOV      r4,r0
0001cc  e1a05001          MOV      r5,r1
;;;311    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;312        OS_CPU_SR  cpu_sr = 0;
;;;313    #endif
;;;314    
;;;315    
;;;316    
;;;317    #if OS_ARG_CHK_EN > 0
;;;318        if (pmem == (OS_MEM *)0) {                   /* Must point to a valid memory partition             */
;;;319            return (OS_ERR_MEM_INVALID_PMEM);
;;;320        }
;;;321        if (pblk == (void *)0) {                     /* Must release a valid block                         */
;;;322            return (OS_ERR_MEM_INVALID_PBLK);
;;;323        }
;;;324    #endif
;;;325        OS_ENTER_CRITICAL();
0001d0  ebfffffe          BL       OS_CPU_SR_Save
;;;326        if (pmem->OSMemNFree >= pmem->OSMemNBlks) {  /* Make sure all blocks not already returned          */
0001d4  e5941010          LDR      r1,[r4,#0x10]
0001d8  e594200c          LDR      r2,[r4,#0xc]
0001dc  e1510002          CMP      r1,r2
0001e0  3a000003          BCC      |L1.500|
;;;327            OS_EXIT_CRITICAL();
0001e4  ebfffffe          BL       OS_CPU_SR_Restore
;;;328            return (OS_ERR_MEM_FULL);
0001e8  e3a0005e          MOV      r0,#0x5e
                  |L1.492|
0001ec  e8bd4070          POP      {r4-r6,lr}
;;;329        }
;;;330        *(void **)pblk      = pmem->OSMemFreeList;   /* Insert released block into free block list         */
;;;331        pmem->OSMemFreeList = pblk;
;;;332        pmem->OSMemNFree++;                          /* One more memory block in this partition            */
;;;333        OS_EXIT_CRITICAL();
;;;334        return (OS_ERR_NONE);                        /* Notify caller that memory block was released       */
;;;335    }
0001f0  e12fff1e          BX       lr
                  |L1.500|
0001f4  e5941004          LDR      r1,[r4,#4]            ;330
0001f8  e5851000          STR      r1,[r5,#0]            ;331
0001fc  e5845004          STR      r5,[r4,#4]            ;332
000200  e5941010          LDR      r1,[r4,#0x10]         ;332
000204  e2811001          ADD      r1,r1,#1              ;332
000208  e5841010          STR      r1,[r4,#0x10]         ;332
00020c  ebfffffe          BL       OS_CPU_SR_Restore
000210  e3a00000          MOV      r0,#0                 ;334
000214  eafffff4          B        |L1.492|
;;;336    /*$PAGE*/
                          ENDP

                  OSMemQuery PROC
;;;356    INT8U  OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *p_mem_data)
;;;357    {
000218  e92d4070          PUSH     {r4-r6,lr}
00021c  e1a05000          MOV      r5,r0
000220  e1a04001          MOV      r4,r1
;;;358    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;359        OS_CPU_SR  cpu_sr = 0;
;;;360    #endif
;;;361    
;;;362    
;;;363    
;;;364    #if OS_ARG_CHK_EN > 0
;;;365        if (pmem == (OS_MEM *)0) {                   /* Must point to a valid memory partition             */
;;;366            return (OS_ERR_MEM_INVALID_PMEM);
;;;367        }
;;;368        if (p_mem_data == (OS_MEM_DATA *)0) {        /* Must release a valid storage area for the data     */
;;;369            return (OS_ERR_MEM_INVALID_PDATA);
;;;370        }
;;;371    #endif
;;;372        OS_ENTER_CRITICAL();
000224  ebfffffe          BL       OS_CPU_SR_Save
;;;373        p_mem_data->OSAddr     = pmem->OSMemAddr;
000228  e5951000          LDR      r1,[r5,#0]
;;;374        p_mem_data->OSFreeList = pmem->OSMemFreeList;
00022c  e5841000          STR      r1,[r4,#0]
000230  e5951004          LDR      r1,[r5,#4]
;;;375        p_mem_data->OSBlkSize  = pmem->OSMemBlkSize;
000234  e5841004          STR      r1,[r4,#4]
000238  e5951008          LDR      r1,[r5,#8]
;;;376        p_mem_data->OSNBlks    = pmem->OSMemNBlks;
00023c  e5841008          STR      r1,[r4,#8]
000240  e595100c          LDR      r1,[r5,#0xc]
;;;377        p_mem_data->OSNFree    = pmem->OSMemNFree;
000244  e584100c          STR      r1,[r4,#0xc]
000248  e5951010          LDR      r1,[r5,#0x10]
00024c  e5841010          STR      r1,[r4,#0x10]
;;;378        OS_EXIT_CRITICAL();
000250  ebfffffe          BL       OS_CPU_SR_Restore
;;;379        p_mem_data->OSNUsed    = p_mem_data->OSNBlks - p_mem_data->OSNFree;
000254  e284100c          ADD      r1,r4,#0xc
000258  e8910003          LDM      r1,{r0,r1}
00025c  e0400001          SUB      r0,r0,r1
000260  e5840014          STR      r0,[r4,#0x14]
;;;380        return (OS_ERR_NONE);
000264  e8bd4070          POP      {r4-r6,lr}
000268  e3a00000          MOV      r0,#0
;;;381    }
00026c  e12fff1e          BX       lr
;;;382    #endif                                           /* OS_MEM_QUERY_EN                                    */
                          ENDP

                  OS_MemInit PROC
;;;399    void  OS_MemInit (void)
;;;400    {
000270  e92d4010          PUSH     {r4,lr}
;;;401    #if OS_MAX_MEM_PART == 1
;;;402        OS_MemClr((INT8U *)&OSMemTbl[0], sizeof(OSMemTbl));   /* Clear the memory partition table          */
;;;403        OSMemFreeList               = (OS_MEM *)&OSMemTbl[0]; /* Point to beginning of free list           */
;;;404    #if OS_MEM_NAME_SIZE > 1
;;;405        OSMemFreeList->OSMemName[0] = '?';                    /* Unknown name                              */
;;;406        OSMemFreeList->OSMemName[1] = OS_ASCII_NUL;
;;;407    #endif
;;;408    #endif
;;;409    
;;;410    #if OS_MAX_MEM_PART >= 2
;;;411        OS_MEM  *pmem;
;;;412        INT16U   i;
;;;413    
;;;414    
;;;415        OS_MemClr((INT8U *)&OSMemTbl[0], sizeof(OSMemTbl));   /* Clear the memory partition table          */
000274  e59f0068          LDR      r0,|L1.740|
000278  e3a010b4          MOV      r1,#0xb4
00027c  ebfffffe          BL       OS_MemClr
;;;416        pmem = &OSMemTbl[0];                                  /* Point to memory control block (MCB)       */
000280  e59f005c          LDR      r0,|L1.740|
;;;417        for (i = 0; i < (OS_MAX_MEM_PART - 1); i++) {         /* Init. list of free memory partitions      */
000284  e3a01000          MOV      r1,#0
000288  e2803000          ADD      r3,r0,#0
00028c  e1a0c001          MOV      r12,r1
000290  e3a0203f          MOV      r2,#0x3f
                  |L1.660|
;;;418            pmem->OSMemFreeList = (void *)&OSMemTbl[i+1];     /* Chain list of free partitions             */
000294  e081e181          ADD      lr,r1,r1,LSL #3
000298  e083e10e          ADD      lr,r3,lr,LSL #2
00029c  e28ee024          ADD      lr,lr,#0x24
0002a0  e580e004          STR      lr,[r0,#4]
0002a4  e2811001          ADD      r1,r1,#1              ;417
;;;419    #if OS_MEM_NAME_SIZE > 1
;;;420            pmem->OSMemName[0]  = '?';                        /* Unknown name                              */
0002a8  e5c02014          STRB     r2,[r0,#0x14]
0002ac  e3c11801          BIC      r1,r1,#0x10000        ;417
;;;421            pmem->OSMemName[1]  = OS_ASCII_NUL;
0002b0  e5c0c015          STRB     r12,[r0,#0x15]
0002b4  e3510004          CMP      r1,#4                 ;417
;;;422    #endif
;;;423            pmem++;
0002b8  e2800024          ADD      r0,r0,#0x24
0002bc  3afffff4          BCC      |L1.660|
;;;424        }
;;;425        pmem->OSMemFreeList = (void *)0;                      /* Initialize last node                      */
0002c0  e580c004          STR      r12,[r0,#4]
;;;426    #if OS_MEM_NAME_SIZE > 1
;;;427        pmem->OSMemName[0]  = '?';                            /* Unknown name                              */
0002c4  e5c02014          STRB     r2,[r0,#0x14]
;;;428        pmem->OSMemName[1]  = OS_ASCII_NUL;
0002c8  e5c0c015          STRB     r12,[r0,#0x15]
;;;429    #endif
;;;430    
;;;431        OSMemFreeList       = &OSMemTbl[0];                   /* Point to beginning of free list           */
0002cc  e59f0008          LDR      r0,|L1.732|
0002d0  e5803000          STR      r3,[r0,#0]  ; OSMemFreeList
;;;432    #endif
;;;433    }
0002d4  e8bd4010          POP      {r4,lr}
0002d8  e12fff1e          BX       lr
;;;434    #endif                                                    /* OS_MEM_EN                                 */
                          ENDP

                  |L1.732|
0002dc  00000000          DCD      OSMemFreeList
                  |L1.736|
0002e0  00000000          DCD      OSIntNesting
                  |L1.740|
0002e4  00000000          DCD      OSMemTbl

⌨️ 快捷键说明

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