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.

[参考译文] RTOS/TM4C1294NCPDT:TI-RTOS 的 CRC 头

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/676349/rtos-tm4c1294ncpdt-crc-header-for-ti-rtos

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

我希望引导加载程序为编译的 TI-RTOS 应用程序执行 CRC 检查。 引导加载程序需要一个标头"存储在矢量表的正上方、 并由字0xFF01FF02和0xFF03FF04标记"。 下面的文章给出了一个简单的解决方案: e2e.ti.com/.../2000471

TI-RTOS 项目没有 STARTUP_CCS.c 文件 AFAIK。 如何编辑矢量表?

Amit 的指令似乎与引导加载程序的指令相矛盾。 Amit 提示将标题放在最后一个表条目之后。 引导加载程序要求将标头放在表的上方。 是否应在表的前后存储标头、或者顺序是否无关紧要?

TivaWare 提供源代码来创建将 CRC 添加到二进制文件 binpack 的程序。 在 binpack 给我一个错误"输入文件不包含矢量表顶部的图像信息标头!"之前、我没有意识到我需要自己制作此标头!

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

    尊敬的 Peter:

     我认为这取决于您如何定义矢量表的底部。 我认为 Amit 的意思是要放置在矢量表中最后一个条目之后的 CRC 头。 很明显、如果您查看下表、则 CRC 标头不能放置在0x0以下。 在引导加载程序中、它将从0x20000000开始重新映射矢量表。 因此、CRC 头的位置不会小于0x20000000。  

     至于 TI-RTOS 应用程序的矢量表、我需要咨询我们的 TI-RTOS 专家。  

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

    Peter、

    从 SYS/BIOS API 参考

    默认情况下、会创建两个矢量表:
      1. 一个15条目引导矢量表被放置在闪存中的地址0x00000000处。
      2. 50个入口矢量表放置在 RAM 中的地址0x20000000处。
    闪存引导矢量表包含在基于 RAM 的矢量表初始化之前使用的复位矢量和异常处理程序矢量(如上面的屏幕截图所示)。
    RAM 矢量表包含相同的前15个矢量以及 SysTick 矢量和其余的用户中断矢量。
    在系统启动期间、NVIC 矢量表偏移寄存器被初始化、在它被初始化后指向 RAM 矢量表。
    Derrick
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在其他帖子和 XGCONF 中的 HWI 模块中看到了这些信息、但我仍然不确定该怎么办。

    目标是在此表中添加 CRC 头、使固件可通过以太网升级。 这些任务令我感到困惑,因为库文件 myProjectName_pem4f.oem4f 使用了内存区域。 如何如其他 E2E 帖子中所示编辑此库文件的表?

    我不希望 CRC 头被复制到 SRAM 中。

    请注意、我将在地址0x4000而非0处对引导矢量表进行散列运算、因为引导加载程序在地址范围0到0x4000之间。 来自.map 文件的这些行显示了效果:

    段分配映射

    运行 origin load origin length init length atts members
    ------ ------ ------ ------ ---- ----
    00004000 00004000 0000a690 0000a690 r-x
    00004000 00004000 0000003c 0000003c r-.Vecresets

    文件中的后一个:
    .resetVecs
    0 00004000 0000003c
    00004000 0000003c myProjectName_pem4f.oem4f (.resetVecs)

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

    Peter、

    您可以使用#pragma 内在函数将 CRC 放置在所需的地址。 在本例中、您需要将 CRC 放置在0x4040处。

    #pragma LOCATION (myCRC、0x4040);
    静态常量字符 myCRC[16]={0xAB、0xBC、0xCD、0xDE、
    0xBC、0xAB、0xDE、0xCD、
    0xCD、0xDE、0xAB、0xBC、
    0xDE、0xCD、0xBC、0xAB}; 

    Derrick

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

    我已将其添加到.c 文件中、但.map 文件显示位于该地址0x4040处的其他内容:

    段页原点长度输入段
    ---- -------- ------ --------
    .text 0 00004040 000080aa
    00004040 00000430 sysbios.aem4f:BIOS.obj (.text:ti_sysbios_family_arm_m3_Hwi_excDumpRegs__I)



    这是否需要编辑.cmd 文件?

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

    当我制作一些虚假代码来引用数组时、myCRC 会显示在映射文件中:
    int dummy = myCRC[2];

    此 Hack 仅在关闭优化的情况下工作。 是否有人要告诉编译器"把这个放在这里、我的意思是!"?

     ARM 编译器用户指南(SPNU151M)的第5.10.16节将一切都留给人们想象。

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

    myCRC 出现在映射文件中,当我制作一些假代码来引用数组时:

    如果代码中未引用该数组,请尝试以下操作以防止其被丢弃:

    pragma RETAIN (myCRC) 

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

    George Mock 在另一篇有关该主题的文章中建议使用#pragma RETAIN (myCRC)。 这会阻止链接器删除未使用的变量。

    该指令也位于 SPNU151M 中、但很难查找您不知道存在的内容。

    编辑:  也建议这样做。 我写的时候没有看到他的帖子。

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

    您还可以使用 TI 链接器中的'--retain'选项显式指定符号。

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

    感谢你的帮助。 我刚刚将一个映像加载到检查 CRC 的引导加载程序中。 它的工作原理。

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

    尊敬的 Peter:

    您能不能告诉我您是如何生成 CRC 校验文件的。 我尝试生成 CRC 校验 bin 文件、但没有成功。 谢谢

    "${CCS_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin ""${BuildArtiftFileName}""${BuildArtifactFileBaseName}.bin""${CG_TOOL_ROOT}/bin/armofd ""${CG_TOOL_ROOT}/bin/armhex ""${CCS_INSTALL_ROOT}/utils/tiobj2bin/mkhex4bin
    "${TIVAWARE_INSTALL}/tools/bin/binpack "-i "${BuildArtiftFileBaseName}.bin"-o "${BuildArtiftFileBaseName}-DFU.bin"-a 0x4000

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

    TI 提供源代码来在安装 TivaWare 的情况下构建名为 binpack 的命令行工具。

    我使用 Visual Studio 对其进行编译。 您的 postbuild 步骤看起来正确。 确保二进制文件 binpack.exe 位于路径或"include files"中的某个位置。

    此外、如果对.out 文件未做任何更改、CCS 中的编译后处理步骤不会运行。 删除它以强制执行要运行的步骤。