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.
工具/软件: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
}
我发现当程序停止运行时,似乎没有内存泄漏:
它还剩下大量的堆内存。
有任何线索? 谢谢。
考古学家,您好!
谢谢! 我认为这会有帮助。 我以前没有使用过这两个功能,也没有在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
不知怎么地,堆的前几个字被0覆盖。 当然,此后没有malloc例程工作。 很遗憾,我不能告诉你这是怎么发生的。 您的应用程序中其他位置的代码可能会消失,并将0写入它不应该有的内存范围,包括堆。
谢谢,此致,
-George
亲爱的George:
我同意你的看法。 堆的意外覆盖应该是根本原因。 谢谢你。
此致,
Charlie