This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS570LS0432:用于映像的 CCS CRC

Guru**** 2199010 points
Other Parts Discussed in Thread: TMS570LS0432
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/733566/ccs-tms570ls0432-ccs-crc-for-image

器件型号:TMS570LS0432

工具/软件:Code Composer Studio

我正在尝试对闪存芯片映像执行 CRC、以便可以嵌入到映像本身中。 在启动和运行时、我会定期重新检查 CRC 的有效性。

我以前在处理 STM32F407芯片时已经完成过这项工作、但我看不到如何在 Hercules 上执行此操作。

我使用的是 CCS 8.1.0和 TMS570LS0432处理器。

谢谢!

   Ken

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    要了解链接器内置的 CRC 支持、请在 ARM 汇编工具手册中搜索 标题 为链接器生成的 CRC 表的子章节。  支持多种不同的 CRC 算法。  请查阅器件的文档以了解要使用的算法。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢你的答复。

    在基于 HerculesTm的微控制器上使用 CRC 模块中所述,我实施了链路后 CRC,为了进行完整性检查,我在同一文档中实施了软件 CRC 算法。 我在最小的.obj 文件、esm_het.obj 上测试了 CRC、40字节。 链接器生成的 CRC 和计算出的 CRC 不匹配。

    下面是我对 sys_link.cmd 的修改:

    存储器

       引导程序(X) :origin=0x00000000 length=0x00000020
       内核 (RX):origin=0x00000020 length=0x00008000
       FLASHCRC(RW):origin=0x00008020 length=0x00000020
       FLASH0 (RX):origin=0x00008040 length=0x00057FC0
       堆栈 (RW):origin=0x08000000 length=0x00000800
       Kram   (RW):origin=0x08000800 length=0x00000800
       RAM    (RW):origin=(0x08000800+0x00000800) length=(0x00007800 - 0x00000800)
       
    /*用户代码开始(2)*/
    /*用户代码结束*/


    部分

       .intvecs:{}>向量
       闪存受保护区域中的/* FreeRTOS 内核*/
       .kernelTEXT  :{}>内核
       .cinit       :{}>内核
       .pinit       :{}>内核
       /*将其余代码转换为用户模式闪存区域*/
       .text        :{}> FLASH0
       .const       :{}>FLASH0
       /* RAM 受保护区域中的 FreeRTOS 内核数据*/
       .kernelbss   :{}>Kram
       .kernelHEAP  :{}> RAM
       .bss         :{}> RAM
       .data        :{}> RAM    
       .sysmem      :{}>RAM
       fee_text_section:{}> FLASH0
       fee_const_section:{}> FLASH0
       fee_data_section:{}> RAM
       
    /*用户代码开始(4)*/
       .section_TO_BE_VERIFIED:{esp_het.obj (.text)}> FLASH0、palign = 8、fill=0xffffff、crc_table (link_crc_table_name、算法= TMS570_CRC64_ISO)
       .TI.crctab:> FLASHCRC palign = 8
    /*用户代码结束*/


    在我的应用程序中、我调用:

    (笑声)

    crc_table * pCrcTable =(crc_table *) 0x00008020;
    uint64 crcLinkerGenerated = 0;
    uint64 crcSoftwareGenerated = 0;
    uint64 crcFullCpuGenerated = 0;

          //检查代码空间 CRC:
          UINT64 CRC64 = 0;
          uint64 * pData =(uint64 *) pCrcTable->recs[0].addr;
          int i = 0;
          int nSize = pCrcTable->recs[0].size/sizeof (uint64);
          (i=0;<nSize; i++ )
          {
             CRC64 = CRC_UPDATE_WORD (CRC64、pData[i]);
          }
          crcLinkerGenerated = pCrcTable->recs[0].crc_value;
          CrcSoftwareGenerated = CRC64;

    (笑声)

    下面是使用基于 HerculesTm的微控制器上的 CRC 模块复制的 CRC_UPDATE_WORD_()函数

    uint64 crc_update_word (uint64 CRC64、uint64数据)

       int i、j;
       uint64 nextCrc = 0;

       //对于63到0环路中的 I
       对于(i=63;i>=0;i---)
       {
          // next _CRC_VAL (0):= CRC_VAL (63) XOR data (I);
          nextCrc =(nextCrc & 0xfffffffffffffffffffeULL)|((CRC64 >> 63)^(数据>> I));

          //对于 j in 1到63循环
          对于(j=1;j<64;j++)
          {
             //case j 为
             //当1|3|4 =>时
             如果(j=1 || j=3 || j==4)
             {
                // NEW_CRC_VAL (j):= CRC_VAL (j - 1) XOR CRC_VAL (63) XOR DATA (i);
                nextCrc =(nextCrc &~(1ULL <<j))|(((((CRC64 >>(j - 1)))^(CRC64 >> 63)^(DATA >> I))& 1)<< j);
             }
             其他
             {
                //当其他人=>时
                // next _CRC_VAL (j):= CRC_VAL (j - 1);
                nextCrc =(nextCrc &~(1ULL <<j))|((((CRC64 >>(j - 1))& 1)<< j);
             }//结束大小写;
          }//结束循环;
          CRC64 = nextCrc;
       }//结束循环

       返回 CRC64;

    我已经验证了 pCrcTable 的内容。

    CrcLinkerGenerated    = 0x7F1C5537E7A6B66C

    CrcSoftwareGenerated = 0x7FC9F101E774C99A

    你有什么建议吗?

           Ken

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、问题已解决...

    我首次尝试使用软件 CRC 校验来验证由链接器生成的 CRC。 我的目的是最终使用 CPU 生成的 CRC。 我继续执行 CPU 生成的 CRC 和 LOW、看到它匹配! 我从 TI 文档中逐字复制的软件 CRC 生成函数有故障。

    由于我无法找到 CPU 生成的 CRC 的全面描述、我自己解决了。 以下是分步说明:

    1.创建由链接器生成的 CRC:
    1.1.在 sys_link.cmd 中、MEMORY{}为 CRC 结构创建一个存储器区域:

              FLASHCRC(RW):origin=0x00008020 length=0x00000020

              在本例中、我将其放置在先前分配给 FLASH0的地址、然后移动
              FLASH0的起始地址为32 (0x20):

              FLASH0 (RX):origin=0x00008040 length=0x00057FC0

    1.2.在 sys_link.cmd 中、SECTIONS{}生成 CRC 结构并执行以下计算:

       .section_TO_BE_VERIFIC验证:{*(.text)}> FLASH0、palign = 8、fill=0xffffffff、crc_table (link_crc_table_name、算法= TMS570_CRC64_ISO)
       .TI.crctab:> FLASHCRC palign = 8

    2.在我的运行时代码中:

           extern crc_table link_crc_table_name;
           crc_table * pCrcTable =&link_crc_table_name;
           uint64 crcLinkerGenerated = pCrcTable->recs[0].crc_value;
           uint64 crcFullCpuGenerated = 0;
           crcModConfig_t CrcModConfig;

           CrcModConfig.mode = CRC_FULL_CPU;
           CrcModConfig.CRC_CHANNEL = 0;
           CrcModConfig.data_length = pCrcTable->recs[0].size/sizeof (uint64);
           CrcModConfig.src_data_pat =(uint64 *) pCrcTable->recs[0].addr;

           crcInit();
           crcChannelReset (crcREG、0);
           CrcSignGen (crcREG、&CrcModConfig);
           crcFullCpuGenerated = crcGetPSASig (crcREG、0);

           if (crcLinkerGenerated!= crcFullCpuGenerated)
           {
               //在此处执行错误处理!
           }

    我希望此分步指南能帮助其他人...

    最棒的...

           Ken