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/TMS320F28335:如何在 DSP28335中将.text 段从闪存加载到外部 RAM

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/804789/rtos-tms320f28335-how-to-load-text-section-from-flash-to-external-ram-in-dsp28335

器件型号:TMS320F28335

工具/软件:TI-RTOS

  我使用 DSP28335来开发基于程序的 DSP/BIOS、在通常编译程序并在 CCS3.3中编译程序后、我的程序的.out 文件为920Kb、我将.out 文件刻录到 DSP28335中、
程序通常可以启动并运行。
  为了缩短程序的运行时间、我想在 XINTF 区域6中将程序的.text 和.econst 段从闪存加载到外部 RAM、因为 DSP28335的片上存储器很小、所以我
按照以下示例执行加载工作:
  首先、在_c_int00之前、我初始化.text 和.econst 段、引用 DSP28xxx_SectionCopy_nonBIOS.asm、
  其次、我在 XINTF 区域6中初始化 SARAM、引用 InitExtMemIf。asm ( ())、
  然后、我将程序的.text 和.econst 段从闪存加载到 F28335_BIOS_flash.cmd 中 XINTF 区域6中的 SARAM 中

/*NAME PAGE 0:
ExtRAM 原点:00100000长度:00080000
L67RAM 原点:0000e000 length:00002000*/

.text:load = flash_ABCDEFGH、page = 0 //应为 Flash *
     run = ExtRAM、page = 0 /*必须为 CSM 安全 RAM */
     load_start (_text_loadstart)、
      load_size (_text_loadsize)、
      run_start (_text_runstart)

econst:load = flash_ABCDEFGH、page = 0 //应为 Flash *
      run = ExtRAM、page = 0 /*必须为 CSM 安全 RAM */
      load_start (_econst_loadstart)、
      load_size (_econst_loadsize)、
      run_start (_econst_runstart)

  正常编译程序并在 CCS3.3中编译程序后、我会将.out 文件刻录到 DSP28335中、但程序无法启动和运行。
  我将 DSP28335的片上存储器的.text 段的运行地址从 ExtRAM 更改为 L67SARAM 段、通常编译程序并在 CCS3.3中构建程序后、我会刻录.out 文件
在 DSP28335中、程序通常可以启动并运行。


.text:load = flash_ABCDEFGH、page = 0 //应为 Flash *
      运行= L67SARAM、PAGE = 0 /*必须是 CSM 安全 RAM */
      load_start (_text_loadstart)、
      load_size (_text_loadsize)、
      run_start (_text_runstart)
econst:load = flash_ABCDEFGH、page = 0 //应为 Flash *
      run = ExtRAM、page = 0 /*必须为 CSM 安全 RAM */
      load_start (_econst_loadstart)、
      load_size (_econst_loadsize)、
      run_start (_econst_runstart)

   如何解决将程序的.text 段从闪存加载到外部 RAM 的问题。

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

    您好、Quanthing Liu、

    您是否在程序中执行了 memcpy 以将代码从闪存复制到外部 RAM? 与示例中的操作类似:

    memcpy (&text_runstart、&text_loadstart、
    (uint32)&text_loadsize); 

    最棒的

    Kevin

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

    在 DSP28xxx_SectionCopy_nonBIOS.asm。中完成.text 段的复制

    MOVL XAR5、#_TEXT_SIZE;将段大小存储在 XAR5中

    SubB XAR5、#1
    MOVL ACC、@XAR5;将 Section Size 移动到 ACC
    MOVL XAR6、#_TEXT_LOADSTART;将加载起始地址存储在 XAR6中
    MOVL XAR7、#_TEXT_runstart;在 XAR7中存储运行地址
    LCR 副本

    这样、程序的.econst 段可以成功地从闪存加载到 外部 RAM!

    这样、程序的.text 段可以成功地从闪存加载到 片上 RAM!

    但是 、程序的,.text 段无法成功地从闪存加载到 外部 RAM。 我如何解决这个问题。

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

    您是否在将数据从闪存复制到外部 RAM 之前启用和配置 XINTF 模块? 在 XINTF 被配置前、器件将不知道如何与外部 RAM 对接。

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

    感谢您的回复。 根据您的提示,我 在将数据从闪存复制到外部 RAM 之前启用和配置 XINTF 模块、调用 proess 为:

    CodeStartBranch.asm
    InitExtMemIf.asm
    功能:启用和配置 XINTF 模块
    来源:David M. Alter Provide (e2e.ti.com/.../1494798
    3.DSP28xxx_SectionCopy.asm
    功能:将数据从闪存复制到外部 RAM
    源:SPRA958H (从 TMS320F28xxx DSP 上的内部闪存运行一个应用)

    为了判断程序运行状态,我在 main()函数中添加了 LED 指示灯显示,并将计时器设置为1Hz

    案例1:在正常编译程序并在 CCS3.3中编译程序后、我会将.out 文件刻录到 DSP28335中、但程序无法启动和运行。 即使我将.text 段加载从闪存更改为片上 RAM,程序也无法启动和运行。 请参阅计划:

    e2e.ti.com/.../Example_2800_-.text-load_2900_.rar

    情况2:所以、我尝试从这个过程中删除.text 段、只有从闪存到外部 RAM 的加载.econst,程序通常可以启动和运行。  请参阅该计划

    e2e.ti.com/.../Example_2800_No-.text-load_2900_.rar

    但是、如果我更改调用顺序、

    CodeStartBranch.asm
    2.DSP28xxx_SectionCopy.asm
    功能:将数据从闪存复制到外部 RAM
    源:SPRA958H (从 TMS320F28xxx DSP 上的内部闪存运行一个应用)

    InitExtMemIf.asm
    功能:启用和配置 XINTF 模块
    来源:David M. Alter Provide (e2e.ti.com/.../1494798

    情况3:和 文本段从闪存加载到 DSP28335的片上 RAM、以及从闪存加载到外部 RAM、程序通常可以启动和运行。  请参阅以下程序

    e2e.ti.com/.../Example_2800_-.text-load-from-innerRAM_2900_.rar

    情况4:但是、如果我将文本段加载从闪存更改为外部 RAM、并将 load.econst 从闪存更改为外部 RAM、程序也无法启动和运行。  请参阅以下程序

    e2e.ti.com/.../Example_2800_-.text-load-from-ExtRAM_2900_.rar

    如何解决此问题? 我需要 在 DSP28335中将程序的.text 段从闪存加载到外部 RAM。 谢谢  

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

    请帮助我们更好地了解情况。 您能否确认数据已正确复制到外部 RAM? 对于此观察、我们可以忽略程序是否会运行的方面。

    我们需要确保 XINTF 正常工作、并且所有数据都是它应该位于的位置。 如果在引导后通过 JTAG 连接、变量和常量是否已初始化为预期值? 在外部 RAM 中、函数运算代码是否看起来合理? 只需对少数几个运算代码进行采样即可确保其不是随机数据。

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

    Tommy:
      感谢您的提示、我可以确认 XINFT 是否正常工作、 以及从闪存到 ExtRAM 的.econst 复制是否正确。请查看该过程是否正确
      首先、为了确保 XINFT 是否正常工作、 在我的示例程序中、只有.econst 段从闪存复制到 ExtRAM、我在 DSP/BIOS 配置中执行以下一些设置、
      一般:malloc()/free 段:ExtRAM
      2.C 变量段(.bss):ExtRAM
      3.C 变量段(.ebss):ExtRAM
      我在 main()函数的开头添加了 malloc 函数、 malloc 使用 ExtRAM、写入和读取的数据是正确的。
      其次, 我发现.econst 段是字符串数据,我在 main()函数的开头添加了字符串 const,字符串 const 数据 是正确的
      请参阅以下附件。

    e2e.ti.com/.../Example_2800_No-.text_2900_.rar

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

    刘振星

    这听起来很合理。 我想我们可以假设 XINTF 正在工作、现在它更多地是 BIOS 启动问题。 我们将需要为 BIOS 聘请一些其他专家。

    是否正在执行 Userinit()?

    Tommy

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

    是的,我已经执行了 Userinit(),您可以在 main()的示例中看到 Userinit 函数(没有.text),我确定已执行 Userinit()函数。
    空用户初始化(空)

    如果已定义、则#ifdef example_flash // example_flash 位于 CCS 工程选项中

    //段.trcdata 由 DSP/BIOS 生成。
    //必须将其从加载复制到 main()之前的运行地址。
    memcpy (&trcdata_runstart、&trcdata_loadstart、&trcdata_loadend -&trcdata_loadstart);

    #endif

    }//用户初始化结束()

    我使用 CCS3.3+DSP/BIOS 5.41+CodeGeneration6.2.0

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

    Quanting、您好、

    暂时忽略您从外部 RAM 运行的问题、我想问您希望通过将代码复制到外部 RAM 来实现什么。  您曾说过:

    "为了缩短程序的运行时间、我想在 XINTF 区域6中将程序的.text 和.econst 段从闪存加载到外部 RAM "

    从外部 RAM 运行代码的速度将比内部闪存慢。  您知道这一点吗?

    此致、

    David

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

    大家好、David:

    感谢您的提示、我有四个问题:

    1.请帮助我确定内部闪存的配置是否最佳

    空 InitFlash (空)

    asm (" EALLOW");//启用 EALLOW 受保护寄存器访问
    FlashRegs.FPWR.bit.PWR = 3;//泵和组被设定为激活模式
    FlashRegs.FSTATUS.bit.V3STAT = 1;//清除3VSTAT 位
    FlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF;//睡眠到待机转换周期
    FlashRegs.FACTIVEWAIT.BIVEWAIT = 0x01FF;//待机到活动转换周期
    FlashRegs.FBANKWAIT.bit.RANDWAIT = 5;//随机存取等待状态
    FlashRegs.FBANKWAIT.bit.PAGEWAIT = 5;//分页访问等待状态
    FlashRegs.FOTPWAIT.bit.OTPWAIT = 8;// OTP 等待状态
    FlashRegs.FOPT.BIT.ENPIPE = 1;//启用闪存流水线
    asm (" EDIS");//禁用 EALLOW 受保护寄存器访问

    //强制执行完整的流水线清除以确保写入最后一个寄存器
    //配置发生在返回前。 最安全的是等待8个完整周期。

    asm (" RPT #6 || NOP");

    }// InitFlash()结束

    我使用6.67ns 32位外部 SRAM、如何将外部 SRAM 的速度配置为150MIPS?
    3.因为我的硬件已经使用 DSP28335,我的程序主要执行矩阵计算。 由于我的程序很大、但内部 SRAM 很小、因此我必须使用外部
    SRAM (例如.bss 和.ebss 段)、我想缩短程序的运行时间、以及如何缩短矩阵计算的时间。
    4.我亦想知道问题的原因:
    调用 proess 为:
    1) CodeStartBranch.asm
    2) InitExtMemIf.asm
    3) DSP28xxx_SectionCopy.asm
    案例1:在正常编译程序并在 CCS3.3中编译程序后、我会将.out 文件刻录到 DSP28335中、但程序无法启动和运行。 即使我改变了
    将.text 段从闪存加载到片上 RAM,程序也无法启动和运行。 请参阅该计划。

    e2e.ti.com/.../7484.Example_2800_-.text-load_2900_.rar

    此致、

    scqxlxc.

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

    Quanting、

    >> 1.请帮助我确定内部闪存的配置是否最佳

    您显示的配置对于150MHz 是正确的。

    ----------

    >> 2.我使用6.67ns 32位外部 SRAM、如何将外部 SRAM 的速度配置为150MIPS?

    6.67ns SRAM 的速度非常快、但实际上、与10ns SRAM 相比、使用 F28335 DSP 时的性能不会更好。  您可以运行数据表 SPRS439n 第5.9.6节中的数字。  例如、读取时序:

    X2TIMING=0 => tc (XTIM)=6.67ns。

    如果 XRDLEAD=1、XRDACTIVE=2、XRDTRAIL=0 =>

     LR = 6.67ns、AR = 20ns、TR = 0ns。

     TA (A)= LR + AR - 16 = 10.67ns。  这将适用于10或6.67ns SRAM。

    如果您使 XRDACTIVE=1、与上述情况类似、最终 TA (A)= 4ns。  这不适用于6.67ns SRAM。

    因此、您需要 XRDLEAD=1、XRDACTIVE=2、XRDTRAIL=0。

    --------

    >> 3. 因为我的硬件已经使用 DSP28335,我的程序主要执行矩阵计算。 由于我的程序很大、但内部 SRAM 很小、因此我必须使用外部 SRAM (例如.bss 和.ebss 段)、我想缩短程序的运行时间、以及如何缩短矩阵计算时间。

    您是否说矩阵计算的关键算法太大、无法放入内部存储器?  我并不是说您的整个程序。  我是说矩阵计算例程。  我认为这些应该适合内部存储器、并且可以使用 AppNote SPRA958中所示的技术将其放置在那里。

    --------

    >> 4. 我还想知道问题的原因:
    调用 proess 为:
    1) CodeStartBranch.asm
    2) InitExtMemIf.asm
    3) DSP28xxx_SectionCopy.asm
    案例1:在正常编译程序并在 CCS3.3中编译程序后、我会将.out 文件刻录到 DSP28335中、但程序无法启动和运行。 即使我改变了
    将.text 段从闪存加载到片上 RAM,程序也无法启动和运行。 请参阅该计划。

    我看到的一点是,您说您使用的是32位 SRAM,但您的 InitExtMemI()函数正在配置16位宽的 SRAM。  您已将 XSIZE 设置为3 (16位)、并且未为数据引脚16-31配置共享 GPIO。

    您将需要在硬件上进行调试。  运行 DSP28xxx_SectionCopy ()后,是否使用 CCS 在外部存储器中看到代码?  我建议首先使 XINTF 正常工作。  请勿从此处运行任何代码。  初始化它、然后尝试复制和读回一些数据。  首先让它像这样工作。

    此致、

    David

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

    戴维:

    很抱歉、我在帖子中犯了一个错误。 我使用的是16位 SRAM、而不是32位 SRAM

     关于第四 个问题、我还介绍了所有流程。
         感谢您的提示、我可以确认 XINFT 是否正常工作、 以及.econst 从闪存复制到 ExtRAM 是否正确。 请查看该流程是否正确
         首先、为了确保 XINFT 是否正常工作、 在我的示例程序中、只有.econst 段从闪存复制到 ExtRAM、我在 DSP/BIOS 配置中执行以下一些设置、  
         一般:malloc()/free 段:ExtRAM
         2.C 变量段(.bss):ExtRAM
         3.C 变量段(.ebss):ExtRAM
         我在 main()函数的开头添加了 malloc 函数、 malloc 使用 ExtRAM、写入和读取的数据是正确的。
         其次, 我发现.econst 段是字符串数据,我在 main()函数的开头添加了字符串 const,字符串 const 数据 是正确的

     e2e.ti.com/.../Example_5F00_CheckExtRAM.rar

        主要问题如下:

    根据正常顺序、调用过程为:μ s
    1) CodeStartBranch.asm
    2) InitExtMemIf.asm
    3) DSP28xxx_SectionCopy.asm

    将.text 段从闪存加载到片上 RAM

    将 econst 段从闪存加载到 ExtRAM
         正常编译程序并在 CCS3.3中编译程序后、我会将.out 文件刻录到 DSP28335中、但程序无法启动和运行。

     e2e.ti.com/.../1.InitExtMemIf--2.DSP28xxx_5F00_SectionCopy.rar

    我尝试一下、如果调用 proess 为:
    1) CodeStartBranch.asm
    2) DSP28xxx_SectionCopy.asm

    将.text 段从闪存加载到片上 RAM

    将.econst 段从闪存加载到 ExtRAM
    3) InitExtMemIf.asm

    正常编译程序并在 CCS3.3中编译程序后、我会将.out 文件刻录到 DSP28335中、但程序通常可以启动并运行。

    e2e.ti.com/.../1.DSP28xxx_5F00_SectionCopy-2.InitExtMemIf.rar

       为什么会发生这种情况? 我需要您的帮助来解释原因。谢谢

    此致

    scqxlxc.

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

    Quanting、

    正确的步骤如您所说:

    1) CodeStartBranch.asm
    2) InitExtMemIf.asm
    3) DSP28xxx_SectionCopy.asm

    在本例中,您将 InitExtMemI()作为.text 段的一部分,并且您将.text 放在外部 RAM 中。  在上面的序列中,在将数据复制到外部 RAM 之前,您正在尝试运行 InitExtMemI()。  您无法执行此操作。  我会在另一个段中找到 InitExtMemIf (),例如.text2 (或您要调用该段的任何内容)。  只需在闪存中单独保留此段。  然后、上述序列应该起作用。

    但我认为您的代码中还有其他问题、因为它无法正常运行。  我不知道是什么。  您必须使用步进和硬件断点的组合对其进行调试。

    我仍然想知道你在这里要实现什么。  从外部 RAM 运行代码的速度不会比内部闪存快。

    此致、

    David

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

    戴维:

    正如您所说的、我只使用 AppNote SPRA958中显示的技术将主矩阵计算函数从闪存加载到内部存储器中、
    但计算时间不能缩短。 您能给我其他文件来缩短计算时间吗

    此致

    scqxlxc.

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

    [引用用户="Quanting Liu "]

    正如您所说的、我只使用 AppNote SPRA958中显示的技术将主矩阵计算函数从闪存加载到内部存储器中、

    但计算时间不能缩短。 您能给我其他文件来缩短计算时间吗

    [/报价]

    检查以确保矩阵函数与矩阵数据本身不在同一 RAM 块中。  我怀疑是这样的、但要检查一下。  如果它们位于同一个 RAM 块中、则将其中一个移动到另一个 RAM 块。

    之后、您只需尝试使用手动汇编代码手动优化矩阵函数。

    此致、

    David

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

    戴维:

    感谢您的回复。 我会缩短计算时间、就像您说的那样。

        此致

    scqxlxc.