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.

[参考译文] TMS320F28P650DK:将代码加载到闪存、然后从 RAM 运行程序

Guru**** 2553260 points
Other Parts Discussed in Thread: C2000WARE, UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1323809/tms320f28p650dk-load-code-to-flash-and-then-run-the-program-from-ram

器件型号:TMS320F28P650DK
主题中讨论的其他器件:C2000WAREUNIFLASH

我正在尝试使用 BINIT 表将.text 段加载到闪存、然后在 RAM 中运行。 在这样做的同时、我将面临这个问题。

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

    您好 Rishitha:

    要将配置为从 RAM 运行的现有应用迁移到基于闪存的链接器配置、请执行以下步骤:
    1. 用闪存连接器命令文件替换 RAM 连接器命令文件。 例如、基于闪存的链接器命令文件、请参阅 device_support\ \common\cmd 目录。
    2. 修改基于闪存的链接器命令文件时、请确保将任何已初始化的段映射到闪存区域。
    3. 确保为闪存引导配置引导模式引脚。 这就告诉引导 ROM 在引导代码执行完成后将执行重定向到编程到闪存存储器中的应用程序。 要获得与引导模式配置相关的更多信息、请见器件数据表中的"详细说明⏵器件引导模式"。
    4. 当器件配置为闪存引导时、引导 ROM 在引导代码执行结束时将执行重定向到闪存入口点位置(在 TI 提供的闪存链接器命令文件中定义为 BEGIN)。 确保在到您的代码初始化(例如、_c_int00)函数的闪存入口点有一个分支指令。 在 C2000Ware 示例中、在 CodeStartBranch.asm 文件中指定入口点代码。
    5. 为了实现闪存执行的最佳性能、请根据器件数据手册中指定的器件工作时钟频率配置闪存等待状态。 此外、启用预取模式和数据缓存模式。 调用 Flash_initModule() driverlib 函数可实现这些步骤。 请注意、初始化闪存模块的代码必须从一个 RAM 位置执行。 实现方法是将闪存初始化函数分配给.TI.ramfunc 段、然后在运行时使用 memcpy ()将函数复制到 RAM、再执行该函数。 在链接器命令文件中、将此部分映射到闪存进行加载、并将 RAM 映射到执行。
    6. 对于任何需要0或1等待状态性能的函数、请确保映射到 RAM 以在链接器命令文件中执行、类似于闪存初始化函数。 TI 提供的闪存链接器命令文件中的.TI.ramfunc 部分实现了这一目的。
    7. 在映射到闪存时、使用链接器命令文件中的 ALIGN 指令将所有代码和数据段对齐到128位地址边界。
    8. 对于 EABI 可执行格式、请在链接器命令文件中将映射到 RAM 的所有未初始化部分定义为 NOINIT 段(使用"type=NOINIT"指令)。
    9. 请确保为闪存应用程序映像正确地对 ECC 位进行编程。 将 Code Composer Studio 闪存插件或 UniFlash GUI 中的 AutoEccGeneration 选项保持启用状态。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    正如您所说的、我尝试使用 memcpy ()将.text 从闪存移动到 RAM、而不是 binit 表。 在链接器命令文件中、我已经将此部分映射到闪存中加载并在 RAM 中运行。 但仍然面临这个问题。 CCS 在 codestart.asm 中的第82行获得断点,当我尝试恢复时,显示_system_post_cinit ()没有可用的源。 当我从闪存运行代码时、它工作正常。 只有当我尝试在运行时将整个.text 段从闪存移动到 RAM 时、我才会遇到这个问题。

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

    Rishitha,

    您可以展示您的链接器命令文件吗? 此外、如果您将 init 函数放在.TI.ramfunc 中、则不需要手动执行 memcpy、代码生成工具应自动处理。

    谢谢。
    伊袋

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

    此外、当错误发生时、请检查 CPU_SYS_REGS。 RESC 和 NMI_INTRUPT_REGS。 NMISHDFLG 寄存器来查看导致器件复位的原因。 您可能遇到了时钟设置问题。

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

     此处附加了 e2e.ti.com/.../LinkerFiles.zip 链接器命令文件

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

    感谢您发送编修。 这里需要说明一点:load=flash/run=RAM 仅用于初始化闪存的函数。 您的其余代码 只能从闪存运行。

    但是你需要从你的代码调用 Flash_init_module()。 如果有一个初始化闪存的自定义函数、则必须声明#pragma code_section (myFlashInitFunc、".TI.ramfunc")、以便链接器将它放置在正确的段中。 如果您从 driverlib 调用 Flash_initModule(),此 pragma 已在库源代码中声明。

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

    是的、我已经尝试了运行闪存中的其余代码。 工作正常。 由于闪存具有等待状态、我想尝试将整个代码移动到 RAM  

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

    啊、我明白了。  您只需使用上述的#pragma 确保所有性能关键型代码函数均放置在.TI.ramfunc 中、这样就可以确保它们得到处理。

    对于.TI.ramfunc 以外的任何内容、您可能需要 创建自己的复制表并使用 copy_in ()函数将它们从闪存复制到 RAM 中。 有关这方面的更多信息、请查看 www.ti.com/lit/spraa46 第4节(复制表)。  

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

    我已经创建了一个段、在 其中包括了目标文件的.text 段、并使用引导时复制表将该段从闪存移到了 RAM。 但是、当我尝试移动 codestart.asm 目标文件和少数其他文件(附在下面)时、它显示错误。 这样做的原因是什么、我如何确保它们在 RAM 中运行。

     

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

    尊敬的 Rishitha:

    您不应将 codestart.asm 移到 RAM 中。 这只是跳转到_c_int00的初始代码。 这是 引导 ROM 将分支到的入口点-因此如果它不在闪存中、那么您的代码将根本不会启动。

    通常为。 您不会将所有函数都移动到 RAM 中、只将运行控制循环 的函数移动到 RAM 中、而需要以零等待状态延迟执行这些函数。

    此致、
    伊袋