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.

[参考译文] 编译器/TMS320F2.8069万:malloc失败

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/584271/compiler-tms320f28069-malloc-failed

部件号:TMS320F2.8069万

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

描述:

 CCS版本:7.0 .0.0.0042万  

 C2800编译器工具16.9 .1.LTS  

程序始终关闭,malloc失败:

该程序正在执行的操作是接收USB消息(约140字节有效负载),然后将其分解为CAN消息(最多8字节有效负载), 并将CAN消息回复从设备转发到USB端口。

代码中有一些malloc()和free()。

我在链接程序配置中分配了一个大堆大小(len: 0x2000,来自0xA000)

esysmem 10000 0000a0万 0000.2万未初始化
0000a000 000000010万00001 rts2800_fpu32.lib0.0001万 rts2800_fpu32.lib:2800:memory.obj (.esysmem)
0000a001 00001fff100001fff --孔-

我还编写了一个数组,用于记录 每个malloc / delete操作的开始地址和分配内存的长度。

bool recordMalloc (UINT32 startAddr,UINT32 len)

#ifdef memory_record_LEN

  int i;
  用于(i=0;i<memory_record_LEN;i++){
  如果(memory_record[I].len == 0){
    memory_record[I].startAddr = startAddr;
    memory_record[I].len = len;
    返回true;
  }
}
返回false;

#endif
}

bool recordFree (UINT32 startAddr)

#ifdef memory_record_LEN

  int i;
  用于(i=0;i<memory_record_LEN;i++){
    如果(memory_record[I].startAddr == startAddr){
    memory_record[I].startAddr = 0;
    memory_record[I].len = 0;
    返回true;
  }
}
返回false;

#endif
}

我发现当程序停止运行时,似乎没有内存泄漏:

它还剩下大量的堆内存。

有任何线索? 谢谢。

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

    我看到程序在malloc / free之后停止了1400次:

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

    我已将您的帖子移至编译器论坛。

    此致,
    Adam Dunhoft
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    C28x RTS库附带额外的malloc调试功能。 malloc失败时,函数free_memory()和max_free()返回什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    考古学家,您好!

    谢谢! 我认为这会有帮助。 我以前没有使用过这两个功能,也没有在CCS的帮助页面中找到它们。
    在malloc()操作之前,我应该在任何控制台中调用它们,还是将这些函数嵌入应用程序代码?

    谢谢。

    Charlie

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

    Lei Cai 说:
    未在CCS帮助页面中找到它们[/QUOT]

    它们未记录在案。  但您确实有他们的源代码。  它们位于RTS源文件memory.c中,该文件位于类似于以下内容的目录中:

    C:\ti\ccsv7\tools\compiler\ti-CGT-C2000_C2000<xmt-block0>2000 16.9 .2.LTS\lib\src 

    您会发现这些源代码行...

    /************************************************************************* //
    * */*
    FREE_MEMORY -返回可用内存的总量 */*
    		分配。 内存可能已碎片化。 */*
    *
    ///.................. /
    int free内存(void)...
    
    
    /************************************************************************* //
    * */*
    MAX_FREE -返回最大的单个内存块的大小 	*/*
    	可供分配。 */*
    *
    ///.................. /
    int max_free (void)
    

    Lei Cai 说:
    在malloc()操作之前,我应该在任何控制台中调用它们,还是将这些函数嵌入应用程序代码?

    将它们嵌入应用程序中。  捕获在监视窗口中可以看到的变量中的返回值。

    谢谢,此致,

    -George

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

    亲爱的George:

    我在每个malloc()和free()操作后嵌入了Get_free()和max_free(),并在两个滚动缓冲区中记录了历史结果。

    意外结果:无内存泄漏,无内存碎片。

    内存管理结构似乎已损坏,可能被某些内容覆盖?

    此致,

    Charlie

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

    在我嵌入free_memory()和max_free()代码之后,程序在free_memory()中执行了一些操作之后,开始进入无限循环,而不是malloc()。 MCU没有停机,它仍在工作,但是内存结构的链列表被破坏,无法脱离循环(内存的620行)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不知怎么地,堆的前几个字被0覆盖。  当然,此后没有malloc例程工作。  很遗憾,我不能告诉你这是怎么发生的。  您的应用程序中其他位置的代码可能会消失,并将0写入它不应该有的内存范围,包括堆。

    谢谢,此致,

    -George

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

    亲爱的George:

    我同意你的看法。 堆的意外覆盖应该是根本原因。 谢谢你。

    此致,

    Charlie