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

📄 os_mem.s79

📁 ARM仿真案例
💻 S79
📖 第 1 页 / 共 3 页
字号:
//  264 *               OS_MEM_FULL          if you are returning a memory block to an already FULL memory 
//  265 *                                    partition (You freed more blocks than you allocated!)
//  266 *               OS_MEM_INVALID_PMEM  if you passed a NULL pointer for 'pmem'
//  267 *               OS_MEM_INVALID_PBLK  if you passed a NULL pointer for the block to release.
//  268 *********************************************************************************************************
//  269 */
//  270 

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock9 Using cfiCommon1
        CFI Function OSMemPut
        THUMB
//  271 INT8U  OSMemPut (OS_MEM *pmem, void *pblk)
//  272 {
OSMemPut:
        PUSH     {R4,R5,LR}
        CFI ?RET Frame(CFA, -4)
        CFI R5 Frame(CFA, -8)
        CFI R4 Frame(CFA, -12)
        CFI CFA R13+12
        MOVS     R4,R0
        MOVS     R5,R1
//  273 #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
//  274     OS_CPU_SR  cpu_sr;
//  275 #endif    
//  276     
//  277     
//  278 #if OS_ARG_CHK_EN > 0
//  279     if (pmem == (OS_MEM *)0) {                   /* Must point to a valid memory partition             */
        CMP      R4,#+0
        BNE      ??OSMemPut_0
//  280         return (OS_MEM_INVALID_PMEM);
        MOVS     R0,#+116
        B        ??OSMemPut_1
//  281     }
//  282     if (pblk == (void *)0) {                     /* Must release a valid block                         */
??OSMemPut_0:
        CMP      R5,#+0
        BNE      ??OSMemPut_2
//  283         return (OS_MEM_INVALID_PBLK);
        MOVS     R0,#+115
        B        ??OSMemPut_1
//  284     }
//  285 #endif
//  286     OS_ENTER_CRITICAL();
??OSMemPut_2:
        _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
//  287     if (pmem->OSMemNFree >= pmem->OSMemNBlks) {  /* Make sure all blocks not already returned          */
        LDR      R1,[R4, #+16]
        LDR      R2,[R4, #+12]
        CMP      R1,R2
        BCC      ??OSMemPut_3
//  288         OS_EXIT_CRITICAL();
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  289         return (OS_MEM_FULL);
        MOVS     R0,#+114
        B        ??OSMemPut_1
//  290     }
//  291     *(void **)pblk      = pmem->OSMemFreeList;   /* Insert released block into free block list         */
??OSMemPut_3:
        LDR      R1,[R4, #+4]
        STR      R1,[R5, #+0]
//  292     pmem->OSMemFreeList = pblk;
        STR      R5,[R4, #+4]
//  293     pmem->OSMemNFree++;                          /* One more memory block in this partition            */
        LDR      R1,[R4, #+16]
        ADDS     R1,R1,#+1
        STR      R1,[R4, #+16]
//  294     OS_EXIT_CRITICAL();
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  295     return (OS_NO_ERR);                          /* Notify caller that memory block was released       */
        MOVS     R0,#+0
??OSMemPut_1:
        POP      {R4,R5}
        POP      {R1}
        BX       R1               ;; return
        CFI EndBlock cfiBlock9
//  296 }

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock10 Using cfiCommon0
        CFI NoFunction
        ARM
??OSMemQuery??rA:
        ADD      R12,PC,#+1
        BX       R12
        CFI EndBlock cfiBlock10
        REQUIRE OSMemQuery
//  297 
//  298 /*
//  299 *********************************************************************************************************
//  300 *                                          QUERY MEMORY PARTITION
//  301 *
//  302 * Description : This function is used to determine the number of free memory blocks and the number of
//  303 *               used memory blocks from a memory partition.
//  304 *
//  305 * Arguments   : pmem        is a pointer to the memory partition control block
//  306 *
//  307 *               p_mem_data  is a pointer to a structure that will contain information about the memory
//  308 *                           partition.
//  309 *
//  310 * Returns     : OS_NO_ERR            If no errors were found.
//  311 *               OS_MEM_INVALID_PMEM  if you passed a NULL pointer for 'pmem'
//  312 *               OS_MEM_INVALID_PDATA if you passed a NULL pointer to the data recipient.
//  313 *********************************************************************************************************
//  314 */
//  315 
//  316 #if OS_MEM_QUERY_EN > 0

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock11 Using cfiCommon1
        CFI Function OSMemQuery
        THUMB
//  317 INT8U  OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *p_mem_data)
//  318 {
OSMemQuery:
        PUSH     {R4,R5,LR}
        CFI ?RET Frame(CFA, -4)
        CFI R5 Frame(CFA, -8)
        CFI R4 Frame(CFA, -12)
        CFI CFA R13+12
        MOVS     R4,R0
        MOVS     R5,R1
//  319 #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
//  320     OS_CPU_SR  cpu_sr;
//  321 #endif    
//  322     
//  323     
//  324 #if OS_ARG_CHK_EN > 0
//  325     if (pmem == (OS_MEM *)0) {                   /* Must point to a valid memory partition             */
        CMP      R4,#+0
        BNE      ??OSMemQuery_0
//  326         return (OS_MEM_INVALID_PMEM);
        MOVS     R0,#+116
        B        ??OSMemQuery_1
//  327     }
//  328     if (p_mem_data == (OS_MEM_DATA *)0) {        /* Must release a valid storage area for the data     */
??OSMemQuery_0:
        CMP      R5,#+0
        BNE      ??OSMemQuery_2
//  329         return (OS_MEM_INVALID_PDATA);
        MOVS     R0,#+117
        B        ??OSMemQuery_1
//  330     }
//  331 #endif
//  332     OS_ENTER_CRITICAL();
??OSMemQuery_2:
        _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
//  333     p_mem_data->OSAddr     = pmem->OSMemAddr;
        LDR      R1,[R4, #+0]
        STR      R1,[R5, #+0]
//  334     p_mem_data->OSFreeList = pmem->OSMemFreeList;
        LDR      R1,[R4, #+4]
        STR      R1,[R5, #+4]
//  335     p_mem_data->OSBlkSize  = pmem->OSMemBlkSize;
        LDR      R1,[R4, #+8]
        STR      R1,[R5, #+8]
//  336     p_mem_data->OSNBlks    = pmem->OSMemNBlks;
        LDR      R1,[R4, #+12]
        STR      R1,[R5, #+12]
//  337     p_mem_data->OSNFree    = pmem->OSMemNFree;
        LDR      R1,[R4, #+16]
        STR      R1,[R5, #+16]
//  338     OS_EXIT_CRITICAL();
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  339     p_mem_data->OSNUsed    = p_mem_data->OSNBlks - p_mem_data->OSNFree;
        LDR      R0,[R5, #+12]
        LDR      R1,[R5, #+16]
        SUBS     R0,R0,R1
        STR      R0,[R5, #+20]
//  340     return (OS_NO_ERR);
        MOVS     R0,#+0
??OSMemQuery_1:
        POP      {R4,R5}
        POP      {R1}
        BX       R1               ;; return
        CFI EndBlock cfiBlock11
//  341 }

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock12 Using cfiCommon0
        CFI NoFunction
        ARM
??OS_MemInit??rA:
        ADD      R12,PC,#+1
        BX       R12
        CFI EndBlock cfiBlock12
        REQUIRE OS_MemInit
//  342 #endif                                           /* OS_MEM_QUERY_EN                                    */
//  343 
//  344 /*
//  345 *********************************************************************************************************
//  346 *                                    INITIALIZE MEMORY PARTITION MANAGER
//  347 *
//  348 * Description : This function is called by uC/OS-II to initialize the memory partition manager.  Your
//  349 *               application MUST NOT call this function.
//  350 *
//  351 * Arguments   : none
//  352 *
//  353 * Returns     : none
//  354 *
//  355 * Note(s)    : This function is INTERNAL to uC/OS-II and your application should not call it.
//  356 *********************************************************************************************************
//  357 */
//  358 

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock13 Using cfiCommon1
        CFI Function OS_MemInit
        THUMB
//  359 void  OS_MemInit (void)
//  360 {
OS_MemInit:
        PUSH     {R4,LR}
        CFI ?RET Frame(CFA, -4)
        CFI R4 Frame(CFA, -8)
        CFI CFA R13+8
//  361 #if OS_MAX_MEM_PART == 1
//  362     OSMemFreeList = (OS_MEM *)&OSMemTbl[0];             /* Point to beginning of free list             */
//  363     OS_MemClr((INT8U *)&OSMemTbl[0], sizeof(OSMemTbl)); /* Clear the memory partition table            */
//  364 #endif
//  365 
//  366 #if OS_MAX_MEM_PART >= 2
//  367     OS_MEM  *pmem;
//  368     INT16U   i;
//  369 
//  370 
//  371     OS_MemClr((INT8U *)&OSMemTbl[0], sizeof(OSMemTbl)); /* Clear the memory partition table            */
        MOVS     R1,#+130
        LSLS     R1,R1,#+1        ;; #+260
        LDR      R0,??OS_MemInit_0  ;; OSMemTbl
        _BLF     OS_MemClr,??OS_MemClr??rT
//  372     pmem = (OS_MEM *)&OSMemTbl[0];                      /* Point to memory control block (MCB)         */
        LDR      R0,??OS_MemInit_0  ;; OSMemTbl
//  373     for (i = 0; i < (OS_MAX_MEM_PART - 1); i++) {       /* Init. list of free memory partitions        */
        ADDS     R1,R0,#+4
        LDR      R2,??OS_MemInit_0+0x4  ;; OSMemTbl + 52
        MOVS     R3,#+4
//  374         pmem->OSMemFreeList = (void *)&OSMemTbl[i+1];   /* Chain list of free partitions               */
??OS_MemInit_1:
        STR      R2,[R1, #+0]
//  375 #if OS_MEM_NAME_SIZE > 1
//  376         pmem->OSMemName[0]  = '?';                      /* Unknown name                                */
        MOVS     R4,#+63
        STRB     R4,[R0, #+20]
//  377         pmem->OSMemName[1]  = OS_ASCII_NUL;
        MOVS     R4,#+0
        STRB     R4,[R0, #+21]
//  378 #endif
//  379         pmem++;
        ADDS     R0,R0,#+52
//  380     }
        ADDS     R2,R2,#+52
        ADDS     R1,R1,#+52
        SUBS     R3,R3,#+1
        BNE      ??OS_MemInit_1
//  381     pmem->OSMemFreeList = (void *)0;                    /* Initialize last node                        */
        STR      R4,[R0, #+4]
//  382 #if OS_MEM_NAME_SIZE > 1
//  383     pmem->OSMemName[0]  = '?';                          /* Unknown name                                */
        MOVS     R1,#+63
        STRB     R1,[R0, #+20]
//  384     pmem->OSMemName[1]  = OS_ASCII_NUL;
        STRB     R4,[R0, #+21]
//  385 #endif
//  386 
//  387     OSMemFreeList       = (OS_MEM *)&OSMemTbl[0];       /* Point to beginning of free list             */
        LDR      R0,??DataTable1  ;; OSMemFreeList
        LDR      R1,??OS_MemInit_0  ;; OSMemTbl
        STR      R1,[R0, #+0]
//  388 #endif
//  389 }
        POP      {R4}
        POP      {R0}
        BX       R0               ;; return
        DATA
??OS_MemInit_0:
        DC32     OSMemTbl
        DC32     OSMemTbl + 52
        CFI EndBlock cfiBlock13

        RSEG CODE:CODE:NOROOT(2)
        DATA
??DataTable1:
        DC32     OSMemFreeList

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock14 Using cfiCommon1
        CFI NoFunction
        THUMB
??OS_CPU_SR_Save??rT:
        LDR      R3,??Subroutine7_0  ;; OS_CPU_SR_Save
        BX       R3
        DATA
??Subroutine7_0:
        DC32     OS_CPU_SR_Save
        CFI EndBlock cfiBlock14

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock15 Using cfiCommon1
        CFI NoFunction
        THUMB
??OS_CPU_SR_Restore??rT:
        LDR      R3,??Subroutine8_0  ;; OS_CPU_SR_Restore
        BX       R3
        DATA
??Subroutine8_0:
        DC32     OS_CPU_SR_Restore
        CFI EndBlock cfiBlock15

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock16 Using cfiCommon1
        CFI NoFunction
        THUMB
??OS_StrCopy??rT:
        LDR      R3,??Subroutine9_0  ;; OS_StrCopy
        BX       R3
        DATA
??Subroutine9_0:
        DC32     OS_StrCopy
        CFI EndBlock cfiBlock16

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock17 Using cfiCommon1
        CFI NoFunction
        THUMB
??OS_StrLen??rT:
        LDR      R3,??Subroutine10_0  ;; OS_StrLen
        BX       R3
        DATA
??Subroutine10_0:
        DC32     OS_StrLen
        CFI EndBlock cfiBlock17

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock18 Using cfiCommon1
        CFI NoFunction
        THUMB
??OS_MemClr??rT:
        LDR      R3,??Subroutine11_0  ;; OS_MemClr
        BX       R3
        DATA
??Subroutine11_0:
        DC32     OS_MemClr
        CFI EndBlock cfiBlock18

        END
//  390 #endif                                                  /* OS_MEM_EN                                   */
// 
// 638 bytes in segment CODE
// 
// 542 bytes of CODE memory (+ 96 bytes shared)
//
//Errors: none
//Warnings: none

⌨️ 快捷键说明

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