ZHCUAV7Z september 1995 – march 2023 66AK2E05 , 66AK2H06 , 66AK2H12 , 66AK2H14 , AM1705 , AM1707 , AM1802 , AM1806 , AM1808 , AM1810 , AM5K2E04 , C346BA02 , C348A01 , CS241C01-Q1 , CS241C05-Q1 , CS246C01-Q1 , CS348C02-Q1 , OMAP-L132 , OMAP-L137 , OMAP-L138 , S470AV336LYSQRB , TMS470R1A288 , TMS470R1A384 , TMS470R1A64 , TMS470R1B1M , TMS470R1B512 , TMS470R1B768
MCRC 模块会计算 64 位数据块的 CRC。这是通过将 long long 值写入两个存储器映射的寄存器来实现的。在 C 中,这看起来像是向存储器写入 long long 的正常操作。为在存储器中读取/写入 long long 而生成的代码如下所示,其中 R2 包含最高有效字,R3 包含最低有效字。因此,最高有效字写入到低地址,最低有效字写入到高地址:
LDM R0, {R2, R3}
STM R1, {R2, R3}
CRC 存储器映射的寄存器的顺序与编译器执行存储的顺序相反。最低有效字映射到低地址,最高有效字映射到高地址。
这意味着在执行 CRC 计算之前实际上交换了字。此外,也意味着计算出的 CRC 值交换了字。TMS570_CRC64_ISO 算法会考虑这些问题,并在计算 CRC 值时执行交换。在表中存储的 CRC 计算值交换了字,因此该值与存储器中的值相同。
对于最终用户而言,这些细节应该是透明的。如果运行时 CRC 例程是用 C 编写的,则将会正确生成 long long 加载和存储。MCRC 模块的 DMA 模式也将正常工作。
该算法的另一个问题是它需要使用 64 位块来完成运行时的 CRC 计算。MCRC 模块允许使用更小的数据块,但值会填充为 64 位。TMS570_CRC64_ISO 算法不会执行任何填充,因此所有 CRC 计算都必须使用 64 位值来完成。如果数据不是在 64 位边界上结束,该算法将自动用零填充数据的末尾。