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.

[FAQ] [参考译文] [常见问题解答]闪存-如何将应用程序从 RAM 配置修改为闪存配置?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/878674/faq-flash---how-to-modify-an-application-from-ram-configuration-to-flash-configuration

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

您能否简单地列出将应用程序从基于 RAM 的配置修改为基于闪存的配置所涉及的过程?

C2000培训视频:https://training.ti.com/search-catalog/field_language/ZH-CN?keywords=C2000&start%5Bdate%5D=&end%5Bdate%5D=

C2000培训小程序码

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

    以下内容适用于 TMS320F2838x、TMS320F2837x、TMS320F2807x、TMS320F28004x、TMS320F28002x、 TMS320F28M35x、TMS320F28M36x。   

    为了将基于 RAM 的应用转换为 基于闪存的应用、需要执行以下步骤:

    1. 将 RAM 链接器 cmd 文件替换为闪存链接器 cmd 文件(这些文件在 C2000ware 中提供)。

    2.如果需要修改闪存链接器 cmd 文件、请确保只将任何已初始化的段映射到闪存(正如您在 C2000Ware 中提供的链接器 cmd 文件中所注意到的那样)。

    3.当器 件配置为引导至闪存时、bootROM 将在引导代码执行结束时重新定向至闪存入口点位置(在 TI 提供的闪存链接器 cmd 文件中定义为 begin)。  确保在代码执行开始的闪存入口点有一个分支指令。  C2000Ware 示例使用 CodeStartBranch.asm 文件来实现这一点。  此文件中的代码分配给 codestart 段。  在闪存链接器 cmd 文件中、您将注意到 codestart 段被映射到闪存入口点(因此 CodeStartBranch.asm 是在 bootROM 执行后执行的第一个代码)。  此代码分支到_c_int00例程、该例程初始化所有全局变量、然后重新定向到应用程序主程序。  

    4.为了实现闪存执行的最佳性能,请根据工作频率配置闪存等待状态(请查看数据表)并启用预取/缓存。  请注意,配置闪存控制寄存器(例如:C2000Ware 中的 flash_initModule() )的任何代码都必须从 RAM 运行。  因此、配置闪存等待状态和预取/缓存的函数应在执行之前复制到 RAM  中。  这可以通过将 此函数分配给.TI.ramfunc 段、然后在运行时使用 memcpy ()将其复制到 RAM、然后再执行 它来实现。  在链接器 cmd 文件中、这个部分应该被映射到闪存以进行加载、而 RAM 则用于执行。  请查看 C2000Ware 中提供的基于闪存的链接器 cmd 文件。   

    5. 确保为闪存引导配置了引导模式引脚。  这就告诉引导 ROM、它必须在引导代码执行后重新定向到编程到闪存的应用程序。   

    请注意、所有 C2000Ware 示例工程都提供了 RAM 和闪存构建配置。 若要将编译配置从 RAM 更改为闪存、用户可以将工程导入 CCS、然后右键点击工程并选择"Build Configurations"->"Set Active"->"Flash"。

    通过选择此闪存配置、用户可以注意到:

    在 Project Build Settings 下的"预定义符号"部分中定义了_FLASH 符号。 这用于定义和执行任何闪存构建特定代码。

    2.为应用程序选择基于闪存的链接器命令文件,而不是基于 RAM 的链接器命令文件。 C2000Ware 中提供了基于闪存的链接器命令文件以供参考(例如、C2000Ware_x_xx_xx_xx_xx\device_support\XXX\common\cmd 中的 xxx_flash_lnk_cpu1.cmd)。 基于闪存的链接器命令文件将具有映射到闪存入口点地址的 codestart。

    3.所有已初始化的段都映射到基于闪存的链接器命令文件中的闪存存储器。

    4.所有需要从 RAM 执行的函数(用于初始化或0等待性能目的)都被分配给代码中的.TI.ramfunc 段。

    示例:flash_initModule()被分配给.TI.ramfunc 段。 这个闪存初始化例程(配置闪存等待状态、预取/高速缓存模式、电源等)必须从 RAM 中执行。  如果未执行闪存初始化例程、请注意、闪存性能将较差。  原因: 闪存访问速度不如 RAM 访问速度快。  当 CPU 从 RAM 中取/读取数据时、不需要额外的等待周期。  但是、闪存不是0等待存储器。  从闪存取/读取需要一定的时间。  CPU 比闪存快得多、因此 CPU 在发出需要数据的闪存地址后必须等待几个周期(等待状态)才能从闪存获取所需数据。  随着 CPU 频率与闪存频率相比增加、CPU 等待从闪存获取有效数据所需的等待状态数将增加。  闪存初始化例程配置这些等待状态(以及其他闪存参数)。  由于这个函数配置关键的闪存参数、它不应该从闪存本身执行。

    5..TI.ramfunc 段映射到基于闪存的链接器命令文件中用于“加载”的闪存地址和用于“运行”的 RAM 地址。

    6.映射到闪存的所有段都使用基于闪存的链接器命令文件中的 align()指令在128位边界上对齐。

    7.在应用程序中调用 memcpy()函数,以将.TI.ramfunc 内容从闪存复制到 RAM。 在执行分配给.TI.ramfunc 段的任何代码之前调用 memcpy()。

    8.对于 EABI 类型可执行文件:映射到 RAM 的所有未初始化段在链接器 cmd 文件中定义为 NOINIT 段(使用指令“type=NOINIT”)。

    9. 注意:在 CCS 环境中进行调试期间、如果您需要在 RAM 空间中放置一个断点、则需要在将代码从闪存复制到 RAM 后执行该操作。  如果在复制之前执行该操作、则断点插入将被通过 memcpy 复制的代码覆盖。

    其他相关调试提示:

    此外、在独立模式下运行应用程序时不使用调试器、请确保为闪存引导配置引导模式引脚(有关详细信息、请参阅 TRM 的 BootROM 一章)。

    2.请确保在应用程序中根据需要初始化所有变量。  使用未初始化的变量有时会导致为它们使用垃圾值、从而导致应用程序行为的差异(以及基于 RAM 和闪存的项目之间的差异、具体取决于插入的垃圾值)。

    3.如果在独立模式下从闪存运行仍有问题(如果在连接调试器时运行正常):  

      (a)请确保为闪存映像正确编程 ECC (确保 CCS 闪存插件 GUI 或 UniFlash GUI 中的 AutoEccGeneration 保持启用状态-这是默认选项)。

      (b)在 F28x_codestartbranch.asm 中禁用看门狗(WD_DISABLE .set 0;在   该 asm 文件中应替换为 WD_DISABLE .set 1)。  这有助于在到达 main()之前避免看门狗复位。  如果应用程序中有很多全局变量、在到达 main 之前、cinit 例程可能需要更多的时间来初始化所有全局变量。  在此期间、看门狗可能会过期、因此建议将其禁用。  您可以根据应用程序的需要在 main()中再次启用它。

      (c)请确保 F28x_codestartbranch.asm 文件包含在您的应用中、并且 codestart 被映射到链接器 cmd 文件中的闪存入口点位置(通常在 TI 提供的链接器 CMD 文件中定义为 begin)。

      (D)请确保在项目的链接器选项中添加了 code_start (--entry_point=code_start)作为入口点。    

        Project build settings -> Build -> C2000 Linker -> Advanced options -> Symbol Management ->-entry_point: code_start

    此致、

    Vamsi