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.

如何将.text段从Flash加载到DSP28335片外扩展RAM中运行

Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE

我开发基于DSP28335+DSP/BIOS的程序,程序成功编译和链接后,将.out文件烧写到28335后,程序能正常运行。为了缩短程序运行时间,考虑到DSP28335的片内内存较小,我想把程序的.text段和.econst段从Flash加载到片外扩展RAM中运行,我参考了DSP28xxx_SectionCopy_nonBIOS.asm(SPRAAU8)和InitExtMemIf.asm( (David M. Alter)做了以下工作:
开始,在F28335_BIOS_flash.cmd定义了.text段和.econst段,
/*name PAGE 0:
ExtRAM origin:00100000 length:00080000
L67RAM origin:0000e000 length:00002000*/

.text : LOAD = FLASH_ABCDEFGH, PAGE = 0 /* Should be Flash */
RUN = ExtRAM, PAGE = 0 /* Must be CSM secured RAM */
LOAD_START(_text_loadstart),
LOAD_SIZE(_text_loadsize),
RUN_START(_text_runstart)

.econst : LOAD = FLASH_ABCDEFGH, PAGE = 0 /* Should be Flash */
RUN = ExtRAM, PAGE = 0 /* Must be CSM secured RAM */
LOAD_START(_econst_loadstart),
LOAD_SIZE(_econst_loadsize),
RUN_START(_econst_runstart)

然后,参考InitExtMemIf.asm(David M. Alter),初始化了片外扩展RAM
接着,在_c_int00之前,参考DSP28xxx_SectionCopy_nonBIOS.asm,将.text和.econst从Flash加载到片外扩展RAM中
MOVL XAR5,#_text_size ; Store Section Size in XAR5
SUBB XAR5,#1
MOVL ACC,@XAR5 ; Move Section Size to ACC
MOVL XAR6,#_text_loadstart ; Store Load Starting Address in XAR6
MOVL XAR7,#_text_runstart ; Store Run Address in XAR7
LCR copy

MOVL XAR5,#_econst_size ; Store Section Size in XAR5
SUBB XAR5,#1
MOVL ACC,@XAR5 ; Move Section Size to ACC
MOVL XAR6,#_econst_loadstart ; Store Load Starting Address in XAR6
MOVL XAR7,#_econst_runstart ; Store Run Address in XAR7
LCR copy

程序在CCS3.3中能够正常编译和链接,
In .map file, .text section is defined:

section page origin length input sections
-------- ---- ---------- ---------- ----------------
.text 0 00300f0b 00000d66 RUN ADDR = 00100000
烧写到DSP28335中,程序不能正常加载运行

我把.text改成从DSP片内的L67SARAM加载后,.econst仍从片外扩展RAM中加载,程序编译链接后能够正常加载运行。
.text : LOAD = FLASH_ABCDEFGH, PAGE = 0 /* Should be Flash */
RUN = L67SARAM, PAGE = 0 /* Must be CSM secured RAM */
LOAD_START(_text_loadstart),
LOAD_SIZE(_text_loadsize),
RUN_START(_text_runstart)
.econst : LOAD = FLASH_ABCDEFGH, PAGE = 0 /* Should be Flash */
RUN = ExtRAM, PAGE = 0 /* Must be CSM secured RAM */
LOAD_START(_econst_loadstart),
LOAD_SIZE(_econst_loadsize),
RUN_START(_econst_runstart)

但我的程序只编写了部分,如果完成整个程序,DSP28335片内RAM不能满足所有程序.text的加载,怎样解决将.text段从Flash加载到DSP28335片外扩展RAM中运行?

  • 您是想将程序搬到RAM内?

    您需要初始化flash,然后不要把.text这么定义复制到RAM中。只把需要的函数复制到RAM就可以了,类似iniflash的用法。还有其他段也不要乱改,如.cinit。

    另外您可以参考下之前的帖子

    e2echina.ti.com/.../76541
  • 你给答案回答了将.text段从Flash加载到DSP28335片内RAM中运行,谢谢。但我又碰到了将.text段从Flash加载到DSP28335片外扩展RAM中,程序无法加载运行的情况,麻烦看一下帖子,帮忙解决一下。
  • 您是否在程序中执行memcpy将代码从flash复制到外部RAM?如下

    memcpy(&text_runstart, &text_loadstart, (Uint32)&text_loadsize);
  • 我看您在 e2e.ti.com/.../804789 也发了帖子
  • 是的,因为回的帖子没有解决问题,并且没有进一步更新,我就试着用中文发了一下。
  • QuanXing Liu 说:

    然后,参考InitExtMemIf.asm(David M. Alter),初始化了片外扩展RAM

    实际上在哪里初始化的外扩 RAM 呢?

    如果也是在 .asm 或者 .c 中初始化,那么这段代码就会在 .text 中。

    这时候你希望把 .text 运行在外扩 RAM 里,就是一个悖论,因为你要在外扩 RAM 里执行初始化 外扩 RAM 的程序。

    我们一般的做法都是把初始化外扩 RAM 的代码提出来,先在内部 RAM 里运行。

  • 谢谢你的解答。我本意是想提高程序的运行速度,我的程序主要是矩阵计算,由于程序比较大,无法完全加载到内部RAM中,才想到把程序特别是.text段从Flash加载到外部RAM中来运行速度。但正如你所说,外扩 RAM 里执行初始化 外扩 RAM 的程序是悖论。理论上将程序全部从Flash加载到内部RAM中能提高运行速度,但F28335的内部内存只有34K,能够给我一些好的建议,怎么有效提高整个程序的速度。

  • 程序太大,内部 RAM 放不下,那就必须放在外部 RAM 中,所以必须要外部 RAM。

    程序需要保存,要放在 FLASH 里,28335 自带 FLASH 如果放不下,就需要外部 FLASH。

    从你的描述里,你的程序应该能放进自带 FLASH ,只是运行时想把全部程序放入内部 RAM ,但是内部 RAM 不够。

    简单的方法就是,只把关键函数(运行速度相关的,比如延时函数)放在内部 RAM 运行,其他部分依然在内部 FLASH 上运行,参考ramfuncs 的用法。

    复杂的方法,要动工程结构。建立 2 个工程,一个 BOOT,一个 APP。

    BOOT 工程烧写到 FLASH,上电运行,负责初始化外部 RAM,外部 FLASH 以及搬运 APP 工程的代码到外部 RAM,最后用函数指针的方法跳转到 APP 工程在外部 RAM 的首地址。

    APP 工程里放的就是你的矩阵运算了,编写的时候注意 CMD 文件的配置,烧写的时候注意不要覆盖 BOOT 工程。


    看你项目的时间,时间够就用复杂方法,因为长期看复杂方法是必然的,C6000系列都是这样的,甚至比这还复杂。
  • XU FAN:

          谢谢你的回复,还是有2个问题想请教。

         1.我试过简单办法,但关键函数还是太大,内部 RAM太小放不下,所以想找你学习一下复杂方法,能否提供一个例子供我好好研究一下。

         2.还有一个问题,我查了一下资料,F28335的外部RAM速度比较慢,请看下图,比片内Flash还慢,不知道有什么办法提高F28335外部RAM的读写速度,也不知道C6000外部RAM速度怎么样?

  • 片内的肯定比片外的快,你如果对速度要求高,可以考虑换芯片了,28335 速度确实上限不高。

    C6000 本身 CPU 速度就很快,而且是可以外接 DDR 的,所以总体速度很快,一般几百 M 是没问题的。

    复杂方法,无法提供例子。网上多搜搜,应该能找到碎片,拼凑出来。

    BOOT 工程就和你现在的程序一样,只是代码只有以下功能:系统初始化,初始化外部 RAM,搬运内部 FLASH 里 APP 工程的代码到外部 RAM,跳转到 APP 工程在外部 RAM 的首地址。

    APP 工程主要注意 CMD 的编写,和生成 BIN 文件,最后把 BIN 文件烧到内部 FLASH 里。

    比如,BOOT 工程的 CMD 里,你代码放在 FLASHA,那么 APP 工程的 CMD 里,代码就只能放在 FLASHA 以外,比如 FLASHBCDE,同时记得修改 CMD 里的 BEGIN 等其他字段。

    生成 BIN 文件,也有很多细节。APP 工程 记得只生成代码所在位置的 BIN 文件,比如定位在 FLASHBCDE,那么就只生成 FLASHBCDE 区域文件。还有大小端等。搜 tiobj2bin。

    把 BIN 文件传进 DSP,可以自己写个 串口传输或者其他传输,或者笨办法,仿真用 load memory。

    烧写 BIN 文件烧到内部 FLASH 里,28335 有官方API,安装官方 controlSUITE 或者 C2000Ware,搜 flash_api。
  • XU FAN:

          谢谢你专业的回复。