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**** 2394295 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:

	example1
	{
        file1.obj
        file2.obj
	} > FLASH_BANK0_SEC2


	myfunc1 : LOAD = FLASH_BANK0_SEC2, RUN = RAMLS4

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

场景2:

	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)

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

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

有一个.TI.ramfunc 的示例:

 .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)

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

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

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

另外几个要点:

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

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

   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

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

   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

 .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)

谢谢

约阿夫

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

    尊敬的 Yoav、

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

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

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

    谢谢。此致、
    瓦姆西  

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

    尊敬的 Yoav、

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

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

    谢谢。此致、
    瓦姆西

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

    您好,Vamsi

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

    感谢您的帮助

    约阿夫