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.

[参考译文] TMS320F28335-Q1:刷写到器件后固件无法正常工作

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1518284/tms320f28335-q1-firmware-does-not-work-after-flashing-to-device

器件型号:TMS320F28335-Q1
主题中讨论的其他器件:TMDSCNCD28335C2000WARE

工具/软件:

我在 TMDSCNCD28335上使用 CCS v12.3开发了固件。 如果我们在 CCS 调试器上使用 RAM 链接器命令文件、此方法效果很好。 如果我更改为使用闪存链接器命令文件 F28335并将--ramfunc 选项设置为 on、则在将固件刷写到器件后它无法很好地运行。 但是、如果我关闭--ramfunc 选项、固件在刷写后将运行良好。 如果在打开--ramfunc 选项时查看映 射文件、我会发现包含 main 函数的 obj 文件在 RAM 中被映射两次、 如下所示:

段分配映射

输出属性/
段页原点长度输入段
----- ------------------------ ----- ------------------------
.TI.ramfunc
* 0 00320000 0000065c 运行 ADDR = 00008000
00320000 00000365 DSP2833x_DefaultIsr.obj (.TI.ramfunc:retain)
00320365 000000d9 DSP2833x_sysctrl.obj (.TI.ramfunc)
0032043e 000000a0 SmartBit_2833xSci_int_1.obj (.TI.ramfunc:retain)
003204de 00000074 DSP2833x_CpuTIMERs.obj (.TI.ramfunc)
00320552 00000074 SmartBit_2833xSci_int_1.obj (.TI.ramfunc)
003205c6 00000048 DSP2833x_SCI.obj (.TI.ramfunc)
0032060e 00000028 DSP2833x_PIECTRL.obj (.TI.ramfunc)
00320636 00000022 DSP2833x_PieVect.obj (.TI.ramfunc)
00320658 00000004 DSP2833x_usDelay.obj (.TI.ramfunc)

这似乎是使固件无法正常工作的原因。 我的问题是,如何摆脱其中一个? 此固件根据 TI 的 SCI 通信示例例例程进行了修改。  

提前感谢您的帮助。

Weiliang

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

    Weiliang,

    如果您找到函数 SmartBit_2833xSci_int_1 (),那么它应该在上面有一个#pragma ,如下所示:将它分配给>TI.ramfunc 的段

    #ifdef __cplusplus
    #pragma CODE_SECTION(".TI.ramfunc");
    #else
    #pragma CODE_SECTION(SmartBit_2833x..., ".TI.ramfunc");
    #endif

    由于您也在显示"retain"段、我想您可能会在代码中找到额外的#pragma retain;这在条件链接的情况下是必需的、但我怀疑.cmd 文件中有这个。  我将尝试删除此额外 pragma、并查看此操作是否会清除。

    此致、

    Matthew

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

    您好、Matthew、

    感谢您的回复并帮助我了解这个问题。 但在我的代码中、我没有您所指出的#pragma、并且我的代码 和链接器文件都没有用于定义保留段的#pragma。 我所做的就是在我的 CCS 项目属性"C2000 Compiler"->"Advanced Options"->"Runtime Model Options"中打开了--ramfunc 的选项。 看起来 Retain 段是编译器在编译过程中自动添加的。 在这种情况下、如何删除此保留部分?

    此致、

    Weiliang  

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

    Weilang、

    我需要咨询编译器团队、了解可以/应该如何使用"运行时模型选项"。  我只熟悉对于需要加载到闪存并从 RAM 运行的代码段/数据段、手动插入 pragma。  

    同时、请查看 C2000Ware (C:\ti\c2000\C2000Ware_5_04_00_00\device_support\F2833x\examples\flash_F28335)中的此示例、其中手动插入了正确的.cmd 和#pragma 以及 memcopy 函数。  由于闪存大小>>该 RAM 大小、应用通常只从 RAM 复制/运行时间关键型函数。

    此致、

    Matthew

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我所做的就是在我的 CCS 工程属性 c2000 compiler->Advanced Options->Runtime Model Options 中打开--ramfunc 的选项。

    这与将程序中的每个函数放在部分相同 .TI.ramfunc 。  我想不出有什么好的理由可以这样做。  我很惊讶链接能正常工作。

    谢谢。此致、

    -乔治

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

    Matthew、

    这大有帮助。  这解决了我的问题。 不过、 如果我在 CCS 中打开--ramfunc 选项、链接器会插入存储器复制函数。 我必须要把它添加到我的主要功能中。  

    我很好奇:(1) CCS 中使用的--ramfunc 选项是什么?(2)链接器中使用的 table (BINIT)的函数是什么? (1)我尝试在 CCS 中打开--ramfunc 并在我的 Main 函数中添加内存复制函数。 事实证明、它不起作用。  

    此致、

    Weiliang

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

    George、

    感谢您的答复。 在这种情况下、链接器可以工作、但独立固件不工作。  我的理解是链接器只使用此选项来配置闪存和 RAM 中的加载和运行地址。 如果我在 main 中没有存储器复制函数、当运行时支持例程将其控制权转移到 RAM 处的 main 时、没有什么东西可以接管控制权。

    此致、

    Weiliang

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

    我认为、如果将代码分成不同的工程、ramfunc 选项可能很有用、那么您可能将某个工程的内容都包含在-ramfunc 开关中。  只是想一下、我没有像上面提到的那样使用这个开关。

    BINIT (boot init)是 memcopy 函数的替代方法、基本上是通过向 binit 添加一个段、这些工具会在引导初始化过程中处理存储器复制、然后再将 MCU 控制移交给"main"函数。  这篇文章给出了该选项的语法。

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1224756/tmdscncd28379d-system-clock-and-flash-setting/4627567?tisearch=e2e-sitesearch&keymatch=binit#4627567

    此致、

    Matthew  

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

    Matthew、

    感谢您提供有关如何使用 table(BINIT)的信息。 我在固件中没有使用存储器复制函数的情况下尝试使用 table (BINIT)。 阅读你提到的帖子后,我发现我把.binit 段放在错误的内存(我把它放到 RAM 而不是闪存)。 现在我明白为什么它不起作用了。

    此致、

    Weiliang

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

    关于选项 -- ramfunc 您说...

     我的理解是链接器只使用此选项来配置闪存和 RAM 中的加载和运行地址。

    不正确。  。 -- ramfunc 在 CCS 工程级别应用的选项会使每个函数都位于该段中 .TI.ramfunc 。  有关更多详细信息、请搜索 -- ramfunc  更多详细信息。  安排 .TI.ramfunc 在链接器命令文件中具有单独的加载地址和运行地址。  例如、请搜索文章 链接器命令文件入门  、查找名为 Load at One Address、Run from a different Address 的子部分。  大多数(还是全部?) 提供的链接器命令文件的可编程性 .TI.ramfunc  代码运行。

    如果我在 main 中没有内存复制函数、当运行时支持例程将其控制权转移到 RAM 处的 main 时、没有什么可接管控制权。

    这是另一个不适用的原因 -- ramfunc 整个工程中。  系统启动代码以及从闪存复制到 RAM 的代码本身不能位于中 .TI.ramfunc

    谢谢。此致、

    -乔治

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

    George、

    感谢有关使用--ramfunc 选项的解释和说明。 这有助于我更好地了解如何使用该选项。

    此致、

    Weiliang