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.

[参考译文] TMS320F2800132:链接器计算的 CRC 帮助

Guru**** 2583665 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1386836/tms320f2800132-help-with-linker-calculated-crc

器件型号:TMS320F2800132

工具与软件:

尊敬的支持团队:

我需要编写的一部分代码被认为是关键的、以后无法更改、另一部分可能会正常更改。

为了遵守此要求、我 已经在 FLASH_BANK 中为此关键代码创建了一个特定区域、然后使用链接器计算 CRC:

	.section_safety : {sta_tests.obj(.text),
						stl_sp.obj(.text),
						stl_cpu_reg.obj(.text),
						ref_crc.obj(.text) } crc_table(_my_crc_table_for_safety, algorithm=CRC32_PRIME) >FLASHBANK0_SAFETY,	ALIGN(8)

不同的.obj 是包含关键代码的相应文件。

计算 CRC 也可以、在启动时进行 CRC 校验(根据链接器保存的值)。

我的问题实际上是、更改非关键部分中的某些代码部分会更改 CRC 的值。

起初、我有一些由关键代码调用的函数、它们位于与非关键代码相同的闪存区域中。 因此、当非关键代码中的代码发生变化时、受链接器影响的地址也发生了变化、这可以解释这个问题(此时我还可以看到 Critical .obj 文件在非关键代码发生变化时发生了变化)。

我的第一项工作就是将由 特定闪存区域中的关键代码调用的所有函数放入特定闪存区域、或将函数调用替换为该函数的代码。 我没有更改内联的函数调用、因为链接器会复制 关键区域中的代码。

现在、所有这项工作都已完成、如果非关键区域发生变化、我仍然有一个不同的 CRC。

我比较关键部分的.obj 文件、以及非关键部分更改前后的.obj 文件、这些 obj 是相同的。 在.lst 文件中、我只能看到日期/时间的差异。

但是我可以看到、在"构建项目"期间、即使对我来说没有明显的原因、也会生成一个关键的 c 文件。

也许仍然有一个函数调用在非关键区域中调用代码、但检查.map 文件中的差异、这似乎并不存在。

在我的理解中有什么问题吗?  如果此器件没有变化、那么关键区域的 CRC 不应更改?

我可以使用什么方法来找到一部分关键代码受非关键代码(如果有)影响的情况?

此致。

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

    很抱歉、我不能完全理解您的情况。  但我看到您在链接器中使用了基于该段的 CRC 功能。  也可以通过基于存储器区域的方法来实现它。  它可能更适合您的情况。  相关详细信息、 请搜索 C28x 汇编工具手册  中标题为在 MEMORY 指令中使用 crc ()运算符的子章节。

    谢谢。此致、

    -George.

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

    感谢你的帮助。

    我将在下周尝试你的建议。 当然、这将更合适、但我认为它不能解决问题。

    实际上、我的问题是、我没有找到 CRC 为何会受到其他部分更改的影响。 我怀疑在某个地方有一个调用函数地址更改(或数据地址更改),但代码相当大,它可能很难找到它的位置。

    我需要找到一个工具来帮助我找到已更改的器件/数据/功能。

    最好的做法是对 C 代码稍加改动 、我可以提取这些代码并使用它们进行比较、以查找字节的差异位置、并将其与代码链接起来。

    我可以提取二进制文件并进行比较、但将其链接到 C 代码可能会很困难。

    此致。

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

    如果您确定一个函数存在差异、请调整文章 查找代码大小增加的源中所述的技术.  这篇文章介绍了如何查找代码大小增加最多的函数。  您对任何具有不同大小的函数都感兴趣。  这种方法的一个缺点是、它假定代码存在差异、始终意味着大小存在差异。  但事实并非总是如此。  两个函数可能具有相同的大小、但仍然不同。

    另一种方法是比较反汇编。  要反汇编整个程序、请使用类似于...的命令。

    DIS2000 executive_file.out > disassembly_file.txt

    此默认设置仅反汇编包含代码的段。  如果您还想反汇编数据段、请添加选项 -全部 .  反汇编器位于同一位置 \bin 加载目录作为编译器 cl2000 .

    比较两个构建的反汇编。  找到一个有很多差异的地址范围。  使用链接器映射文件将该地址范围与1或2个源文件相关联。  然后从这里继续。

    谢谢。此致、

    -George.

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

    您好!

    感谢您分享一些技巧。 这些都很有趣、将来可能会对我有所帮助。

    我最终使用不同的方法找到了我的问题、我没有计算不同.obj 的 CRC、而是计算了每个.obj 的 CRC。 因此、我一直无法找到哪个源文件有问题。 我很幸运,这是最小的一个,所以我很容易找到问题...