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.

[参考译文] TMS320F28.0049万C:关于malloc函数的问题

Guru**** 2576195 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1092774/tms320f280049c-question-about-malloc-function

部件号:TMS320F28.0049万C

尊敬的团队:

我的客户端在调用malloc函数时将遇到异常。 未分配内存,返回值为空。

此外,客户查看了地图文件,没有找到堆的起始地址和结束地址。

以下是客户的cmd文件:

MEMORY
{
PAGE 0: /* Program Memory */
PAGE 1: /* Data Memory */
BEGIN : origin = 0x00080000, length = 0x00000002
BOOT_RSVD : origin = 0x00000002, length = 0x00000126

/* RAMLS5 : origin = 0x0000A800, length = 0x00000800 */
/* RAMLS6 : origin = 0x0000B000, length = 0x00000800 */
/* RAMLS7 : origin = 0x0000B800, length = 0x00000800 */
RAMLS567 : origin = 0x0000A600, length = 0x00001A00

/* Flash sectors */
/* BANK 0 */
/* FLASHBANK0_SECT0 : origin = 0x00080002, length = 0x00000FFE */
FLASHBANK0_BOOT : origin = 0x00080002, length = 0x00000FFE /* remote update */
/* FLASHBANK0_SECT1 : origin = 0x00081000, length = 0x00001000 */
/* FLASHBANK0_SECT2 : origin = 0x00082000, length = 0x00001000 */
/* FLASHBANK0_SECT3 : origin = 0x00083000, length = 0x00001000 */
/* FLASHBANK0_SECT4 : origin = 0x00084000, length = 0x00001000 */
/* FLASHBANK0_SECT5 : origin = 0x00085000, length = 0x00001000 */
/* FLASHBANK0_SECT6 : origin = 0x00086000, length = 0x00001000 */
/* FLASHBANK0_SECT7 : origin = 0x00087000, length = 0x00001000 */
/* FLASHBANK0_SECT8 : origin = 0x00088000, length = 0x00001000 */
/* FLASHBANK0_SECT9 : origin = 0x00089000, length = 0x00001000 */
/* FLASHBANK0_SECT10 : origin = 0x0008A000, length = 0x00001000 */
/* FLASHBANK0_SECT11 : origin = 0x0008B000, length = 0x00001000 */
/* FLASHBANK0_SECT12 : origin = 0x0008C000, length = 0x00001000 */
/* FLASHBANK0_SECT13 : origin = 0x0008D000, length = 0x00001000 */
FLASHBANK0_CODE : origin = 0x00081000, length = 0x0000D000 /* control code */

/* FLASHBANK0_SECT14 : origin = 0x0008E000, length = 0x00001000 */
FLASHBANK0_DATA : origin = 0x0008E000, length = 0x00001000 /* constant data */

FLASHBANK0_SECT15 : origin = 0x0008F000, length = 0x000FF0
FLASHBANK0_SEC15_RSVD : origin = 0x08FFF0, length = 0x000010 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */

BOOTROM : origin = 0x003F0000, length = 0x00008000
BOOTROM_EXT : origin = 0x003F8000, length = 0x00007FC0
RESET : origin = 0x003FFFC0, length = 0x00000002

RAMM0S : origin = 0x00000128, length = 0x00000118 /* stack, on-chip RAM block M0 part */
RAMM1D : origin = 0x00000240, length = 0x000005B8 /* on-chip RAM block M0 part & M1 */
RAMM1_RSVD : origin = 0x000007F8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */

RAMGS0 : origin = 0x0000C000, length = 0x00002000 /**8*16K*/
RAMGS1 : origin = 0x0000E000, length = 0x00002000 /**8*16K*/
RAMGS2 : origin = 0x00010000, length = 0x00002000 /**8*16K*/
RAMGS3 : origin = 0x00012000, length = 0x00001FF8 /**8*16K*/
// RAMGS3_RSVD : origin = 0x013FF8, length = 0x000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
RAMLS4 : origin = 0x0000A000, length = 0x00000600
}


SECTIONS
{
.reset : > RESET, TYPE = DSECT
codestart : > BEGIN, ALIGN(4)


GROUP
{
#if defined(SFRA_ENABLE)
.TI.ramfunc
{
-l sfra_f32_tmu_eabi.lib<sfra_f32_tmu_collect.obj> (.text)
-l sfra_f32_tmu_eabi.lib<sfra_f32_tmu_inject.obj> (.text)
}
#else
.TI.ramfunc
#endif
ramfuncs
/* Digital Controller Library functions */
dclfuncs
dcl32funcs
} LOAD = FLASHBANK0_CODE
RUN = RAMLS567,
LOAD_START(RamfuncsLoadStart),
LOAD_SIZE(RamfuncsLoadSize),
LOAD_END(RamfuncsLoadEnd),
RUN_START(RamfuncsRunStart),
RUN_SIZE(RamfuncsRunSize),
RUN_END(RamfuncsRunEnd),
ALIGN(2)

ctrlfuncs : {
}
LOAD = FLASHBANK0_CODE
RUN = RAMLS567,
LOAD_START(ctrlfuncsLoadStart),
LOAD_SIZE(ctrlfuncsLoadSize),
LOAD_END(ctrlfuncsLoadEnd),
RUN_START(ctrlfuncsRunStart),
RUN_SIZE(ctrlfuncsRunSize),
RUN_END(ctrlfuncsRunEnd),
ALIGN(2)

.text : > FLASHBANK0_CODE, ALIGN(8)
.cinit : > FLASHBANK0_CODE, ALIGN(4)
.switch : > FLASHBANK0_CODE, ALIGN(4)
.cio : > FLASHBANK0_CODE
.pinit : > FLASHBANK0_CODE, ALIGN(4)
.const : > FLASHBANK0_CODE, ALIGN(4)
.init_array : > FLASHBANK0_CODE, ALIGN(4)

.stack : > RAMM0S
.bss : > RAMM1D
.bss:output : > RAMM1D
.bss:cio : > RAMM1D
.data : > RAMM1D
.sysmem : > RAMGS1

est_data : > RAMLS4
}

SECTIONS
{
prms_data : > FLASHBANK0_DATA

GROUP
{
user_data
foc_data
}
LOAD = RAMM1D
LOAD_START(ctrlVarsLoadStart),
LOAD_SIZE(ctrlVarsLoadSize),
LOAD_END(ctrlVarsLoadEnd)

GROUP
{
sys_data
ctrl_data
motor_data
}
LOAD = RAMGS0
LOAD_START(motorVarsLoadStart),
LOAD_SIZE(motorVarsLoadSize),
LOAD_END(motorVarsLoadEnd)


GROUP
{
vibc_data
dmaBuf_data

datalog_data
graph_data

sfra_data
SFRA_F32_Data
}
LOAD = RAMGS0
LOAD_START(extVarsLoadStart),
LOAD_SIZE(extVarsLoadSize),
LOAD_END(extVarsLoadEnd)

GROUP
{
jpf_data
}
LOAD = RAMGS1
LOAD_START(jpfVarsLoadStart),
LOAD_SIZE(jpfVarsLoadSize),
LOAD_END(jpfVarsLoadEnd)
}

这有什么问题吗?  

此致

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

    您好,

    所以我猜问题会减少到"为什么不创建sysmem部分?" 我不明白如果这是真的,为什么程序会链接。

    如果没有控制台输出,则很难进行诊断。 我唯一能发现的是sysmem和jpf_data都在GSRAM1中。 尝试将sysmem移动到LSRAMX。

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

    链接程序选项--heap_size的设置是什么

    谢谢,此致,

    -George

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

    您好,Kier和George:

    客户已通过将.sysmem移至LSRAM1来解决问题。

    感谢您的支持,请问为什么不能在GSRAM1中放入.sysmem?  

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

    我应该认为,原则上你可以在GSRAM中放置sysmem,只是GSRAM1在这种情况下可能由于某种原因而被阻止访问CPU。 可能CPUWRPROT_GS1 = 1? 所以我认为你有一个解决办法,但不是根本原因。 我请George解释根本原因。

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

    绿色,

    客户是否查看过GSxACCPROT0寄存器?  应允许从CPU和DMA的重置读/写访问,但如果他们将此配置为不允许上述的某些组合,则可能会根据观察结果阻止CPU写入。

    他们还需要确保GSX柱塞在使用之前已初始化。  这应与专用RAM相同,但要指出这一点。

    否则,我看不到此设备上会限制GSX块使用的任何其他阻止机制。

    最佳,

    Matthew