임베디드 시스템 프로그램을 개발하다 보면, 메모리가 부족한 경우가 있습니다. 이 경우 컴파일은 되는데, 링킹이 안되며 에러가 발생합니다.
가장 간단한 해결법은 더 큰 용량의 메모리를 가진 프로세서를 사용하면 되지만, 현실적으로는 조금 어렵습니다. 현업에서는 결국은 소프트웨어를 수정하여 사용 메모리 공간을 줄여야 합니다.
이런 경우 코드의 어떤 부분을 수정하면 확인하는 방법에 대해서 알아봅니다.
다시 말하면 ⓛ현재 메모리 사용량을 통해 어떤 메모리가 부족한지 확인하고
②기본적인 메모리 구조를 통해 수정해야 할 부분을 확인합니다.
ARM Cortex - IAR Embedded Workbench 기준으로 설명드립니다.
ⓛ현재 메모리 사용량 확인
IAR에서 프로젝트 옵션에서 Linker > Generate inker map file (. MAP 파일을 생성하는 속성)을 체크합니다.
빌드한 다음에 List 폴더 내에 링크 맵 파일 (. map파일)을 확인할 수 있습니다.
(메모리가 부족해도 컴파일은 되기 때문에 map파일이 생깁니다)
MODULE SUMMARY를 보면, 각 오브젝트 파일 (코드 단위) 별로 사용 중인 메모리를 확인할 수 있습니다.
각 코드별로 ro code, ro data, rw data 영역에 대해서 메모리 사용량을 확인 할 수 있습니다.
② 기본적인 메모리 구조를 통해 수정 방향 확인
앞선 설명에서 ro code 영역의 메모리가 부족하다면, 코드에서 어떤 방향으로 수정을 해야 할까요? 전역변수를 줄이거나 지워야 할지, 코드 크기를 줄여야 할지 알 수 있을까요?
이를 알기 위해서는 기본적인 메모리 구조를 알아야 합니다.
메모리는 기본적으로 아래 그림과 같이 RAM과 ROM영역으로 구분되며, 다시 각각의 섹션(Section)으로 구분됩니다.
표로 정리하면 아래와 같습니다.
구분 | 섹션 | 설명 |
RAM (rw) | CSTACK | 함수 내 지역변수, 함수 매개변수, 함수 리턴 주소 |
.bss | 초기값이 없는 전역/정적 변수 | |
.data | 초기값이 있는 전역/정적 변수 | |
ROM (ro) | .data_init | .data의 초기값 저장 |
.rodata | (const 선언된) 상수 | |
.text (code) | 프로그램 코드 | |
.intvec | 인터럽트 벡터 테이블 |
그렇다면, 앞서 확인한 메모리 사용현황과 메모리 구조를 통해 아래와 같이 코드 수정방향을 정할 수 있습니다.
map 파일을 통해 ROM영역 (ro code + ro data)의 메모리 부족이 확인되면, (불필요 부분 삭제, 함수로 코드의 재사용등의 여러 방법을 통해) 코드의 크기를 줄이거나 const선언된 상수를 줄여야 합니다.
RAM영역(. data +. bss)의 메모리가 부족하다면, 변수의 개수나 함수의 개수를 줄이는 방향으로 코드를 수정해야 합니다.
물론 코드가 항상 내가 원하는 방향으로 수정을 할 수는 없지만, 문제의 원인을 알고 있다면 리소스가 제한적인 임베디드 시스템에서 더 나은 방향으로 메모리 사용을 최적화할 수 있을 것입니다.
[1] https://www.epnc.co.kr/news/articleView.html?idxno=219575
[2]https://wwwfiles.iar.com/arm/webic/doc/EWARM_DevelopmentGuide.ENU.pdf
[3] https://support.touchgfx.com/ko/docs/basic-concepts/memory-usage
'application.hack' 카테고리의 다른 글
티스토리 수식 입력 방법 (활용편) (0) | 2025.01.07 |
---|---|
티스토리 수식 입력 방법 (기본편) (0) | 2025.01.06 |
소리로 실시간 자막 생성하기 (팟플레이어) (0) | 2024.12.27 |
Easy Contex Menu (윈도우의 컨텍스트 메뉴 편집) (0) | 2024.12.26 |
PWM으로 DC-DC 컨버 모듈 출력제어 (0) | 2022.01.21 |