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

📄 os_mem.txt

📁 ucos2.86版本结合STM板极支持包
💻 TXT
📖 第 1 页 / 共 2 页
字号:
000134  e8bde8bd          POP      {r4-r8,pc}
;;;225    #endif
                          ENDP

                  OSMemNameSet PROC
;;;251    void  OSMemNameSet (OS_MEM *pmem, INT8U *pname, INT8U *perr)
;;;252    {
000138  e92de92d          PUSH     {r4-r8,lr}
00013c  4605              MOV      r5,r0
00013e  460e              MOV      r6,r1
000140  4614              MOV      r4,r2
;;;253        INT8U      len;
;;;254    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;255        OS_CPU_SR  cpu_sr = 0;
;;;256    #endif
;;;257    
;;;258    
;;;259    
;;;260    #if OS_ARG_CHK_EN > 0
;;;261        if (perr == (INT8U *)0) {                    /* Validate 'perr'                                    */
000142  2c00              CMP      r4,#0
000144  d002              BEQ      |L1.332|
;;;262            return;
;;;263        }
;;;264        if (pmem == (OS_MEM *)0) {                   /* Is 'pmem' a NULL pointer?                          */
000146  b91d              CBNZ     r5,|L1.336|
;;;265            *perr = OS_ERR_MEM_INVALID_PMEM;
000148  2060              MOVS     r0,#0x60
00014a  7020              STRB     r0,[r4,#0]
                  |L1.332|
00014c  e8bde8bd          POP      {r4-r8,pc}
                  |L1.336|
;;;266            return;
;;;267        }
;;;268        if (pname == (INT8U *)0) {                   /* Is 'pname' a NULL pointer?                         */
000150  b91e              CBNZ     r6,|L1.346|
;;;269            *perr = OS_ERR_PNAME_NULL;
000152  200c              MOVS     r0,#0xc
000154  7020              STRB     r0,[r4,#0]
000156  e8bde8bd          POP      {r4-r8,pc}
                  |L1.346|
;;;270            return;
;;;271        }
;;;272    #endif
;;;273        if (OSIntNesting > 0) {                      /* See if trying to call from an ISR                  */
00015a  483f              LDR      r0,|L1.600|
00015c  7800              LDRB     r0,[r0,#0]  ; OSIntNesting
00015e  b118              CBZ      r0,|L1.360|
;;;274            *perr = OS_ERR_NAME_SET_ISR;
000160  2012              MOVS     r0,#0x12
000162  7020              STRB     r0,[r4,#0]
000164  e8bde8bd          POP      {r4-r8,pc}
                  |L1.360|
;;;275            return;
;;;276        }
;;;277        OS_ENTER_CRITICAL();
000168  f7fff7ff          BL       OS_CPU_SR_Save
00016c  4607              MOV      r7,r0
;;;278        len = OS_StrLen(pname);                      /* Can we fit the string in the storage area?         */
00016e  4630              MOV      r0,r6
000170  f7fff7ff          BL       OS_StrLen
;;;279        if (len > (OS_MEM_NAME_SIZE - 1)) {          /* No                                                 */
000174  280f              CMP      r0,#0xf
000176  d906              BLS      |L1.390|
;;;280            OS_EXIT_CRITICAL();
000178  4638              MOV      r0,r7
00017a  f7fff7ff          BL       OS_CPU_SR_Restore
;;;281            *perr = OS_ERR_MEM_NAME_TOO_LONG;
00017e  2063              MOVS     r0,#0x63
000180  7020              STRB     r0,[r4,#0]
000182  e8bde8bd          POP      {r4-r8,pc}
                  |L1.390|
;;;282            return;
;;;283        }
;;;284        (void)OS_StrCopy(pmem->OSMemName, pname);    /* Yes, copy name to the memory partition header      */
000186  4631              MOV      r1,r6
000188  f105f105          ADD      r0,r5,#0x14
00018c  f7fff7ff          BL       OS_StrCopy
;;;285        OS_EXIT_CRITICAL();
000190  4638              MOV      r0,r7
000192  f7fff7ff          BL       OS_CPU_SR_Restore
;;;286        *perr = OS_ERR_NONE;
000196  2000              MOVS     r0,#0
000198  7020              STRB     r0,[r4,#0]
;;;287    }
00019a  e8bde8bd          POP      {r4-r8,pc}
;;;288    #endif
                          ENDP

                  OSMemPut PROC
;;;309    INT8U  OSMemPut (OS_MEM *pmem, void *pblk)
;;;310    {
00019e  b570              PUSH     {r4-r6,lr}
0001a0  4604              MOV      r4,r0
0001a2  460d              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             */
0001a4  b90c              CBNZ     r4,|L1.426|
;;;319            return (OS_ERR_MEM_INVALID_PMEM);
0001a6  2060              MOVS     r0,#0x60
;;;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    }
0001a8  bd70              POP      {r4-r6,pc}
                  |L1.426|
0001aa  b90d              CBNZ     r5,|L1.432|
0001ac  205f              MOVS     r0,#0x5f
0001ae  bd70              POP      {r4-r6,pc}
                  |L1.432|
0001b0  f7fff7ff          BL       OS_CPU_SR_Save
0001b4  68e2              LDR      r2,[r4,#0xc]
0001b6  6921              LDR      r1,[r4,#0x10]
0001b8  4291              CMP      r1,r2
0001ba  d303              BCC      |L1.452|
0001bc  f7fff7ff          BL       OS_CPU_SR_Restore
0001c0  205e              MOVS     r0,#0x5e
0001c2  bd70              POP      {r4-r6,pc}
                  |L1.452|
0001c4  6861              LDR      r1,[r4,#4]
0001c6  6029              STR      r1,[r5,#0]
0001c8  6065              STR      r5,[r4,#4]
0001ca  6921              LDR      r1,[r4,#0x10]
0001cc  1c49              ADDS     r1,r1,#1
0001ce  6121              STR      r1,[r4,#0x10]
0001d0  f7fff7ff          BL       OS_CPU_SR_Restore
0001d4  2000              MOVS     r0,#0
0001d6  bd70              POP      {r4-r6,pc}
;;;336    /*$PAGE*/
                          ENDP

                  OSMemQuery PROC
;;;356    INT8U  OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *p_mem_data)
;;;357    {
0001d8  b570              PUSH     {r4-r6,lr}
0001da  4605              MOV      r5,r0
0001dc  460c              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             */
0001de  b90d              CBNZ     r5,|L1.484|
;;;366            return (OS_ERR_MEM_INVALID_PMEM);
0001e0  2060              MOVS     r0,#0x60
;;;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    }
0001e2  bd70              POP      {r4-r6,pc}
                  |L1.484|
0001e4  b90c              CBNZ     r4,|L1.490|
0001e6  2061              MOVS     r0,#0x61
0001e8  bd70              POP      {r4-r6,pc}
                  |L1.490|
0001ea  f7fff7ff          BL       OS_CPU_SR_Save
0001ee  6829              LDR      r1,[r5,#0]
0001f0  6021              STR      r1,[r4,#0]
0001f2  6869              LDR      r1,[r5,#4]
0001f4  6061              STR      r1,[r4,#4]
0001f6  68a9              LDR      r1,[r5,#8]
0001f8  60a1              STR      r1,[r4,#8]
0001fa  68e9              LDR      r1,[r5,#0xc]
0001fc  60e1              STR      r1,[r4,#0xc]
0001fe  6929              LDR      r1,[r5,#0x10]
000200  6121              STR      r1,[r4,#0x10]
000202  f7fff7ff          BL       OS_CPU_SR_Restore
000206  6921              LDR      r1,[r4,#0x10]
000208  68e0              LDR      r0,[r4,#0xc]
00020a  1a40              SUBS     r0,r0,r1
00020c  6160              STR      r0,[r4,#0x14]
00020e  2000              MOVS     r0,#0
000210  bd70              POP      {r4-r6,pc}
;;;382    #endif                                           /* OS_MEM_QUERY_EN                                    */
                          ENDP

                  OS_MemInit PROC
;;;399    void  OS_MemInit (void)
;;;400    {
000212  b510              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          */
000214  21b4              MOVS     r1,#0xb4
000216  4811              LDR      r0,|L1.604|
000218  f7fff7ff          BL       OS_MemClr
;;;416        pmem = &OSMemTbl[0];                                  /* Point to memory control block (MCB)       */
00021c  480f              LDR      r0,|L1.604|
;;;417        for (i = 0; i < (OS_MAX_MEM_PART - 1); i++) {         /* Init. list of free memory partitions      */
00021e  2100              MOVS     r1,#0
000220  4b0e              LDR      r3,|L1.604|
000222  f04ff04f          MOV      r12,#0
000226  223f              MOVS     r2,#0x3f
                  |L1.552|
;;;418            pmem->OSMemFreeList = (void *)&OSMemTbl[i+1];     /* Chain list of free partitions             */
000228  1c49              ADDS     r1,r1,#1
00022a  eb01eb01          ADD      lr,r1,r1,LSL #3
00022e  eb03eb03          ADD      lr,r3,lr,LSL #2
000232  f8c0f8c0          STR      lr,[r0,#4]
;;;419    #if OS_MEM_NAME_SIZE > 1
;;;420            pmem->OSMemName[0]  = '?';                        /* Unknown name                              */
000236  7502              STRB     r2,[r0,#0x14]
;;;421            pmem->OSMemName[1]  = OS_ASCII_NUL;
000238  f880f880          STRB     r12,[r0,#0x15]
;;;422    #endif
;;;423            pmem++;
00023c  3024              ADDS     r0,r0,#0x24
00023e  b289              UXTH     r1,r1
000240  2904              CMP      r1,#4
000242  d3f1              BCC      |L1.552|
;;;424        }
;;;425        pmem->OSMemFreeList = (void *)0;                      /* Initialize last node                      */
000244  f8c0f8c0          STR      r12,[r0,#4]
;;;426    #if OS_MEM_NAME_SIZE > 1
;;;427        pmem->OSMemName[0]  = '?';                            /* Unknown name                              */
000248  7502              STRB     r2,[r0,#0x14]
;;;428        pmem->OSMemName[1]  = OS_ASCII_NUL;
00024a  f880f880          STRB     r12,[r0,#0x15]
;;;429    #endif
;;;430    
;;;431        OSMemFreeList       = &OSMemTbl[0];                   /* Point to beginning of free list           */
00024e  4801              LDR      r0,|L1.596|
000250  6003              STR      r3,[r0,#0]  ; OSMemFreeList
;;;432    #endif
;;;433    }
000252  bd10              POP      {r4,pc}
;;;434    #endif                                                    /* OS_MEM_EN                                 */
                          ENDP

                  |L1.596|
000254  00000000          DCD      OSMemFreeList
                  |L1.600|
000258  00000000          DCD      OSIntNesting
                  |L1.604|
00025c  00000000          DCD      OSMemTbl

⌨️ 快捷键说明

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