硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2782|回复: 4
收起左侧

[uCOS全家桶组件] uCOS全家桶带的CRC软件包,含汇编加速方式,支持查表和计算两种方式

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106708
QQ
发表于 2020-5-12 14:04:44 | 显示全部楼层 |阅读模式
uC-CRC-master.zip (39.71 KB, 下载次数: 174)

  1. ;********************************************************************************************************
  2. ;                                               uC/CRC
  3. ;           ERROR DETECTING CODE (EDC) & ERROR CORRECTING CODE (ECC) CALCULATION UTILITIES
  4. ;
  5. ;                    Copyright 2007-2020 Silicon Laboratories Inc. www.silabs.com
  6. ;
  7. ;                                 SPDX-License-Identifier: APACHE-2.0
  8. ;
  9. ;               This software is subject to an open source license and is distributed by
  10. ;                Silicon Laboratories Inc. pursuant to the terms of the Apache License,
  11. ;                    Version 2.0 available at www.apache.org/licenses/LICENSE-2.0.
  12. ;
  13. ;********************************************************************************************************


  14. ;********************************************************************************************************
  15. ;
  16. ;                              CYCLIC REDUNDANCY CHECK (CRC) CALCULATION
  17. ;
  18. ;                                            ARM-Cortex-M3
  19. ;                                            IAR Compiler
  20. ;
  21. ; Filename : edc_crc_a.asm
  22. ; Version  : V1.10.00
  23. ;********************************************************************************************************
  24. ; Note(s)  : (1) Assumes ARM CPU mode configured for Little Endian.
  25. ;********************************************************************************************************


  26. ;********************************************************************************************************
  27. ;                                          PUBLIC FUNCTIONS
  28. ;********************************************************************************************************

  29.         PUBLIC  CRC_ChkSumCalcTbl_16Bit
  30.         PUBLIC  CRC_ChkSumCalcTbl_16Bit_ref
  31.         PUBLIC  CRC_ChkSumCalcTbl_32Bit
  32.         PUBLIC  CRC_ChkSumCalcTbl_32Bit_ref


  33. ;********************************************************************************************************
  34. ;                                     CODE GENERATION DIRECTIVES
  35. ;********************************************************************************************************

  36.         RSEG CODE:CODE:NOROOT(2)


  37. ;$PAGE
  38. ;********************************************************************************************************
  39. ;                                       CRC_ChkSumCalcTbl_16Bit()
  40. ;
  41. ; Description : Calculate a 16-bit CRC using a table without reflection.
  42. ;
  43. ; Argument(s) : init_val        Initial CRC value.
  44. ;
  45. ;               ptbl            Pre-computed CRC table to use in calculation.
  46. ;
  47. ;               pdata           Pointer to data buffer over which CRC is generated.
  48. ;
  49. ;               nbr_octets      Number of data octets to use for calculation
  50. ;
  51. ; Return(s)   : 16-bit CRC.
  52. ;
  53. ; Caller(s)   : Application.
  54. *********************************************************************************************************

  55. ; CPU_INT16  CRC_ChkSumCalcTbl_16Bit (CPU_INT16U   init_val,   @       ==>  R0 == sum
  56. ;                                     CPU_INT16U  *ptbl,       @       ==>  R1
  57. ;                                     CPU_INT08U  *pdata,      @       ==>  R2
  58. ;                                     CPU_INT32U   nbr_octets) @       ==>  R3
  59. ;                                                  ix          @       ==>  R4
  60. ;                                                  tbl_val     @       ==>  R5
  61. ;                                                  temp        @       ==>  R6
  62. ;                                                  0x1FF       @       ==>  R7

  63. CRC_ChkSumCalcTbl_16Bit:
  64.         STMDB       SP!, {R4-R7}

  65.         MOVW        R7, #0x1FE
  66.         CMP         R3, #0
  67.         BEQ         CRC_ChkSumCalcTbl_16Bit_END


  68. CRC_ChkSumCalcTbl_16Bit_CHKALIGN32:
  69.         AND         R6, R2, #0x03
  70.         CMP         R6, #0
  71.         BEQ         CRC_ChkSumCalcTbl_16Bit_ALIGN32


  72. CRC_ChkSumCalcTbl_16Bit_PRE:
  73.         LDRB        R4, [R2], #1                            ; ix      = *pdata++;
  74.         EOR         R4,  R4,  R0,  LSR #8                   ; ix     ^= (crc >> 8);
  75.         AND         R4,  R7,  R4,  LSL #1                   ; ix      =  (ix * 2) & 0x1FE;
  76.         LDRH        R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  77.         EOR         R0,  R5,  R0,  LSL #8                   ; crc     = (crc << 8) ^ tbl_val;

  78.         SUB         R3,  R3, #1                             ; nbytes--;
  79.         ADD         R6,  R6, #1

  80.         CMP         R3, #0
  81.         BEQ         CRC_ChkSumCalcTbl_16Bit_END

  82.         CMP         R6, #4
  83.         BNE         CRC_ChkSumCalcTbl_16Bit_PRE
  84.         B           CRC_ChkSumCalcTbl_16Bit_ALIGN32


  85. CRC_ChkSumCalcTbl_16Bit_ALIGN32_LOOP:
  86.         LDR         R6, [R2], #4                            ; temp    = *pdata++;

  87.         EOR         R4,  R6,  R0,  LSR #8                   ; ix      =  temp ^ (crc >> 8);
  88.         AND         R4,  R7,  R4,  LSL #1                   ; ix      =  ((ix >> 0) * 2) & 0x1FE;
  89.         LDRH        R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  90.         EOR         R0,  R5,  R0,  LSL #8                   ; crc     = (crc << 8) ^ tbl_val;

  91.         EOR         R4,  R6,  R0                            ; ix      =  temp ^ crc;
  92.         AND         R4,  R7,  R4,  LSR #7                   ; ix      =  ((ix >> 8) * 2) & 0x1FE;
  93.         LDRH        R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  94.         EOR         R0,  R5,  R0,  LSL #8                   ; crc     = (crc << 8) ^ tbl_val;

  95.         EOR         R4,  R6,  R0,  LSL #8                   ; ix      =  temp ^ (crc << 8);
  96.         AND         R4,  R7,  R4,  LSR #15                  ; ix      =  ((ix >> 16) * 2) & 0x1FE;
  97.         LDRH        R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  98.         EOR         R0,  R5,  R0,  LSL #8                   ; crc     = (crc << 8) ^ tbl_val;

  99.         EOR         R4,  R6,  R0,  LSL #16                  ; ix      =  temp ^ (crc << 16);
  100.         AND         R4,  R7,  R4,  LSR #23                  ; ix      =  ((ix >> 24) * 2) & 0x1FE;
  101.         LDRH        R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  102.         EOR         R0,  R5,  R0,  LSL #8                   ; crc     = (crc << 8) ^ tbl_val;

  103.         SUB         R3,  R3, #4                             ; nbytes -= 4;


  104. CRC_ChkSumCalcTbl_16Bit_ALIGN32:
  105.         CMP         R3, #(04*01*01)
  106.         BCS         CRC_ChkSumCalcTbl_16Bit_ALIGN32_LOOP
  107.         BCC         CRC_ChkSumCalcTbl_16Bit_POST


  108. CRC_ChkSumCalcTbl_16Bit_POST_LOOP:
  109.         LDRB        R4, [R2], #1                            ; ix      = *pdata++;
  110.         EOR         R4,  R4,  R0,  LSR #8                   ; ix     ^= (crc >> 8);
  111.         AND         R4,  R7,  R4,  LSL #1                   ; ix      =  (ix * 2) & 0x1FE;
  112.         LDRH        R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  113.         EOR         R0,  R5,  R0,  LSL #8                   ; crc     = (crc << 8) ^ tbl_val;

  114.         SUB         R3,  R3, #1                             ; nbytes--;


  115. CRC_ChkSumCalcTbl_16Bit_POST:
  116.         CMP         R3, #0
  117.         BNE         CRC_ChkSumCalcTbl_16Bit_POST_LOOP


  118. CRC_ChkSumCalcTbl_16Bit_END:
  119.         UXTH        R0, R0
  120.         LDMIA       SP!, {R4-R7}
  121.         BX          LR                                      ; return


  122. ;$PAGE
  123. ;********************************************************************************************************
  124. ;                                     CRC_ChkSumCalcTbl_16Bit_ref()
  125. ;
  126. ; Description : Calculate a 16-bit CRC using a table with reflection.
  127. ;
  128. ; Argument(s) : init_val        Initial CRC value.
  129. ;
  130. ;               ptbl            Pre-computed CRC table to use in calculation.
  131. ;
  132. ;               pdata           Pointer to data buffer over which CRC is generated.
  133. ;
  134. ;               nbr_octets      Number of data octets to use for calculation
  135. ;
  136. ; Return(s)   : 16-bit CRC.
  137. ;
  138. ; Caller(s)   : Application.
  139. *********************************************************************************************************

  140. ; CPU_INT16  CRC_ChkSumCalcTbl_16Bit_ref (CPU_INT16U   init_val,   @       ==>  R0 == sum
  141. ;                                         CPU_INT16U  *ptbl,       @       ==>  R1
  142. ;                                         CPU_INT08U  *pdata,      @       ==>  R2
  143. ;                                         CPU_INT32U   nbr_octets) @       ==>  R3
  144. ;                                                      ix          @       ==>  R4
  145. ;                                                      tbl_val     @       ==>  R5
  146. ;                                                      temp        @       ==>  R6
  147. ;                                                      0x1FF       @       ==>  R7

  148. CRC_ChkSumCalcTbl_16Bit_ref:
  149.         STMDB       SP!, {R4-R7}

  150.         MOVW        R7, #0x1FE
  151.         CMP         R3, #0
  152.         BEQ         CRC_ChkSumCalcTbl_16Bit_ref_END


  153. CRC_ChkSumCalcTbl_16Bit_ref_CHKALIGN32:
  154.         AND         R6, R2, #0x03
  155.         CMP         R6, #0
  156.         BEQ         CRC_ChkSumCalcTbl_16Bit_ref_ALIGN32


  157. CRC_ChkSumCalcTbl_16Bit_ref_PRE:
  158.         LDRB        R4, [R2], #1                            ; ix      = *pdata++;
  159.         EOR         R4,  R4,  R0                            ; ix     ^=  crc;
  160.         AND         R4,  R7,  R4,  LSL #1                   ; ix      =  (ix * 2) & 0x1FE;
  161.         LDRH        R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  162.         EOR         R0,  R5,  R0,  LSR #8                   ; crc     = (crc >> 8) ^ tbl_val;

  163.         SUB         R3,  R3, #1                             ; nbytes--;
  164.         ADD         R6,  R6, #1

  165.         CMP         R3, #0
  166.         BEQ         CRC_ChkSumCalcTbl_16Bit_ref_END

  167.         CMP         R6, #4
  168.         BNE         CRC_ChkSumCalcTbl_16Bit_ref_PRE
  169.         B           CRC_ChkSumCalcTbl_16Bit_ref_ALIGN32


  170. CRC_ChkSumCalcTbl_16Bit_ref_ALIGN32_LOOP:
  171.         LDR         R6, [R2], #4                            ; temp    = *pdata++;

  172.         EOR         R4,  R6,  R0                            ; ix      =  temp ^ crc;
  173.         AND         R4,  R7,  R4,  LSL #1                   ; ix      =  (ix * 2) & 0x1FE;
  174.         LDRH        R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  175.         EOR         R0,  R5,  R0,  LSR #8                   ; crc     = (crc >> 8) ^ tbl_val;

  176.         EOR         R4,  R0,  R6,  LSR #8                   ; ix     ^=  crc ^ (temp >> 8);
  177.         AND         R4,  R7,  R4,  LSL #1                   ; ix      =  (ix * 2) & 0x1FE;
  178.         LDRH        R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  179.         EOR         R0,  R5,  R0,  LSR #8                   ; crc     = (crc >> 8) ^ tbl_val;

  180.         EOR         R4,  R0,  R6,  LSR #16                  ; ix      =  crc ^ (temp >> 16);
  181.         AND         R4,  R7,  R4,  LSL #1                   ; ix      =  (ix * 2) & 0x1FE;
  182.         LDRH        R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  183.         EOR         R0,  R5,  R0,  LSR #8                   ; crc     = (crc >> 8) ^ tbl_val;

  184.         EOR         R4,  R0,  R6,  LSR #24                  ; ix      =  crc ^ (temp >> 24);
  185.         AND         R4,  R7,  R4,  LSL #1                   ; ix      =  (ix * 2) & 0x1FE;
  186.         LDRH        R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  187.         EOR         R0,  R5,  R0,  LSR #8                   ; crc     = (crc >> 8) ^ tbl_val;

  188.         SUB         R3,  R3, #4                             ; nbytes -= 4;


  189. CRC_ChkSumCalcTbl_16Bit_ref_ALIGN32:
  190.         CMP         R3, #(04*01*01)
  191.         BCS         CRC_ChkSumCalcTbl_16Bit_ref_ALIGN32_LOOP
  192.         BCC         CRC_ChkSumCalcTbl_16Bit_ref_POST


  193. CRC_ChkSumCalcTbl_16Bit_ref_POST_LOOP:
  194.         LDRB        R4, [R2], #1                            ; ix      = *pdata++;
  195.         EOR         R4,  R4,  R0                            ; ix     ^=  crc;
  196.         AND         R4,  R7,  R4,  LSL #1                   ; ix      =  (ix * 2) & 0x1FE;
  197.         LDRH        R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  198.         EOR         R0,  R5,  R0,  LSR #8                   ; crc     = (crc >> 8) ^ tbl_val;

  199.         SUB         R3,  R3, #1                             ; nbytes--;


  200. CRC_ChkSumCalcTbl_16Bit_ref_POST:
  201.         CMP         R3, #0
  202.         BNE         CRC_ChkSumCalcTbl_16Bit_ref_POST_LOOP


  203. CRC_ChkSumCalcTbl_16Bit_ref_END:
  204.         UXTH        R0, R0
  205.         LDMIA       SP!, {R4-R7}
  206.         BX          LR                                      ; return


  207. ;$PAGE
  208. ;********************************************************************************************************
  209. ;                                       CRC_ChkSumCalcTbl_32Bit()
  210. ;
  211. ; Description : Calculate a 32-bit CRC using a table without reflection.
  212. ;
  213. ; Argument(s) : init_val        Initial CRC value.
  214. ;
  215. ;               ptbl            Pre-computed CRC table to use in calculation.
  216. ;
  217. ;               pdata           Pointer to data buffer over which CRC is generated.
  218. ;
  219. ;               nbr_octets      Number of data octets to use for calculation
  220. ;
  221. ; Return(s)   : 32-bit CRC.
  222. ;
  223. ; Caller(s)   : Application.
  224. *********************************************************************************************************

  225. ; CPU_INT32  CRC_ChkSumCalcTbl_32Bit (CPU_INT32U   init_val,   @       ==>  R0 == sum
  226. ;                                     CPU_INT32U  *ptbl,       @       ==>  R1
  227. ;                                     CPU_INT08U  *pdata,      @       ==>  R2
  228. ;                                     CPU_INT32U   nbr_octets) @       ==>  R3
  229. ;                                                  ix          @       ==>  R4
  230. ;                                                  tbl_val     @       ==>  R5
  231. ;                                                  temp        @       ==>  R6
  232. ;                                                  0x3FF       @       ==>  R7

  233. CRC_ChkSumCalcTbl_32Bit:
  234.         STMDB       SP!, {R4-R7}

  235.         MOVW        R7, #0x3FC
  236.         CMP         R3, #0
  237.         BEQ         CRC_ChkSumCalcTbl_32Bit_END


  238. CRC_ChkSumCalcTbl_32Bit_CHKALIGN32:
  239.         AND         R6, R2, #0x03
  240.         CMP         R6, #0
  241.         BEQ         CRC_ChkSumCalcTbl_32Bit_ALIGN32


  242. CRC_ChkSumCalcTbl_32Bit_PRE:
  243.         LDRB        R4, [R2], #1                            ; ix      = *pdata++;
  244.         EOR         R4,  R4,  R0,  LSR #24                  ; ix     ^= (crc >> 24);
  245.         AND         R4,  R7,  R4,  LSL #2                   ; ix      =  (ix * 4) & 0x3FC;
  246.         LDR         R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  247.         EOR         R0,  R5,  R0,  LSL #8                   ; crc     = (crc << 8) ^ tbl_val;

  248.         SUB         R3,  R3, #1                             ; nbytes--;
  249.         ADD         R6,  R6, #1

  250.         CMP         R3, #0
  251.         BEQ         CRC_ChkSumCalcTbl_32Bit_END

  252.         CMP         R6, #4
  253.         BNE         CRC_ChkSumCalcTbl_32Bit_PRE
  254.         B           CRC_ChkSumCalcTbl_32Bit_ALIGN32


  255. CRC_ChkSumCalcTbl_32Bit_ALIGN32_LOOP:
  256.         LDR         R6, [R2], #4                            ; temp    = *pdata++;

  257.         EOR         R4,  R6,  R0,  LSR #24                  ; ix      =  temp ^ (crc >> 24);
  258.         AND         R4,  R7,  R4,  LSL #2                   ; ix      =  (ix * 4) & 0x3FC;
  259.         LDR         R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  260.         EOR         R0,  R5,  R0,  LSL #8                   ; crc     = (crc << 8) ^ tbl_val;

  261.         EOR         R4,  R6,  R0,  LSR #16                  ; ix      =  temp ^ (crc >> 16);
  262.         AND         R4,  R7,  R4,  LSR #6                   ; ix      =  ((ix >> 8) * 4) & 0x3FC;
  263.         LDR         R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  264.         EOR         R0,  R5,  R0,  LSL #8                   ; crc     = (crc << 8) ^ tbl_val;

  265.         EOR         R4,  R6,  R0,  LSR #8                   ; ix      =  temp ^ (crc >> 8);
  266.         AND         R4,  R7,  R4,  LSR #14                  ; ix      =  ((ix >> 16) * 4) & 0x3FC;
  267.         LDR         R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  268.         EOR         R0,  R5,  R0,  LSL #8                   ; crc     = (crc << 8) ^ tbl_val;

  269.         EOR         R4,  R6,  R0                            ; ix      =  temp ^ crc;
  270.         AND         R4,  R7,  R4,  LSR #22                  ; ix      =  ((ix >> 24) * 4) & 0x3FF;
  271.         LDR         R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  272.         EOR         R0,  R5,  R0,  LSL #8                   ; crc     = (crc << 8) ^ tbl_val;

  273.         SUB         R3,  R3, #4                             ; nbytes -= 4;


  274. CRC_ChkSumCalcTbl_32Bit_ALIGN32:
  275.         CMP         R3, #(04*01*01)
  276.         BCS         CRC_ChkSumCalcTbl_32Bit_ALIGN32_LOOP
  277.         BCC         CRC_ChkSumCalcTbl_32Bit_POST


  278. CRC_ChkSumCalcTbl_32Bit_POST_LOOP:
  279.         LDRB        R4, [R2], #1                            ; ix      = *pdata++;
  280.         EOR         R4,  R4,  R0,  LSR #24                  ; ix     ^= (crc >> 24);
  281.         AND         R4,  R7,  R4,  LSL #2                   ; ix      =  (ix * 4) & 0x3FC;
  282.         LDR         R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  283.         EOR         R0,  R5,  R0,  LSL #8                   ; crc     = (crc << 8) ^ tbl_val;

  284.         SUB         R3,  R3, #1                             ; nbytes--;


  285. CRC_ChkSumCalcTbl_32Bit_POST:
  286.         CMP         R3, #0
  287.         BNE         CRC_ChkSumCalcTbl_32Bit_POST_LOOP


  288. CRC_ChkSumCalcTbl_32Bit_END:
  289.         LDMIA       SP!, {R4-R7}
  290.         BX          LR                                      ; return


  291. ;$PAGE
  292. ;********************************************************************************************************
  293. ;                                     CRC_ChkSumCalcTbl_32Bit_ref()
  294. ;
  295. ; Description : Calculate a 32-bit CRC using a table with reflection.
  296. ;
  297. ; Argument(s) : init_val        Initial CRC value.
  298. ;
  299. ;               ptbl            Pre-computed CRC table to use in calculation.
  300. ;
  301. ;               pdata           Pointer to data buffer over which CRC is generated.
  302. ;
  303. ;               nbr_octets      Number of data octets to use for calculation
  304. ;
  305. ; Return(s)   : 16-bit CRC.
  306. ;
  307. ; Caller(s)   : Application.
  308. *********************************************************************************************************

  309. ; CPU_INT32  CRC_ChkSumCalcTbl_32Bit_ref (CPU_INT32U   init_val,   @       ==>  R0 == sum
  310. ;                                         CPU_INT32U  *ptbl,       @       ==>  R1
  311. ;                                         CPU_INT08U  *pdata,      @       ==>  R2
  312. ;                                         CPU_INT32U   nbr_octets) @       ==>  R3
  313. ;                                                      ix          @       ==>  R4
  314. ;                                                      tbl_val     @       ==>  R5
  315. ;                                                      temp        @       ==>  R6
  316. ;                                                      0x3FF       @       ==>  R7

  317. CRC_ChkSumCalcTbl_32Bit_ref:
  318.         STMDB       SP!, {R4-R7}

  319.         MOVW        R7, #0x3FC
  320.         CMP         R3, #0
  321.         BEQ         CRC_ChkSumCalcTbl_32Bit_ref_END


  322. CRC_ChkSumCalcTbl_32Bit_ref_CHKALIGN32:
  323.         AND         R6, R2, #0x03
  324.         CMP         R6, #0
  325.         BEQ         CRC_ChkSumCalcTbl_32Bit_ref_ALIGN32


  326. CRC_ChkSumCalcTbl_32Bit_ref_PRE:
  327.         LDRB        R4, [R2], #1                            ; ix      = *pdata++;
  328.         EOR         R4,  R4,  R0                            ; ix     ^=  crc;
  329.         AND         R4,  R7,  R4,  LSL #2                   ; ix      =  (ix * 4) & 0x3FC;
  330.         LDR         R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  331.         EOR         R0,  R5,  R0,  LSR #8                   ; crc     = (crc >> 8) ^ tbl_val;

  332.         SUB         R3,  R3, #1                             ; nbytes--;
  333.         ADD         R6,  R6, #1

  334.         CMP         R3, #0
  335.         BEQ         CRC_ChkSumCalcTbl_32Bit_ref_END

  336.         CMP         R6, #4
  337.         BNE         CRC_ChkSumCalcTbl_32Bit_ref_PRE
  338.         B           CRC_ChkSumCalcTbl_32Bit_ref_ALIGN32


  339. CRC_ChkSumCalcTbl_32Bit_ref_ALIGN32_LOOP:
  340.         LDR         R6, [R2], #4                            ; temp    = *pdata++;

  341.         EOR         R4,  R0,  R6                            ; ix      =  temp ^ crc;
  342.         AND         R4,  R7,  R4,  LSL #2                   ; ix      =  (ix * 4) & 0x3FC;
  343.         LDR         R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  344.         EOR         R0,  R5,  R0,  LSR #8                   ; crc     = (crc >> 8) ^ tbl_val;

  345.         EOR         R4,  R0,  R6,  LSR #8                   ; ix      =  crc ^ (temp >> 8);
  346.         AND         R4,  R7,  R4,  LSL #2                   ; ix      =  (ix * 4) & 0x3FC;
  347.         LDR         R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  348.         EOR         R0,  R5,  R0,  LSR #8                   ; crc     = (crc >> 8) ^ tbl_val;

  349.         EOR         R4,  R0,  R6,  LSR #16                  ; ix      =  crc ^ (temp >> 16);
  350.         AND         R4,  R7,  R4,  LSL #2                   ; ix      =  (ix * 4) & 0x3FC;
  351.         LDR         R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  352.         EOR         R0,  R5,  R0,  LSR #8                   ; crc     = (crc >> 8) ^ tbl_val;

  353.         EOR         R4,  R0,  R6,  LSR #24                  ; ix      =  crc ^ (temp >> 24);
  354.         AND         R4,  R7,  R4,  LSL #2                   ; ix      =  (ix * 4) & 0x3FC;
  355.         LDR         R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  356.         EOR         R0,  R5,  R0,  LSR #8                   ; crc     = (crc >> 8) ^ tbl_val;

  357.         SUB         R3,  R3, #4                             ; nbytes -= 4;


  358. CRC_ChkSumCalcTbl_32Bit_ref_ALIGN32:
  359.         CMP         R3, #(04*01*01)
  360.         BCS         CRC_ChkSumCalcTbl_32Bit_ref_ALIGN32_LOOP
  361.         BCC         CRC_ChkSumCalcTbl_32Bit_ref_POST


  362. CRC_ChkSumCalcTbl_32Bit_ref_POST_LOOP:
  363.         LDRB        R4, [R2], #1                            ; ix      = *pdata++;
  364.         EOR         R4,  R4,  R0                            ; ix     ^=  crc;
  365.         AND         R4,  R7,  R4,  LSL #2                   ; ix      =  (ix * 4) & 0x3FF;
  366.         LDR         R5, [R1, R4]                            ; tbl_val = *(ptbl + ix);
  367.         EOR         R0,  R5,  R0,  LSR #8                   ; crc     = (crc >> 8) ^ tbl_val;

  368.         SUB         R3,  R3, #1                             ; nbytes--;


  369. CRC_ChkSumCalcTbl_32Bit_ref_POST:
  370.         CMP         R3, #0
  371.         BNE         CRC_ChkSumCalcTbl_32Bit_ref_POST_LOOP


  372. CRC_ChkSumCalcTbl_32Bit_ref_END:
  373.         LDMIA       SP!, {R4-R7}
  374.         BX          LR                                      ; return

  375.         END
复制代码




回复

使用道具 举报

56

主题

904

回帖

1072

积分

至尊会员

积分
1072
发表于 2020-5-12 14:10:26 | 显示全部楼层
这个比查表还好吗?   不弄字库目前flash都是足够的,弄字库反正都要扩。 关键ram不够。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106708
QQ
 楼主| 发表于 2020-5-12 15:26:39 | 显示全部楼层
roguebear 发表于 2020-5-12 14:10
这个比查表还好吗?   不弄字库目前flash都是足够的,弄字库反正都要扩。 关键ram不够。。。

支持查表和计算两种方式。
回复

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
发表于 2020-5-12 15:49:20 | 显示全部楼层
谢谢分享
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106708
QQ
 楼主| 发表于 2020-5-13 16:03:43 | 显示全部楼层
经过实测,汇编方式确实有不少提升。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-30 11:15 , Processed in 0.245416 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表