我对微控制器编程还很陌生;我已经用 LPC1788 工作了几个星期了。
我最近遇到的一个问题是我的内存比我预期的要快得多。我已经通过测试我可以 malloc 有多大的连续内存块来测试似乎有多少内存可用,结果是 972 字节。分配从地址 0x10000000 开始(该板上的片上 SRAM 的开始位置应该在 64kB 左右)。
我目前正在开发的程序旨在充当一个简单的调试器,它利用 LCD 并允许向其打印消息。我有一个字符串会不断被新消息“添加到”,然后整个消息将打印在 LCD 上。当消息在屏幕下方的长度超过垂直边界时,它将删除最旧的消息(靠近顶部的消息),直到适合为止。但是,在它拒绝分配更多内存之前,我只能添加大约 7 条额外的消息。如果需要,该项目的 main.c 托管在http://pastebin.com/bwUdpnD3
早些时候,我还开始了一个使用 threadX RTOS 创建和执行多个线程的项目。当我尝试在该程序中使用 LCD 时,我发现那里的内存也非常有限。LCD 似乎存储了从 SDRAM 基地址开始的所有像素数据,但我不确定这是否与我使用的 SRAM 相同。
我需要的是一种分配足够内存的方法,以允许多个线程运行或存储大字符串,同时能够利用 LCD。一种可能是使用缓冲区或其他内存区域,但我不太确定如何做到这一点。任何帮助,将不胜感激。
tl;dr:当试图在 LCD 上打印大字符串时,SRAM 上的可分配内存很快就会用完。
编辑 1:发现变量 currMessage 存在内存泄漏。我认为现在已经解决了:
strcpy(&trimMessage[1], &currMessage[trimIndex+1]);
// Frees up the memory allocated to currMessage from last iteration
// before assigning new memory.
free(currMessage);
currMessage = malloc((msgSize - trimIndex) * sizeof(char));
for(int i=0; i < msgSize - trimIndex; i++)
{
currMessage[i] = trimMessage[i];
}
编辑 2:实施内存泄漏修复。程序现在运行得更好了,我觉得很愚蠢。