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

📄 lib_mem.lst

📁 针对STM32F103的UCOS移植
💻 LST
📖 第 1 页 / 共 3 页
字号:
    337          *********************************************************************************************************
    338          *                                              Mem_Cmp()
    339          *
    340          * Description : Verify that ALL data octets in two memory buffers are identical in sequence.
    341          *
    342          * Argument(s) : p1_mem      Pointer to first  memory buffer.
    343          *
    344          *               p2_mem      Pointer to second memory buffer.
    345          *
    346          *               size        Number of data buffer octets to compare.
    347          *
    348          * Return(s)   : DEF_YES, if 'size' number of data octets are identical in both memory buffers.
    349          *
    350          *               DEF_NO,  otherwise.
    351          *
    352          * Caller(s)   : various.
    353          *
    354          * Note(s)     : (1) Null compares allowed (i.e. 0-octet size); 'DEF_YES' returned to indicate identical 
    355          *                   null compare.
    356          *
    357          *               (2) Many memory buffer comparisons vary ONLY in the least significant octets -- e.g. 
    358          *                   network address buffers.  Consequently, memory buffer comparison is more efficient 
    359          *                   if the comparison starts from the end of the memory buffers which will abort sooner 
    360          *                   on dissimilar memory buffers that vary only in the least significant octets.
    361          *
    362          *               (3) For best CPU performance, optimized to fill data buffer using 'CPU_ALIGN'-sized data words.
    363          *
    364          *                   (a) Since many word-aligned processors REQUIRE that multi-octet words be accessed on 
    365          *                       word-aligned addresses, 'CPU_ALIGN'd words MUST be accessed on 'CPU_ALIGN'd addresses.
    366          *
    367          *               (4) Modulo arithmetic is used to determine whether a memory buffer starts on a 'CPU_ALIGN'
    368          *                   address boundary.
    369          *
    370          *                   Modulo arithmetic in ANSI-C REQUIREs operations performed on integer values.  Thus, 
    371          *                   address values MUST be cast to an appropriately-sized integer value PRIOR to any
    372          *                   mem_align_modulo arithmetic operation.
    373          ********************************************************************************************************
    374          */
    375          /*$PAGE*/

   \                                 In segment CODE, align 4, keep-with-next
    376          CPU_BOOLEAN  Mem_Cmp (void        *p1_mem,
    377                                void        *p2_mem,
    378                                CPU_SIZE_T   size)
    379          {
   \                     Mem_Cmp:
   \   00000000   2DE9F041           PUSH     {R4-R8,LR}
   \   00000004   0500               MOVS     R5,R0
   \   00000006   0C00               MOVS     R4,R1
    380              CPU_SIZE_T    size_rem;
    381              CPU_ALIGN    *p1_mem_align;
    382              CPU_ALIGN    *p2_mem_align;
    383              CPU_INT08U   *p1_mem_08;
    384              CPU_INT08U   *p2_mem_08;
    385              CPU_INT08U    i;
    386              CPU_INT08U    mem_align_modulo_1;
    387              CPU_INT08U    mem_align_modulo_2;
    388              CPU_BOOLEAN   mem_aligned;
    389              CPU_BOOLEAN   mem_cmp;
    390          
    391          
    392              if (size < 1) {                                             /* See Note #1.                                         */
   \   00000008   002A               CMP      R2,#+0
   \   0000000A   01D1               BNE.N    ??Mem_Cmp_0
    393                  return (DEF_YES);
   \   0000000C   0120               MOVS     R0,#+1
   \   0000000E   4CE0               B.N      ??Mem_Cmp_1
    394              }
    395              if (p1_mem == (void *)0) {
   \                     ??Mem_Cmp_0:
   \   00000010   002D               CMP      R5,#+0
   \   00000012   01D1               BNE.N    ??Mem_Cmp_2
    396                  return (DEF_NO);
   \                     ??Mem_Cmp_3:
   \   00000014   0020               MOVS     R0,#+0
   \   00000016   48E0               B.N      ??Mem_Cmp_1
    397              }
    398              if (p2_mem == (void *)0) {
   \                     ??Mem_Cmp_2:
   \   00000018   002C               CMP      R4,#+0
   \   0000001A   FBD0               BEQ.N    ??Mem_Cmp_3
    399                  return (DEF_NO);
    400              }
    401          
    402          
    403              mem_cmp            =  DEF_YES;
   \   0000001C   0120               MOVS     R0,#+1
   \   0000001E   8046               MOV      R8,R0
    404              size_rem           =  size;
   \   00000020   1300               MOVS     R3,R2
    405                                                                          /* Start @ end of mem bufs (see Note #2).               */
    406              p1_mem_08          = (CPU_INT08U *)p1_mem + size;
   \   00000022   A918               ADDS     R1,R5,R2
    407              p2_mem_08          = (CPU_INT08U *)p2_mem + size;
   \   00000024   A218               ADDS     R2,R4,R2
    408                                                                          /* See Note #4.                                         */
    409              mem_align_modulo_1 = (CPU_INT08U  )((CPU_ADDR)p1_mem_08 % sizeof(CPU_ALIGN));
   \   00000026   0C00               MOVS     R4,R1
   \   00000028   A507               LSLS     R5,R4,#+30
   \   0000002A   AD0F               LSRS     R5,R5,#+30
    410              mem_align_modulo_2 = (CPU_INT08U  )((CPU_ADDR)p2_mem_08 % sizeof(CPU_ALIGN));
    411          
    412              mem_aligned        = (mem_align_modulo_1 == mem_align_modulo_2) ? DEF_YES : DEF_NO;
   \   0000002C   0024               MOVS     R4,#+0
   \   0000002E   2E00               MOVS     R6,R5
   \   00000030   1700               MOVS     R7,R2
   \   00000032   BF07               LSLS     R7,R7,#+30
   \   00000034   BF0F               LSRS     R7,R7,#+30
   \   00000036   BE42               CMP      R6,R7
   \   00000038   01D1               BNE.N    ??Mem_Cmp_4
   \   0000003A   4646               MOV      R6,R8
   \   0000003C   00E0               B.N      ??Mem_Cmp_5
   \                     ??Mem_Cmp_4:
   \   0000003E   2600               MOVS     R6,R4
    413          
    414              if (mem_aligned == DEF_YES) {                               /* If mem bufs' alignment offset equal, ...             */
   \                     ??Mem_Cmp_5:
   \   00000040   012E               CMP      R6,#+1
   \   00000042   2DD1               BNE.N    ??Mem_Cmp_6
    415                                                                          /* ... optimize cmp for mem buf alignment.              */
    416                  if (mem_align_modulo_1 != 0) {                          /* If trailing octets avail,                  ...       */
   \   00000044   2E00               MOVS     R6,R5
   \   00000046   11D0               BEQ.N    ??Mem_Cmp_7
    417                      i = mem_align_modulo_1;
   \   00000048   09E0               B.N      ??Mem_Cmp_8
    418                      while ((mem_cmp == DEF_YES) &&                      /* ... cmp mem bufs while identical &         ...       */
    419                             (size_rem > 0)       &&                      /* ... start mem buf cmp with trailing octets ...       */
    420                             (i        > 0)) {                            /* ... until next CPU_ALIGN word boundary.              */
    421                          p1_mem_08--;
   \                     ??Mem_Cmp_9:
   \   0000004A   491E               SUBS     R1,R1,#+1
    422                          p2_mem_08--;
   \   0000004C   521E               SUBS     R2,R2,#+1
    423                          if (*p1_mem_08 != *p2_mem_08) {                 /* If ANY data octet(s) NOT identical, cmp fails.       */
   \   0000004E   0E78               LDRB     R6,[R1, #+0]
   \   00000050   1778               LDRB     R7,[R2, #+0]
   \   00000052   BE42               CMP      R6,R7
   \   00000054   00D0               BEQ.N    ??Mem_Cmp_10
    424                               mem_cmp = DEF_NO;
   \   00000056   2000               MOVS     R0,R4
    425                          }
    426                          size_rem -= sizeof(CPU_INT08U);
   \                     ??Mem_Cmp_10:
   \   00000058   5B1E               SUBS     R3,R3,#+1
    427                          i--;
   \   0000005A   6D1E               SUBS     R5,R5,#+1
   \   0000005C   EDB2               UXTB     R5,R5
    428                      }
   \                     ??Mem_Cmp_8:
   \   0000005E   0600               MOVS     R6,R0
   \   00000060   012E               CMP      R6,#+1
   \   00000062   03D1               BNE.N    ??Mem_Cmp_7
   \   00000064   002B               CMP      R3,#+0
   \   00000066   01D0               BEQ.N    ??Mem_Cmp_7
   \   00000068   2E00               MOVS     R6,R5
   \   0000006A   EED1               BNE.N    ??Mem_Cmp_9
    429                  }
    430          
    431                  if (mem_cmp == DEF_YES) {                               /* If cmp still identical, cmp aligned mem bufs.        */
   \                     ??Mem_Cmp_7:
   \   0000006C   0500               MOVS     R5,R0
   \   0000006E   012D               CMP      R5,#+1
   \   00000070   16D1               BNE.N    ??Mem_Cmp_6
    432                      p1_mem_align = (CPU_ALIGN *)p1_mem_08;              /* See Note #3a.                                        */
    433                      p2_mem_align = (CPU_ALIGN *)p2_mem_08;
   \   00000072   07E0               B.N      ??Mem_Cmp_11
    434          
    435                      while ((mem_cmp  == DEF_YES) &&                     /* Cmp mem bufs while identical & ...                   */
    436                             (size_rem >= sizeof(CPU_ALIGN))) {           /* ... mem bufs aligned on CPU_ALIGN word boundaries.   */
    437                          p1_mem_align--;
   \                     ??Mem_Cmp_12:
   \   00000074   091F               SUBS     R1,R1,#+4
    438                          p2_mem_align--;
   \   00000076   121F               SUBS     R2,R2,#+4
    439                          if (*p1_mem_align != *p2_mem_align) {           /* If ANY data octet(s) NOT identical, cmp fails.       */
   \   00000078   0D68               LDR      R5,[R1, #+0]
   \   0000007A   1668               LDR      R6,[R2, #+0]
   \   0000007C   B542               CMP      R5,R6
   \   0000007E   00D0               BEQ.N    ??Mem_Cmp_13
    440                               mem_cmp = DEF_NO;
   \   00000080   2000               MOVS     R0,R4
    441                          }
    442                          size_rem -= sizeof(CPU_ALIGN);
   \                     ??Mem_Cmp_13:
   \   00000082   1B1F               SUBS     R3,R3,#+4
    443                      }
   \                     ??Mem_Cmp_11:
   \   00000084   0500               MOVS     R5,R0
   \   00000086   012D               CMP      R5,#+1
   \   00000088   0AD1               BNE.N    ??Mem_Cmp_6
   \   0000008A   042B               CMP      R3,#+4
   \   0000008C   F2D2               BCS.N    ??Mem_Cmp_12
    444          
    445                      p1_mem_08 = (CPU_INT08U *)p1_mem_align;
    446                      p2_mem_08 = (CPU_INT08U *)p2_mem_align;
   \   0000008E   07E0               B.N      ??Mem_Cmp_6
    447                  }
    448              }
    449          
    450              while ((mem_cmp == DEF_YES) &&                              /* Cmp mem bufs while identical ...                     */
    451                     (size_rem > 0)) {                                    /* ... for unaligned mem bufs or trailing octets.       */
    452                  p1_mem_08--;
   \                     ??Mem_Cmp_14:
   \   00000090   491E               SUBS     R1,R1,#+1
    453                  p2_mem_08--;
   \   00000092   521E               SUBS     R2,R2,#+1
    454                  if (*p1_mem_08 != *p2_mem_08) {                         /* If ANY data octet(s) NOT identical, cmp fails.       */
   \   00000094   0D78               LDRB     R5,[R1, #+0]
   \   00000096   1678               LDRB     R6,[R2, #+0]
   \   00000098   B542               CMP      R5,R6
   \   0000009A   00D0               BEQ.N    ??Mem_Cmp_15
    455                       mem_cmp = DEF_NO;
   \   0000009C   2000               MOVS     R0,R4
    456                  }
    457                  size_rem -= sizeof(CPU_INT08U);
   \                     ??Mem_Cmp_15:
   \   0000009E   5B1E               SUBS     R3,R3,#+1
    458              }
   \                     ??Mem_Cmp_6:
   \   000000A0   0500               MOVS     R5,R0
   \   000000A2   012D               CMP      R5,#+1
   \   000000A4   01D1               BNE.N    ??Mem_Cmp_1
   \   000000A6   002B               CMP      R3,#+0
   \   000000A8   F2D1               BNE.N    ??Mem_Cmp_14
    459          
    460              return (mem_cmp);
   \                     ??Mem_Cmp_1:
   \   000000AA   BDE8F081           POP      {R4-R8,PC}       ;; return
    461          }
    462          

   Maximum stack usage in bytes:

     Function CSTACK
     -------- ------
     Mem_Clr      4
     Mem_Cmp     24
     Mem_Copy    12
     Mem_Set     12


   Segment part sizes:

     Function/Label Bytes
     -------------- -----
     Mem_Clr          12
     Mem_Set          80
     Mem_Copy        104
     Mem_Cmp         174

 
 370 bytes in segment CODE
 
 370 bytes of CODE memory

Errors: none
Warnings: none

⌨️ 快捷键说明

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