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:如何检索存储在闪存(中的变量的初始值可能位于.cinit)中

Guru**** 2553450 points
Other Parts Discussed in Thread: TMS320F28335, CODECOMPOSER, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1540835/tms320f28335-how-to-retrieve-initial-values-of-variables-stored-in-flash-maybe-in-cinit

器件型号:TMS320F28335
Thread 中讨论的其他器件: CODECOMPOSERC2000WARE

工具/软件:

芯片型号:TMS320F28335
编译器版本:CodeComposer Studio 110.0.00012

我们定义了全局变量、其初始值存储在闪存段中。 使用 hex2000 编译器工具链中的实用程序、我们解析 .out 文件并生成一个 .mot 文件。 我们确认变量的初始值存在于 .mot 文件中。例如,我在地址处定义了一个变量 0xE00,但它实际上存储在  0x0636f0

仍然存在两个关键挑战:

  1. 闪存到 RAM 映射 :我们需要了解内存映射关系,以便从 .mot 文件中提取初始值并直接将其写入 .out 文件。 (如果我们知道映射,我们可以通过脚本实现。)。使用 RAM 中的初始值定义的变量将保存在闪存中。 我想了解这种映射关系并提取这些初始值

  2. COFF 文件解析 :我们的 .out 文件遵循 COFF 规范。 是否有一个 readelf可以解析此类文件的工具(类似于)?

中文描述如下:

中国工程师们好、我有一个问题想向大家请教、定义在ram中有初始值的变量、会保存在flash中、我想了解一下这个映射关系、提取这些初值、直接写在ram区、比如我定义一个变量、位置在0xE00、但是实际初始值却保存在里0x0636f0。

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

    器件型号:TMS320F28335

    工具/软件:

    大家好、E2E 专家:

    你好。

    我们定义了全局变量、其初始值存储在闪存段中。 使用 hex2000 编译器工具链中的实用程序、我们解析 .out 文件并生成一个 .mot 文件。 我们确认变量的初始值存在于 .mot 文件中。例如,我在地址处定义了一个变量 0xE00,但它实际上存储在  0x0636f0

    仍然存在两个关键挑战:

    1. 闪存到 RAM 映射 :我们需要了解内存映射关系,以便从 .mot 文件中提取初始值并直接将其写入 .out 文件。 (如果我们知道映射,我们可以通过脚本实现。)

    2. COFF 文件解析 :我们的 .out 文件遵循 COFF 规范。 是否有一个 readelf可以解析此类文件的工具(类似于)?

    此致、

    公务员制度委员会

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

    您好:

    我将查看与.out 文件一同生成的.map 文件、查看所有段的映射位置。  0x0E00 和 0x0636F0 都不是闪存或 RAM 存储器地址。  0x0E00 位于外设帧 0(因此这是寄存器)中、0x0636F0 根本不是有效地址。

    没有闪存到 RAM 的映射、要么某个段被加载到闪存中、要么被加载到 RAM 中。  对于独立应用程序、任何代码或初始化变量都将加载到闪存、然后在 main () 中的器件设置过程中根据需要复制到 RAM。

    hex2000 实用程序可以将.out 转换为许多不同的格式(包括用于串行加载程序的格式,如.mot 文件)、更多信息可在本技术文档中找到  

    https://www.ti.com/lit/ug/spru513v/spru513v.pdf 

    此致、
    Matthew

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

    我需要纠正一些关于我的问题的基本错误。 这是我的监督

    0xE00 确实不是闪存或 RAM 地址。 实际地址为 0xE000。 在这里定义变量后、我开始在闪存中搜索其初始值、并在 0x31B87 处找到该变量。 我最初将其表示为 0x0636F0 的原因是、当我导出.mot 文件时、我将地址值乘以 2

    接下来、我将再次描述我的问题:

    我已经定义了这个测试变量、其前六个成员初始化为 0、7、29、55、97、 和 150 的组合


    它通过 LD 映射到“CAL_RAM"区域“区域:


    CAL_RAM 在.cmd 文件中计划、如下所示:


    接下来、我在.mot 文件中找到它的初始值。 十进制值和十六进制值之间的对应关系如下:

    0:00 00

    7:00 07

    29:00 1D

    55: 00 37

    97:00 61.

    150:00 96


    我使用相同的方法找到了其他变量的初始值。 所以我得出结论、变量的初始值存储在闪存中。 由于这些初始值将被加载到 RAM 中、因此在程序运行时会使用什么方法来确定它们的地址、以便它们可以被加载到 RAM 中

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

    您好 Matthew、

    你好。

    首先、我需要纠正一些关于我的问题的基本错误。 这是我的监督

    0xE00 确实不是闪存或 RAM 地址。 实际地址为 0xE000。 在这里定义变量后、我开始在闪存中搜索其初始值、并在 0x31B87 处找到该变量。 我最初将其表示为 0x0636F0 的原因是、当我导出.mot 文件时、我将地址值乘以 2

    接下来、我将再次描述我的问题:

    我已经定义了这个测试变量、其前六个成员初始化为 0、7、29、55、97、 和 150 的组合

    它通过 LD 映射到“CAL_RAM"区域“区域:

    CAL_RAM 在.cmd 文件中计划、如下所示:

    接下来、我在.mot 文件中找到它的初始值。 十进制值和十六进制值之间的对应关系如下:

    0:00 00

    7:00 07

    29:00 1D

    55: 00 37

    97:00 61.

    150:00 96

    我使用相同的方法找到了其他变量的初始值。 所以我得出结论、变量的初始值存储在闪存中。 由于这些初始值将被加载到 RAM 中、因此在程序运行时会使用什么方法来确定它们的地址、以便它们可以被加载到 RAM 中。

    此致、

    公务员制度委员会

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

    Yang、

    感谢您提供的其他详细信息、我对此问题保持一致。

    我们需要做的是在.cmd 文件中调用 load/run、让链接器将 Cal_RAM 段加载到闪存中、而是从 RAM 运行它。  这样、MOT 文件会自动将其分配给闪存、以便在您使用.mot 对器件进行编程时、它将自动存储在非易失性中。   

    然后、作为 main 中器件初始化的一部分、您将执行 memcopy 以将该段放置在您在链接器中定义为运行地址的区域中。

    以下是 C2000Ware 中的一个示例、该示例使用的是加载/运行代码段。  唯一的区别是您有 DATA_SECTION、但加载/运行的工作方式是相同的。

    C:\ti\c2000\C2000Ware_5_05_00_00\device_support\F2833x\examples\flash_F28335

    此致、

    Matthew

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

    您好、Matthew、

    感谢您的反馈。 收到您的最后一封电子邮件后、我已学习以下网站的演示文件:
    C:\ti\c2000\C2000Ware_5_05_00_00\device_support\f2833x\examples\flash_f28335

    作为初学者、我的进度很慢、很遗憾、我在演示中找不到需要的信息。 我现在有几个问题、非常感谢您的指导:

    1. 链接器命令文件 (.cmd) 问题
      我认为可以通过修改该 .cmd 文件来解决这个问题。 在 MEMORY 部分中、我在中定义了一个 RAM 区域 PAGE 0

      文本
      CALRAM:origin = 0x00E000、length = 0x002000

      然后,在中 PAGE 1,我定义了一个 Flash 区域:

      文本
      CALDataFlash:origin = 0x330000、length = 0x002000

       SECTIONS 器件中、我按如下方式进行了配置:

      文本
      CAL_RAM: load = CALDataFlash、      RUN = CALRAM、      LOAD_START (_CalRamLoadStart)、      LOAD_END (_CalRamLoadEnd)、      load_size (_calRamLoadSize)、      RUN_START (_CalRamRunStart)      RUN_END (_CalRamRunEnd)、      RUN_SIZE (_CalRamRunSize)、      PAGE = 0

       .map 文件显示变量详细信息:

      文本
      0  0000e000 _CalRamLoadStart  0  0000fd3c _CalRamLoadEnd ABS 00001d3c _CalRamLoadSize 0  0000e000 _CalRamRunStart 0  0000fd3c _CalRamRunEnd  ABS 00001d3c _CalRamRunSize    

      我的主要困惑: 在 0x330000 闪存中没有生成内容。 您能否建议如何正确配置该 .cmd 文件以确保数据写入闪存?

    2. SDK 演示可用性
      SDK 中是否有任何演示此功能的相关演示?

    3. 在 CCS11 中进行 COFF .out 文件解析
      CCS11 是否包括解析 COFF 格式 .out 文件的工具? 我需要提取调试信息、变量分配详细信息等

    4.  PAGE0  PAGE1  .cmd 文件中的和的概念是什么?此说明在哪个文档中?

    我期待着你的答复。 祝您愉快!

    此致、
    Li Yang

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

    Li、

    请查看此应用手册: https://www.ti.com/lit/an/spraau8a/spraau8a.pdf 我认为它可以解决您的许多问题。  在查看后、如果您仍然有问题、请告诉我。

    [引述 userid=“662670" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1540835/tms320f28335-how-to-retrieve-initial-values-of-variables-stored-in-flash-maybe-in-cinit/5941660
    1. 在 CCS11 中进行 COFF .out 文件解析
      CCS11 是否包括解析 COFF 格式 .out 文件的工具? 我需要提取调试信息、变量分配详细信息等

    2.  PAGE0  PAGE1  .cmd 文件中的和的概念是什么?此说明在哪个文档中?

    我期待着你的答复。 祝您愉快!

    [/报价]

    对于 C2000、PAGE0 =程序存储器、Page1 =数据存储器。  您在链接器中看到的拆分应该与之对齐、但是、我要补充的是、大多数 C2000 器件和存储器区域现在是统一的、即 PAGE0 和 Page1 都保存相同的映射数据;因此、这里使用 PAGE0 和 Page1 的要求并不像早期或其他 TI MCU/DSP 那样严格;其中不同页面上的相同地址将具有不同的内容。

    同样、在此时、如果该区域要容纳程序(代码)或数据、它更只是一种在链接器中表示的方法。

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

    我将仔细查看本文档。 目前、我的首要任务是解决第一个问题:

    1. 链接器命令文件 (.cmd) 问题
      我认为可以通过修改该 .cmd 文件来解决这个问题。 在 MEMORY 部分中、我在中定义了一个 RAM 区域 PAGE 0

      文本
      CALRAM:origin = 0x00E000、length = 0x002000

      然后,在中 PAGE 1,我定义了一个 Flash 区域:

      文本
      CALDataFlash:origin = 0x330000、length = 0x002000

       SECTIONS 器件中、我按如下方式进行了配置:

      文本
      CAL_RAM: load = CALDataFlash、      RUN = CALRAM、      LOAD_START (_CalRamLoadStart)、      LOAD_END (_CalRamLoadEnd)、      load_size (_calRamLoadSize)、      RUN_START (_CalRamRunStart)      RUN_END (_CalRamRunEnd)、      RUN_SIZE (_CalRamRunSize)、      PAGE = 0

       .map 文件显示变量详细信息:

      文本
      0  0000e000 _CalRamLoadStart  0  0000fd3c _CalRamLoadEnd ABS 00001d3c _CalRamLoadSize 0  0000e000 _CalRamRunStart 0  0000fd3c _CalRamRunEnd  ABS 00001d3c _CalRamRunSize    

      我的主要困惑: 在 0x330000 闪存中没有生成内容。 您能否建议如何正确配置该 .cmd 文件以确保数据写入闪存?