部件号: TMS320F28379D
主席先生/女士、
我在 RAM FW 中使用 dclfuncs 和 DCL_REFGEN。 我们需要在闪存链接器命令文件中进行哪些更改、以便我可以使用这些函数?
谢谢。此致、
Prashant Gugle
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.
部件号: TMS320F28379D
主席先生/女士、
我在 RAM FW 中使用 dclfuncs 和 DCL_REFGEN。 我们需要在闪存链接器命令文件中进行哪些更改、以便我可以使用这些函数?
谢谢。此致、
Prashant Gugle
您好、Prashant、
DCL 函数必须 从闪存加载、但从 RAM 执行 。 这意味着您的闪存链接器命令文件需要针对该dclfuncs段memcpy()进行双加载/运行地址配置、以及在调用任何 DCL 函数之前在启动时进行调用、以将代码从闪存物理传输到 RAM。 您可以按以下方式修改链接器 cmd。
因此、如果您的工程已经有.TI.ramfunc 段、请将 dclfuncs 添加到同一组。 您必须为 所有加载/运行说明符创建一个 GROUP、该指定符会自动应用于这两个段。
例如
GROUP:LOAD = FLASH_BANK0_sec7、
RUN = RAMLS0_RAMLS1、
start (RamfuncsRunStart)、
LOAD (RamfuncsLoadStart)、
大小 (RamfuncsLoadSize)
{
.TI.ramfunc
dclfuncs
}
如果您没有现有的.TI.ramfunc 段、那么您可以为 dclfuncs 创建一个段、以便它从 RAM 运行。 因此、您可以在链接器 cmd 文件的 SECTIONS 块中添加类似这样的内容。
dclfuncs:load = flash_sk0_sec7、
RUN = RAMLS0_RAMLS1、
start (DCLfuncsRunStart)、
LOAD (DCLfuncsLoadStart)、
Size (DCLfuncsLoadSize)、
对齐 (8)、
页面= 0
现在、在进行任何 DCL 调用之前、您还需要将 DCL 函数从闪存复制到 RAM。 所以 oyu 可以将它添加到您的启动代码中 — 在 initPieVectTable () 之后的 main.c 中,甚至在 device.c 中
//声明由链接器生成的符号
extern uint32_t DCLfuncsRunStart;
extern uint32_t DCLfuncsLoadStart;
extern uint32_t DCLfuncsLoadSize;
//将 DCL 函数从闪存复制到 RAM
memcpy ((uint32_t *)&DCLfuncsRunStart、
(uint32_t *)&DCLfuncsLoadStart、
(uint32_t)&DCLfuncsLoadSize);
请完成此操作后重新编译工程。
谢谢、
IRA
尊敬的 Ira:
由于 #ifdef 中有.TI.ramfunc、我必须执行 3 次
#ifdef __TI_COMPILER_VERSION__
#if __TI_COMPILER_VERSION__ >= 15009000
#if defined(__TI_EABI__)
GROUP : LOAD = FLASHD,
RUN = RAMLS0,
LOAD_START(RamfuncsLoadStart),
LOAD_SIZE(RamfuncsLoadSize),
LOAD_END(RamfuncsLoadEnd),
RUN_START(RamfuncsRunStart),
RUN_SIZE(RamfuncsRunSize),
RUN_END(RamfuncsRunEnd),
PAGE = 0, ALIGN(8)
{
.TI.ramfunc
dclfuncs
}
#else
GROUP : LOAD = FLASHD,
RUN = RAMLS0,
LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
RUN_SIZE(_RamfuncsRunSize),
RUN_END(_RamfuncsRunEnd),
PAGE = 0, ALIGN(8)
{
.TI.ramfunc
dclfuncs
}
#endif
#else
GROUP : LOAD = FLASHD,
RUN = RAMLS0,
LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
RUN_SIZE(_RamfuncsRunSize),
RUN_END(_RamfuncsRunEnd),
PAGE = 0, ALIGN(8)
{
ramfuncs
dclfuncs
}
#endif
#endif
我不需要复制这个权利吗?
//将 DCL 函数从闪存复制到 RAM
Memcpy ((uint32_t *)&DCLfuncsRunStart、 (uint32_t *)&DCLfuncsLoadStart、(uint32_t)&DCLfuncsLoadSize);
谢谢。此致、
Prashant Gugle
您好、Prashant、
正确、您必须在所有 3 种情况下添加 dclfuncs。 您也必须在启动例程中执行 memcpy ()。 您可以直接说出 memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
因为SIZE(RamfuncsLoadSize)涵盖了 总和 大小为.TI.ramfunc+dclfuncs、此单次memcpy()调用一次复制两个部分。
谢谢、
IRA