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

📄 os_mem.txt

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 TXT
📖 第 1 页 / 共 2 页
字号:
000260  e1a00005          MOV      r0,r5
000264  ebfffffe          BL       OS_StrCopy
000268  e1a08000          MOV      r8,r0
00026c  e1a00007          MOV      r0,r7
000270  ebfffffe          BL       OS_CPU_SR_Restore
000274  e3a00000          MOV      r0,#0
000278  e5c60000          STRB     r0,[r6,#0]
00027c  e1a00008          MOV      r0,r8
000280  eaffffe3          B        |L1.532|
                          ENDP

                  OSMemNameSet PROC
;;;252    void  OSMemNameSet (OS_MEM *pmem, INT8U *pname, INT8U *err)
;;;253    {
000284  e92d41f0          PUSH     {r4-r8,lr}
000288  e1a04000          MOV      r4,r0
00028c  e1a05001          MOV      r5,r1
000290  e1a06002          MOV      r6,r2
;;;254        INT8U      len;
;;;255    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;256        OS_CPU_SR  cpu_sr = 0;
000294  e3a08000          MOV      r8,#0
;;;257    #endif
;;;258    
;;;259    
;;;260    
;;;261        OS_ENTER_CRITICAL();
000298  ebfffffe          BL       OS_CPU_SR_Save
00029c  e1a08000          MOV      r8,r0
;;;262    #if OS_ARG_CHK_EN > 0
;;;263        if (err == (INT8U *)0) {                     /* Validate 'err'                                     */
0002a0  e3560000          CMP      r6,#0
0002a4  1a000003          BNE      |L1.696|
;;;264            OS_EXIT_CRITICAL();
0002a8  e1a00008          MOV      r0,r8
0002ac  ebfffffe          BL       OS_CPU_SR_Restore
                  |L1.688|
;;;265            return;
;;;266        }
;;;267        if (pmem == (OS_MEM *)0) {                   /* Is 'pmem' a NULL pointer?                          */
;;;268            OS_EXIT_CRITICAL();                      /* Yes                                                */
;;;269            *err = OS_ERR_MEM_INVALID_PMEM;
;;;270            return;
;;;271        }
;;;272        if (pname == (INT8U *)0) {                   /* Is 'pname' a NULL pointer?                         */
;;;273            OS_EXIT_CRITICAL();                      /* Yes                                                */
;;;274            *err = OS_ERR_PNAME_NULL;
;;;275            return;
;;;276        }
;;;277    #endif
;;;278        len = OS_StrLen(pname);                      /* Can we fit the string in the storage area?         */
;;;279        if (len > (OS_MEM_NAME_SIZE - 1)) {          /* No                                                 */
;;;280            OS_EXIT_CRITICAL();
;;;281            *err = OS_ERR_MEM_NAME_TOO_LONG;
;;;282            return;
;;;283        }
;;;284        (void)OS_StrCopy(pmem->OSMemName, pname);    /* Yes, copy name to the memory partition header      */
;;;285        OS_EXIT_CRITICAL();
;;;286        *err = OS_ERR_NONE;
;;;287    }
0002b0  e8bd41f0          POP      {r4-r8,lr}
0002b4  e12fff1e          BX       lr
                  |L1.696|
0002b8  e3540000          CMP      r4,#0
0002bc  1a000004          BNE      |L1.724|
0002c0  e1a00008          MOV      r0,r8
0002c4  ebfffffe          BL       OS_CPU_SR_Restore
0002c8  e3a00060          MOV      r0,#0x60
0002cc  e5c60000          STRB     r0,[r6,#0]
0002d0  eafffff6          B        |L1.688|
                  |L1.724|
0002d4  e3550000          CMP      r5,#0
0002d8  1a000004          BNE      |L1.752|
0002dc  e1a00008          MOV      r0,r8
0002e0  ebfffffe          BL       OS_CPU_SR_Restore
0002e4  e3a0000c          MOV      r0,#0xc
0002e8  e5c60000          STRB     r0,[r6,#0]
0002ec  eaffffef          B        |L1.688|
                  |L1.752|
0002f0  e1a00005          MOV      r0,r5
0002f4  ebfffffe          BL       OS_StrLen
0002f8  e1a07000          MOV      r7,r0
0002fc  e357000f          CMP      r7,#0xf
000300  da000004          BLE      |L1.792|
000304  e1a00008          MOV      r0,r8
000308  ebfffffe          BL       OS_CPU_SR_Restore
00030c  e3a00063          MOV      r0,#0x63
000310  e5c60000          STRB     r0,[r6,#0]
000314  eaffffe5          B        |L1.688|
                  |L1.792|
000318  e1a01005          MOV      r1,r5
00031c  e2840014          ADD      r0,r4,#0x14
000320  ebfffffe          BL       OS_StrCopy
000324  e1a00008          MOV      r0,r8
000328  ebfffffe          BL       OS_CPU_SR_Restore
00032c  e3a00000          MOV      r0,#0
000330  e5c60000          STRB     r0,[r6,#0]
000334  eaffffdd          B        |L1.688|
                          ENDP

                  OSMemPut PROC
;;;309    INT8U  OSMemPut (OS_MEM *pmem, void *pblk)
;;;310    {
000338  e92d4070          PUSH     {r4-r6,lr}
00033c  e1a04000          MOV      r4,r0
000340  e1a05001          MOV      r5,r1
;;;311    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;312        OS_CPU_SR  cpu_sr = 0;
000344  e3a06000          MOV      r6,#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             */
000348  e3540000          CMP      r4,#0
00034c  1a000002          BNE      |L1.860|
;;;319            return (OS_ERR_MEM_INVALID_PMEM);
000350  e3a00060          MOV      r0,#0x60
                  |L1.852|
000354  e8bd4070          POP      {r4-r6,lr}
;;;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();
;;;326        if (pmem->OSMemNFree >= pmem->OSMemNBlks) {  /* Make sure all blocks not already returned          */
;;;327            OS_EXIT_CRITICAL();
;;;328            return (OS_ERR_MEM_FULL);
;;;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    }
000358  e12fff1e          BX       lr
                  |L1.860|
00035c  e3550000          CMP      r5,#0
000360  1a000001          BNE      |L1.876|
000364  e3a0005f          MOV      r0,#0x5f
000368  eafffff9          B        |L1.852|
                  |L1.876|
00036c  ebfffffe          BL       OS_CPU_SR_Save
000370  e1a06000          MOV      r6,r0
000374  e5940010          LDR      r0,[r4,#0x10]
000378  e594100c          LDR      r1,[r4,#0xc]
00037c  e1500001          CMP      r0,r1
000380  3a000003          BCC      |L1.916|
000384  e1a00006          MOV      r0,r6
000388  ebfffffe          BL       OS_CPU_SR_Restore
00038c  e3a0005e          MOV      r0,#0x5e
000390  eaffffef          B        |L1.852|
                  |L1.916|
000394  e5940004          LDR      r0,[r4,#4]
000398  e5850000          STR      r0,[r5,#0]
00039c  e5845004          STR      r5,[r4,#4]
0003a0  e5940010          LDR      r0,[r4,#0x10]
0003a4  e2800001          ADD      r0,r0,#1
0003a8  e5840010          STR      r0,[r4,#0x10]
0003ac  e1a00006          MOV      r0,r6
0003b0  ebfffffe          BL       OS_CPU_SR_Restore
0003b4  e3a00000          MOV      r0,#0
0003b8  eaffffe5          B        |L1.852|
                          ENDP

                  OSMemQuery PROC
;;;356    INT8U  OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *p_mem_data)
;;;357    {
0003bc  e92d4070          PUSH     {r4-r6,lr}
0003c0  e1a04000          MOV      r4,r0
0003c4  e1a05001          MOV      r5,r1
;;;358    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;359        OS_CPU_SR  cpu_sr = 0;
0003c8  e3a06000          MOV      r6,#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             */
0003cc  e3540000          CMP      r4,#0
0003d0  1a000002          BNE      |L1.992|
;;;366            return (OS_ERR_MEM_INVALID_PMEM);
0003d4  e3a00060          MOV      r0,#0x60
                  |L1.984|
0003d8  e8bd4070          POP      {r4-r6,lr}
;;;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();
;;;373        p_mem_data->OSAddr     = pmem->OSMemAddr;
;;;374        p_mem_data->OSFreeList = pmem->OSMemFreeList;
;;;375        p_mem_data->OSBlkSize  = pmem->OSMemBlkSize;
;;;376        p_mem_data->OSNBlks    = pmem->OSMemNBlks;
;;;377        p_mem_data->OSNFree    = pmem->OSMemNFree;
;;;378        OS_EXIT_CRITICAL();
;;;379        p_mem_data->OSNUsed    = p_mem_data->OSNBlks - p_mem_data->OSNFree;
;;;380        return (OS_ERR_NONE);
;;;381    }
0003dc  e12fff1e          BX       lr
                  |L1.992|
0003e0  e3550000          CMP      r5,#0
0003e4  1a000001          BNE      |L1.1008|
0003e8  e3a00061          MOV      r0,#0x61
0003ec  eafffff9          B        |L1.984|
                  |L1.1008|
0003f0  ebfffffe          BL       OS_CPU_SR_Save
0003f4  e1a06000          MOV      r6,r0
0003f8  e5940000          LDR      r0,[r4,#0]
0003fc  e5850000          STR      r0,[r5,#0]
000400  e5940004          LDR      r0,[r4,#4]
000404  e5850004          STR      r0,[r5,#4]
000408  e5940008          LDR      r0,[r4,#8]
00040c  e5850008          STR      r0,[r5,#8]
000410  e594000c          LDR      r0,[r4,#0xc]
000414  e585000c          STR      r0,[r5,#0xc]
000418  e5940010          LDR      r0,[r4,#0x10]
00041c  e5850010          STR      r0,[r5,#0x10]
000420  e1a00006          MOV      r0,r6
000424  ebfffffe          BL       OS_CPU_SR_Restore
000428  e285100c          ADD      r1,r5,#0xc
00042c  e8910003          LDM      r1,{r0,r1}
000430  e0400001          SUB      r0,r0,r1
000434  e5850014          STR      r0,[r5,#0x14]
000438  e3a00000          MOV      r0,#0
00043c  eaffffe5          B        |L1.984|
                          ENDP

                  OS_MemInit PROC
;;;399    void  OS_MemInit (void)
;;;400    {
000440  e92d4070          PUSH     {r4-r6,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          */
000444  e3a010b4          MOV      r1,#0xb4
000448  e59f0074          LDR      r0,|L1.1220|
00044c  ebfffffe          BL       OS_MemClr
;;;416        pmem = &OSMemTbl[0];                                  /* Point to memory control block (MCB)       */
000450  e59f506c          LDR      r5,|L1.1220|
;;;417        for (i = 0; i < (OS_MAX_MEM_PART - 1); i++) {         /* Init. list of free memory partitions      */
000454  e3a04000          MOV      r4,#0
000458  ea00000b          B        |L1.1164|
                  |L1.1116|
;;;418            pmem->OSMemFreeList = (void *)&OSMemTbl[i+1];     /* Chain list of free partitions             */
00045c  e2840001          ADD      r0,r4,#1
000460  e0800180          ADD      r0,r0,r0,LSL #3
000464  e59f1058          LDR      r1,|L1.1220|
000468  e0810100          ADD      r0,r1,r0,LSL #2
00046c  e5850004          STR      r0,[r5,#4]
;;;419    #if OS_MEM_NAME_SIZE > 1
;;;420            pmem->OSMemName[0]  = '?';                        /* Unknown name                              */
000470  e3a0003f          MOV      r0,#0x3f
000474  e5c50014          STRB     r0,[r5,#0x14]
;;;421            pmem->OSMemName[1]  = OS_ASCII_NUL;
000478  e3a00000          MOV      r0,#0
00047c  e5c50015          STRB     r0,[r5,#0x15]
;;;422    #endif
;;;423            pmem++;
000480  e2855024          ADD      r5,r5,#0x24
000484  e2840001          ADD      r0,r4,#1
000488  e3c04801          BIC      r4,r0,#0x10000
                  |L1.1164|
00048c  e3540004          CMP      r4,#4
000490  bafffff1          BLT      |L1.1116|
;;;424        }
;;;425        pmem->OSMemFreeList = (void *)0;                      /* Initialize last node                      */
000494  e3a00000          MOV      r0,#0
000498  e5850004          STR      r0,[r5,#4]
;;;426    #if OS_MEM_NAME_SIZE > 1
;;;427        pmem->OSMemName[0]  = '?';                            /* Unknown name                              */
00049c  e3a0003f          MOV      r0,#0x3f
0004a0  e5c50014          STRB     r0,[r5,#0x14]
;;;428        pmem->OSMemName[1]  = OS_ASCII_NUL;
0004a4  e3a00000          MOV      r0,#0
0004a8  e5c50015          STRB     r0,[r5,#0x15]
;;;429    #endif
;;;430    
;;;431        OSMemFreeList       = &OSMemTbl[0];                   /* Point to beginning of free list           */
0004ac  e59f0010          LDR      r0,|L1.1220|
0004b0  e59f1008          LDR      r1,|L1.1216|
0004b4  e5810000          STR      r0,[r1,#0]  ; OSMemFreeList
;;;432    #endif
;;;433    }
0004b8  e8bd4070          POP      {r4-r6,lr}
0004bc  e12fff1e          BX       lr
                          ENDP

                  |L1.1216|
0004c0  00000000          DCD      OSMemFreeList
                  |L1.1220|
0004c4  00000000          DCD      OSMemTbl

⌨️ 快捷键说明

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