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.

[参考译文] TMS320F280025C:从闪存复制程序并在 RAM 中执行时出现问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1326174/tms320f280025c-problem-with-copying-program-from-flash-and-execute-in-the-ram

器件型号:TMS320F280025C

您好

我 在将部件从闪存复制到 RAM 时遇到问题。 我看了几个指南,你有:

*TI 链接器命令文件入门- TI 链接器命令文件入门

* 从 TMS320F28xxx DSP 的内部闪存运行应用程序。

*TMS320F28002x 闪存 API

*在 TMS320F28xxx DSP 上将编译程序段从闪存复制到 RAM

可惜,我仍然有麻烦。 每次我尝试其中一种复制方法时,我的程序卡在 main 之前或在非法操作陷阱中的某个地方。  

场景1:

Fullscreen
1
2
3
4
5
6
7
8
example1
{
file1.obj
file2.obj
} > FLASH_BANK0_SEC2
myfunc1 : LOAD = FLASH_BANK0_SEC2, RUN = RAMLS4
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

这不奏效。 我使用#pragma code_section 运行我的函数、我可以看到它们已被复制、但程序也会卡住。 按照我的程序用 CPP 编写的方式。

场景2:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
example2
{
file1.obj
file2.obj
} LOAD = FLASH_BANK0_SEC2
RUN = RAMLS4,
LOAD_START(MyfuncsLoadStart),
LOAD_SIZE(MyfuncsLoadSize),
LOAD_END(MyfuncsLoadEnd),
RUN_START(MyfuncsRunStart),
RUN_SIZE(MyfuncsRunSize),
RUN_END(MyfuncsRunEnd),
ALIGN(8)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

此选项不起作用。 程序会卡住。  

关于这种情况的另一个问题:当 在 load_start、load_size 等中使用符号时、我需要在代码中声明它们?

有一个.TI.ramfunc 的示例:

Fullscreen
1
2
3
4
5
6
7
8
9
.TI.ramfunc : LOAD = FLASH_BANK0_SEC1
RUN = RAMLS4,
LOAD_START(RamfuncsLoadStart),
LOAD_SIZE(RamfuncsLoadSize),
LOAD_END(RamfuncsLoadEnd),
RUN_START(RamfuncsRunStart),
RUN_SIZE(RamfuncsRunSize),
RUN_END(RamfuncsRunEnd),
ALIGN(8)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

 符号 RamfuncLoadStart、RamfuncsLoadSize 和等在代码中声明。

当我在段中再次使用它们时、会收到"绝对符号重新定义"的警告。

我想我不明白它们的正确用法。

另外几个要点:

*文件"f28002x_codestartbranch.asm"被添加 到我的项目中。

*当 我的程序 从 RAM 运行时,它会正常工作。 请参阅以下链接器文件示例:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
codestart : > BEGIN, ALIGN(8)
.text : > RAMLS5 | RAMLS6 | RAMLS7, ALIGN(8)
.cinit : > RAMLS4, ALIGN(8)
.switch : > RAMLS4, ALIGN(8)
.reset : > RESET, TYPE = DSECT /* not used, */
.stack : > RAMM1
.init_array : > RAMLS4, ALIGN(8)
.bss : > RAMLS4
.bss:output : > RAMLS4
.bss:cio : > RAMGS0
.const : > RAMLS4, ALIGN(8)
.data : > RAMLS4
.sysmem : > RAMLS4
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

*当我的程序 从 闪存运行时,它会工作。  请参阅以下链接器文件示例:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
codestart : > BEGIN, ALIGN(8)
.text : >> FLASH_BANK0_SEC2 | FLASH_BANK0_SEC3 | FLASH_BANK0_SEC4, ALIGN(8)
.cinit : > FLASH_BANK0_SEC1, ALIGN(8)
.switch : > FLASH_BANK0_SEC1, ALIGN(8)
.reset : > RESET, TYPE = DSECT /* not used, */
.stack : > RAMM1
.init_array : > FLASH_BANK0_SEC1, ALIGN(8)
.bss : > RAMLS4
.bss:output : > RAMLS4
.bss:cio : > RAMGS0
.const : > FLASH_BANK0_SEC1, ALIGN(8)
.data : > RAMLS4
.sysmem : > RAMLS4
//.TI.ramfunc : > RAMGS0
ramgs0 : > RAMGS0
/* Allocate IQ math areas: */
IQmath : > RAMLS4
IQmathTables : > RAMLS4
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

谢谢

约阿夫

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

    尊敬的 Yoav、

    这是一个在美国的假期。  我们会在几天后进行审查并回复您。   

    同时、请查看以下常见问题解答-它可能会有所帮助:

    如何将应用程序从 RAM 配置修改为闪存配置?: https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/878674 

    谢谢。此致、
    瓦姆西  

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

    尊敬的 Yoav、

    1) 1)该常见问题解答是否有助于为您解决该问题?

    2) 2)您可能已经注意到这些变量是在 device.h 文件中定义的。  您是否调用 memcpy()将闪存映射内容复制到 RAM?

    谢谢。此致、
    瓦姆西

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

    您好,Vamsi

    是的、常见问题解答可以帮助我。

    感谢您的帮助

    约阿夫