lib_mem.lst

来自「stm32+ucos-ii」· LST 代码 · 共 1,061 行 · 第 1/5 页

LST
1,061
字号
    168              pmem_pool->SegNextPtr       = (MEM_POOL   *) 0;
    169              pmem_pool->PoolPrevPtr      = (MEM_POOL   *) 0;
    170              pmem_pool->PoolNextPtr      = (MEM_POOL   *) 0;
    171              pmem_pool->PoolAddrStart    = (void       *) 0;
    172              pmem_pool->PoolAddrEnd      = (void       *) 0;
    173              pmem_pool->PoolPtrs         = (void      **) 0;
    174              pmem_pool->BlkSize          = (CPU_SIZE_T  ) 0u;
    175              pmem_pool->BlkNbr           = (CPU_SIZE_T  ) 0u;
    176              pmem_pool->BlkIx            = (MEM_POOL_IX ) 0u;
    177          
    178          #ifdef  LIB_MEM_CFG_HEAP_BASE_ADDR
    179              pmem_pool->SegAddr          = (void       *) LIB_MEM_CFG_HEAP_BASE_ADDR;
    180              pmem_pool->SegAddrNextAvail = (void       *) LIB_MEM_CFG_HEAP_BASE_ADDR;
    181          #else
    182              pmem_pool->SegAddr          = (void       *)&Mem_Heap[0];
    183              pmem_pool->SegAddrNextAvail = (void       *)&Mem_Heap[0];
    184          #endif
    185          
    186              pmem_pool->SegSizeTot       = (CPU_SIZE_T  ) LIB_MEM_CFG_HEAP_SIZE;
    187              pmem_pool->SegSizeRem       = (CPU_SIZE_T  ) LIB_MEM_CFG_HEAP_SIZE;
    188          
    189                                                                                  /* ------------ INIT MEM POOL TBL ------------- */
    190              Mem_PoolTbl = &Mem_PoolHeap;
    191          #endif
    192          }
   \                     Mem_Init:
   \   00000000   7047               BX       LR               ;; return
    193          
    194          
    195          /*$PAGE*/
    196          /*
    197          *********************************************************************************************************
    198          *                                              Mem_Clr()
    199          *
    200          * Description : Clear data buffer (see Note #2).
    201          *
    202          * Argument(s) : pmem        Pointer to memory buffer to clear.
    203          *
    204          *               size        Number of data buffer octets to clear (see Note #1).
    205          *
    206          * Return(s)   : none.
    207          *
    208          * Caller(s)   : Application.
    209          *
    210          * Note(s)     : (1) Null clears allowed (i.e. zero-length clears).
    211          *
    212          *                   See also 'Mem_Set()  Note #1'.
    213          *
    214          *               (2) Clear data by setting each data octet to 0.
    215          *********************************************************************************************************
    216          */
    217          

   \                                 In section .text, align 2, keep-with-next
    218          void  Mem_Clr (void        *pmem,
    219                         CPU_SIZE_T   size)
    220          {
   \                     Mem_Clr:
   \   00000000   38B5               PUSH     {R3-R5,LR}
   \   00000002   0400               MOVS     R4,R0
   \   00000004   0D00               MOVS     R5,R1
    221              Mem_Set(pmem,
    222                      0u,                                                 /* See Note #2.                                         */
    223                      size);
   \   00000006   2A00               MOVS     R2,R5
   \   00000008   0021               MOVS     R1,#+0
   \   0000000A   2000               MOVS     R0,R4
   \   0000000C   ........           BL       Mem_Set
    224          }
   \   00000010   31BD               POP      {R0,R4,R5,PC}    ;; return
    225          
    226          
    227          /*$PAGE*/
    228          /*
    229          *********************************************************************************************************
    230          *                                              Mem_Set()
    231          *
    232          * Description : Fill data buffer with specified data octet.
    233          *
    234          * Argument(s) : pmem        Pointer to memory buffer to fill with specified data octet.
    235          *
    236          *               data_val    Data fill octet value.
    237          *
    238          *               size        Number of data buffer octets to fill (see Note #1).
    239          *
    240          * Return(s)   : none.
    241          *
    242          * Caller(s)   : Application.
    243          *
    244          * Note(s)     : (1) Null sets allowed (i.e. zero-length sets).
    245          *
    246          *               (2) For best CPU performance, optimized to fill data buffer using 'CPU_ALIGN'-sized data
    247          *                   words.
    248          *
    249          *                   (a) Since many word-aligned processors REQUIRE that multi-octet words be accessed on
    250          *                       word-aligned addresses, 'CPU_ALIGN'-sized words MUST be accessed on 'CPU_ALIGN'd
    251          *                       addresses.
    252          *
    253          *               (3) Modulo arithmetic is used to determine whether a memory buffer starts on a 'CPU_ALIGN'
    254          *                   address boundary.
    255          *
    256          *                   Modulo arithmetic in ANSI-C REQUIREs operations performed on integer values.  Thus,
    257          *                   address values MUST be cast to an appropriately-sized integer value PRIOR to any
    258          *                   mem_align_modulo arithmetic operation.
    259          *********************************************************************************************************
    260          */
    261          

   \                                 In section .text, align 2, keep-with-next
    262          void  Mem_Set (void        *pmem,
    263                         CPU_INT08U   data_val,
    264                         CPU_SIZE_T   size)
    265          {
   \                     Mem_Set:
   \   00000000   2DE9F041           PUSH     {R4-R8,LR}
    266              CPU_SIZE_T   size_rem;
    267              CPU_ALIGN    data_align;
    268              CPU_ALIGN   *pmem_align;
    269              CPU_INT08U  *pmem_08;
    270              CPU_INT08U   mem_align_modulo;
    271              CPU_INT08U   i;
    272          
    273          
    274              if (size < 1) {                                             /* See Note #1.                                         */
   \   00000004   002A               CMP      R2,#+0
   \   00000006   3AD0               BEQ.N    ??Mem_Set_0
    275                  return;
    276              }
    277              if (pmem == (void *)0) {
   \                     ??Mem_Set_1:
   \   00000008   0028               CMP      R0,#+0
   \   0000000A   38D0               BEQ.N    ??Mem_Set_0
    278                  return;
    279              }
    280          
    281          
    282              data_align = 0u;
   \                     ??Mem_Set_2:
   \   0000000C   5FF0000E           MOVS     LR,#+0
   \   00000010   7446               MOV      R4,LR
    283              for (i = 0u; i < sizeof(CPU_ALIGN); i++) {                  /* Fill each data_align octet with data val.            */
   \   00000012   5FF0000E           MOVS     LR,#+0
   \   00000016   F446               MOV      R12,LR
   \                     ??Mem_Set_3:
   \   00000018   5FFA8CFC           UXTB     R12,R12          ;; ZeroExt  R12,R12,#+24,#+24
   \   0000001C   BCF1040F           CMP      R12,#+4
   \   00000020   05D2               BCS.N    ??Mem_Set_4
    284                  data_align <<=  DEF_OCTET_NBR_BITS;
   \   00000022   2402               LSLS     R4,R4,#+8
    285                  data_align  |= (CPU_ALIGN)data_val;
   \   00000024   C9B2               UXTB     R1,R1            ;; ZeroExt  R1,R1,#+24,#+24
   \   00000026   0C43               ORRS     R4,R1,R4
    286              }
   \   00000028   1CF1010C           ADDS     R12,R12,#+1
   \   0000002C   F4E7               B.N      ??Mem_Set_3
    287          
    288              size_rem         =  size;
   \                     ??Mem_Set_4:
   \   0000002E   1300               MOVS     R3,R2
    289              mem_align_modulo = (CPU_INT08U)((CPU_ADDR)pmem % sizeof(CPU_ALIGN));    /* See Note #3.                             */
   \   00000030   5FF0040E           MOVS     LR,#+4
   \   00000034   B0FBFEF8           UDIV     R8,R0,LR
   \   00000038   08FB1E08           MLS      R8,R8,LR,R0
   \   0000003C   4746               MOV      R7,R8
    290          
    291              pmem_08 = (CPU_INT08U *)pmem;
   \   0000003E   0600               MOVS     R6,R0
    292              if (mem_align_modulo != 0u) {                               /* If leading octets avail,                   ...       */
   \   00000040   FFB2               UXTB     R7,R7            ;; ZeroExt  R7,R7,#+24,#+24
   \   00000042   002F               CMP      R7,#+0
   \   00000044   0DD0               BEQ.N    ??Mem_Set_5
    293                  i = mem_align_modulo;
   \   00000046   BC46               MOV      R12,R7
    294                  while ((size_rem > 0) &&                                /* ... start mem buf fill with leading octets ...       */
    295                         (i        < sizeof(CPU_ALIGN ))) {               /* ... until next CPU_ALIGN word boundary.              */
   \                     ??Mem_Set_6:
   \   00000048   002B               CMP      R3,#+0
   \   0000004A   0AD0               BEQ.N    ??Mem_Set_5
   \   0000004C   5FFA8CFC           UXTB     R12,R12          ;; ZeroExt  R12,R12,#+24,#+24
   \   00000050   BCF1040F           CMP      R12,#+4
   \   00000054   05D2               BCS.N    ??Mem_Set_5
    296                     *pmem_08++ = data_val;
   \   00000056   3170               STRB     R1,[R6, #+0]
   \   00000058   761C               ADDS     R6,R6,#+1
    297                      size_rem -= sizeof(CPU_INT08U);
   \   0000005A   5B1E               SUBS     R3,R3,#+1
    298                      i++;
   \   0000005C   1CF1010C           ADDS     R12,R12,#+1
   \   00000060   F2E7               B.N      ??Mem_Set_6
    299                  }
    300              }
    301          
    302              pmem_align = (CPU_ALIGN *)pmem_08;                          /* See Note #2a.                                        */
   \                     ??Mem_Set_5:
   \   00000062   3500               MOVS     R5,R6
    303              while (size_rem >= sizeof(CPU_ALIGN)) {                     /* While mem buf aligned on CPU_ALIGN word boundaries,  */
   \                     ??Mem_Set_7:
   \   00000064   042B               CMP      R3,#+4
   \   00000066   03D3               BCC.N    ??Mem_Set_8
    304                 *pmem_align++ = data_align;                              /* ... fill mem buf with    CPU_ALIGN-sized data.       */
   \   00000068   2C60               STR      R4,[R5, #+0]
   \   0000006A   2D1D               ADDS     R5,R5,#+4
    305                  size_rem    -= sizeof(CPU_ALIGN);
   \   0000006C   1B1F               SUBS     R3,R3,#+4
   \   0000006E   F9E7               B.N      ??Mem_Set_7
    306              }
    307          
    308              pmem_08 = (CPU_INT08U *)pmem_align;
   \                     ??Mem_Set_8:
   \   00000070   2E00               MOVS     R6,R5
    309              while (size_rem > 0) {                                      /* Finish mem buf fill with trailing octets.            */
   \                     ??Mem_Set_9:
   \   00000072   002B               CMP      R3,#+0

⌨️ 快捷键说明

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