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.
工具/软件: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 ( (David M. Alter))、
然后、我将程序的.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 模块、调用 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。 谢谢
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 数据 是正确的
请参阅以下附件。
刘振星
这听起来很合理。 我想我们可以假设 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
}//用户初始化结束()
大家好、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.