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.

[参考译文] CRC-AM243X:使用 MCU-PLUS-SDK 计算段的 CRC、并与链接器结果进行比较

Guru**** 2461020 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1466994/mcu-plus-sdk-am243x-calculate-crc-of-sections-with-mcrc-and-compare-with-linker-results

器件型号:MCU-PLUS-SDK AM243X

工具与软件:

您好!

我想通过 MCRC 模块来计算 RAM 不同部分的 CRC、并把它与连接器计算出的值相比较。

在链接器中、我添加了以下器件来计算 CRC:

[...]

    GROUP {
        .text:   {} palign(8)   /* This is where code resides */
        .rodata: {} palign(8)   /* This is where const's go */
    } crc_table(application_crctab) > DDR_CORE_0_APP

[...]

    .TI.crctab : {} > DDR_CORE_0_CRC

[...]

	DDR_CORE_0_CRC          : ORIGIN = 0x83E00000, LENGTH = 0x00200000 /*  2 MB */

[...]

然后在源代码中、我有一个任务涉及:

#include <crc_tbl.h>

#include <kernel/dpl/AddrTranslateP.h>
#include <drivers/crc.h>

#include "ti_drivers_open_close.h"
#include "ti_board_open_close.h"

#define APP_CRC_PATTERN_SIZE                ((uint32_t) 8U)
#define APP_CRC_SECT_CNT                    ((uint32_t) 1U)
#define APP_CRC_WATCHDOG_PRELOAD_VAL        ((uint32_t) 0U)
#define APP_CRC_BLOCK_PRELOAD_VAL           ((uint32_t) 0U)


extern CRC_TABLE application_crctab;

static void taskCrc(void *args)
{

    uint32_t                loopCnt, patternCnt, baseAddr;
    CRC_Channel_t           chNumber;
    CRC_Signature           signVal;
    CRC_SignatureRegAddr    psaSignRegAddr;

    CRC_RECORD    crc_rec = application_crctab.recs[0];

    /* Configure CRC parameters */
    baseAddr           = (uint32_t) AddrTranslateP_getLocalAddr(CONFIG_CRC0_BASE_ADDR);
    DebugP_assert(crc_rec.size % APP_CRC_PATTERN_SIZE == 0);
    patternCnt         = crc_rec.size / APP_CRC_PATTERN_SIZE;
    chNumber           = CRC_CHANNEL_3;

    /* Get CRC PSA signature register address */
    CRC_getPSASigRegAddr(baseAddr, chNumber, &psaSignRegAddr);

    /* Initialize and Configure CRC channel */
    CRC_initialize(baseAddr, chNumber, APP_CRC_WATCHDOG_PRELOAD_VAL, APP_CRC_BLOCK_PRELOAD_VAL);

    CRC_configure(baseAddr, chNumber, patternCnt, APP_CRC_SECT_CNT, CRC_OPERATION_MODE_FULLCPU);

    /* Reset the CRC channel*/
    CRC_channelReset(baseAddr, chNumber);

    uint64_t* buffer = (uint64_t*) crc_rec.addr;

    /* compute the CRC by writing the data buffer on which CRC computation is needed */
    for (loopCnt = 0; loopCnt < patternCnt ; loopCnt++)
    {
        *(volatile uint64_t *) ((uintptr_t) psaSignRegAddr.regL) = buffer[loopCnt];
    }

    /* Fetch CRC signature value */
    CRC_getPSASig(baseAddr, chNumber, &signVal);

    /* Compare CRC signature value against reference CRC signature */
    char CRCresult = ( ((crc_rec.crc_value & 0xFFFFFFFF) == signVal.regH) &&
                  (((crc_rec.crc_value >> 32) & 0xFFFFFFFF) == signVal.regL) );
    
    [...]
}

目前作为测试、我仅计算.text 段的 CRC。 结果总是错误的、为什么?
在这里读到 、MCRC 模块使用 TMS570_CRC64_ISO 算法计算 CRC、所以我直接使用 psaSignRegAddr.regL 寄存器上的 uint64_t 数据进行复制、正确吗?

此致、

Andrea

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

    更改了 Sitara MPU 的分配

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

    你好 Andrea Politano

    我正在查看您的问题,您可能希望在一两天内得到回复。

    此致、

    Anil。

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

    你好 Andrea Politano

    我的建议是、不要为文本大小等更多数据计算 CRC、而是使用10字节的数据、计算链接器的 CRC、从 MCRC 模块计算 CRC 并检查两个 CRC 值。

    这可以为我们提供线索。

    我假设此方法由 TMS570_CRC64_ISO 计算、因此交换了数据字节、并根据下面的链接执行 CRC。

    https://software-dl.ti.com/codegen/docs/tiarmclang/compiler_tools_user_guide/compiler_manual/linker_description/09_linker_generated_crc_tables/a-note-on-the-tms570-crc64-iso-algorithm-stdz0756196.html

    此外、我们不会交换这些数据并将其传递到 MCRC 模块。

    最后、我们将检查两者是否相同。

    因此、请对10个字节或更少的字节进行 CRC 验证、并共享这为我们提供线索的所有 CRC 值。

    从下一次开始、请分享您的项目。 这将有助于更快地解决问题。

    我不需要整个项目、只需要 CRC 模块应用程序。

    此致、

    Anil。

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

    尊敬的 Anil:

    感谢您的答复。

    我们仍在努力、下周我们将对您的建议作出答复。

    谢谢你。

    此致、
    Andrea

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

    安德烈、您好!

    感谢您的更新。

    完成测试后、请分享测试结果。

    此致、

    Anil。

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

    您好!

    我是通过只将一个64位值传递给 MCRC 模块并检查结果来执行此测试的、我使用了我在这篇文章中编写的相同代码。 I WRITE 的数据是0x24421A80240003C0、结果为 signVal.regL = 0xB4033CED 且 signVal.regH = 0x0AF753AD。

    我也通过简单地不写入任何数据进行了测试、并且正如预期的那样、结果为 signVal.regL = 0x0和 signVal.regH = 0x0。

    目前、我已经通过遵循 此链接手动实现 CRC、 该链接显示了链接器应该如何计算 CRC、从而暂时解决了此问题、但是如果能够利用 MCRC 模块并计算 CRC64算法而不是链接中使用的 CRC8-16-32、那么这将非常有用。

    我曾经尝试 使用 CRC 64 ISO 算法通过这个工具在线计算这个64位值的 CRC、但是、即使是尝试更改这个值的字节序、我也不知道如何获得这个结果。

    谢谢!

    此致、

    Andrea

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

    安德烈、您好!

    您能否从链接器共享上述64位值的 CRC 值?

    此致、

    Anil

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

    您好!


    当然、链接器会改为计算 CRC 为0x0C00266D0AF75383。

    谢谢!

    此致、

    Andrea

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

    安德烈、您好!

    CRC ISO 64位 与 SoC 上可用的 MCRC 模块不匹配。

     最初、对于 CRC ISO、它将获取初始十六进制数据并执行 CRC、并且此 CRC ISO 结果与 MCRC 模块不匹配。

    您可以使用下面的工具并保留以下设置。

    https://www.lddgo.net/en/encrypt/crc

    对于"0x24421A80240003C0"、我将从工具获取不同的 CRC 值。

    您能否确认您提供的上述数据是否正确?

    根据上述数据、我得到这个0AF753830C00266D CRC 结果。

    此致、

    Anil。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="623297" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1466994/mcu-plus-sdk-am243x-calculate-crc-of-sections-with-mcrc-and-compare-with-linker-results/5674839 #5674839"]

    当然、链接器会改为计算 CRC 为0x0C00266D0AF75383。

    [报价]

    安德烈亚斯

    上面的链接器结果与该工具完全匹配、并且链接器中的结果被转换为32位。

    请查看工具结果、在这个情况下、MCRC 模块给出了错误的 CRC 计算。

    此致、

    Anil。

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

    您好、Andreas、

    MCRC 模块连接到32位 VBUSP、因此无法进行64位原子写入。

    因此、AM64X 上提供的 MCRC 模块不支持64位 CRC、仅支持8位、16位和32位。

    在上面的代码中、您需要键入32bit 并对 32个源缓冲区执行 CRC 计算。

    类似地、您还需要使用32位从链接器计算 CRC。

    则仅 SOC CRC 和链接器 CRC 都应匹配。

        uint32_t* buffer = (uint32_t*) crc_rec.addr;
    
        /* compute the CRC by writing the data buffer on which CRC computation is needed */
        for (loopCnt = 0; loopCnt < patternCnt ; loopCnt++)
        {
            *(volatile uint32_t *) ((uintptr_t) psaSignRegAddr.regL) = buffer[loopCnt];
        }

    此致、

    Anil。

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

    尊敬的 Anil:

    感谢您的答复。

    我们将在下周测试您的建议。

    谢谢你。

    此致、
    Andrea