저는 프로그래밍 마이크로 컨트롤러를 처음 사용합니다. 나는 LPC1788로 2 주 동안 일 해왔다.LPC1788 마이크로 컨트롤러의 메모리 할당 문제
내가 최근에 한 가지 문제는 예상보다 훨씬 빨리 메모리가 부족하다는 것입니다. 나는 malloc 할 수있는 연속적인 메모리 블럭의 크기를 테스트함으로써 얼마나 많은 메모리가 사용 가능한지 테스트했다. 그 결과는 972 바이트이다. 할당은 주소 0x10000000 (이 보드에서 약 64kB가되어야하는 온칩 SRAM의 시작)에서 시작됩니다.
현재 작업하고있는 프로그램은 LCD를 사용하고 메시지를 인쇄 할 수있는 간단한 디버거 역할을합니다. 나는 새로운 메시지에 의해 끊임없이 "추가"될 하나의 문자열을 가지고 있으며, 전체 메시지가 LCD에 인쇄 될 것이다. 화면 아래의 메시지 길이가 수직 경계를 지나면 가장 적합한 메시지 (가장 가까운 메시지)가 삭제 될 때까지 삭제됩니다. 그러나 더 많은 메모리를 할당하기 전에 약 7 개의 추가 메시지 만 추가 할 수 있습니다. 필요한 경우 프로젝트의 main.c는 http://pastebin.com/bwUdpnD3
에서 호스팅됩니다. 이전에 threadX RTOS를 사용하여 여러 스레드를 만들고 실행하는 프로젝트에서 작업을 시작했습니다. 내가 그 프로그램에서 LCD의 사용을 포함 시키려고했을 때, 나는 거기에서도 매우 제한된 메모리를 발견했다. LCD는 SDRAM 기본 주소에서 시작하는 모든 픽셀 데이터를 저장하는 것으로 보이지만 사용중인 SRAM과 동일한 것인지 확실하지 않습니다.
필요한 것은 LCD를 사용할 수있는 동안 여러 스레드가 작동하거나 큰 문자열을 저장할 수 있도록 메모리를 할당하는 방법입니다. 한 가지 가능성은 버퍼 또는 다른 메모리 영역을 사용하는 것일 수 있지만, 어떻게해야하는지 잘 모르겠습니다. 어떤 도움을 주시면 감사하겠습니다.
tl; dr : LCD에 큰 문자열을 인쇄하려고 할 때 SRAM의 할당 가능한 메모리가 빠져 빠릅니다.
EDIT 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 : 구현 된 메모리 누출 수정. 프로그램이 훨씬 잘 작동하고, 나는 매우 어리 석다.
아마도 힙 조각화이거나 심지어 메모리 누수 일 수도 있습니다. 메모리 관리 전략에 대해 더 많이 생각해야합니다. –