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.

[参考译文] 编译器/LAUNCHXL-F28379D:在一个地址加载、从另一个地址运行问题

Guru**** 2595805 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/963761/compiler-launchxl-f28379d-load-at-one-address-run-from-a-different-address-problem

器件型号:LAUNCHXL-F28379D

工具/软件:TI C/C++编译器

我想将一些代码放置到 RAM 中、因为它从闪存中以更快的速度工作。

我在中断中使用此代码。

void target_func __attribute__((ramfunc))(void);工作正常、但它仅为 RAMLS0的2k、如果我有更多的代码链接器说:

"./lnk.cmd"、第48行:错误#10099-D:程序将无法放入可用内存中。 “.text”大小为0x2b12的定位失败。 可用存储器范围:闪存大小:0x1000未使用:0xe56最大空洞:0xe56

即使我有"run = RAMLS0 | RAMLS1 | RAMLS3"

#ifdef __TI_Compiler_version__
#if __TI_Compiler_version__>=15009000
.TI.ramfunc:{}负载= FLASHD,
运行= RAMLS0 | RAMLS1 | RAMLS3、
load_start (_RamfuncsLoadStart)、
load_size (_RamfuncsLoadSize)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
run_size (_RamfuncsRunSize)、
run_end (_RamfuncsRunEnd)、
PAGE = 0、align (4)
#else
ramfuncs :LOAD = FLASHD,
运行= RAMLS0 | RAMLS1 | RAMLS3、
load_start (_RamfuncsLoadStart)、
load_size (_RamfuncsLoadSize)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
run_size (_RamfuncsRunSize)、
run_end (_RamfuncsRunEnd)、
PAGE = 0、ALIGN (4)
#endif 

因此、我想做自己的部分:

   coderam:   load = FLASHE,
               运行= RAMLS2、
               load_start (_codeRamLoadStart)、
                load_size (_codeRamLoadSize)、
               load_end (_codeRamLoadEnd)、
               run_start (_codeRamRunStart)、
               run_size (_codeRamRunSize)、
              run_end (_codeRamRunEnd)、
            PAGE = 0、ALIGN (4)

并与 void target_func __attribute__((section(".coderam"))一起使用(void);

但它在执行时会清空并进入 ILLEGAL_ISR()

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

    好的、我在这里找到了解决方案: ii.pw.edu.pl/.../spra958h.pdf

    (SPRA958H 从 TMS320F28xxx DSP 4.4上的内部闪存运行应用程序)

    "最后、必须在运行时将该段从闪存复制到 RAM 中。 与4.1 - 4.3节一样,可以使用编译器运行时支持库中的函数 memcpy()。"

    我添加了

    memcpy (&codeRamfuncsRunStart、&codeRamfuncsLoadStart、(size_t)&codeRamfuncsLoadSize);到 F2837xD_sysctrl.c 中的 InitSysCtrl()

    extern uint16 codeRamfuncsLoadStart;
    extern uint16 codeRamfuncsLoadEnd;
    extern uint16 codeRamfuncsLoadSize;
    extern uint16 codeRamfuncsRunStart;
    extern uint16 codeRamfuncsRunEnd;
    extern uint16 codeRamfuncsRunSize;

    device.h 以及 F2837xD_GlobalPrototypes.h 中

    注意"codeRa.。 在.cmd 中没有"_"字节-使用。