현재, config 파일에 세팅되어 있는 메모리 맵과 하드웨어 스펙 상으로 사용되고 있는 메모리의 정도를 파악하는 데 있다.
앞에서 .map 파일을 분석하면서도 살펴보았지만,

## Shared Memory address & size (The first 3Mb are used for AVMEM).
SMI_BASE          = 0xC0300000
SMI_SIZE          = (13 * M)

총 13M 로 잡혀있다. 실제로 비주얼 툴로 확인해보아도, 총 16M 가 AVMEM(3M)제외하고 잡혀있다.
내가 최대한 줄인 것으로는 5M 까지 줄여서 실행해봤다. 프로그램 돌아가는 데는 문제가 없어 보였다.

이 HEAP(엉덩이?!) 영역은 프로그램이 실행될 때, 메모리로 사용되는 영역이다. 예를 들어 1000 개의 배열을 잡았다고 하면, 바로 이 영역에 잡히게 된다. malloc() 로 역시 어느 일정부분을 잡았다고 하면, 역시 이 영역에 잡히게 된다.
내가 앞에서 SDRAM 을 5M로 잡았다고 했다. 힙 영역을 계산해보니, 150KB 정도 되었다. 13M 로 세팅했을 때 보다, 힙 역시 줄어들었다. 일단 내가 이 상태로 프로그램을 실행하는 데는 아무런 문제 없었다.

만일 프로그램이 실행하는 데, 힙 영역이 적을 시에는 중간에 죽거나, 다운이 되버린다. 바로 이점이 문제다. 문제의 원인이 힙 영역인지, 아니면 다른 문제인지 알길이 막막하기 때문이다.

과연 어느 부분이 달라졌는 지 비교 해보자!! SDRAM 을 5M 로 세팅했을 때와 13M 로 했을 때의 메모리맵을 보자!

앞에부터 5M, 13M 이다. 얼핏 그림으로 볼때는 오른 쪽 그림이 길어서 많게 보일 수 있지만, 옆에 적혀있는 주소값을 보기 바란다.(실제로도 더 큼)
다른 섹션에 있는 값들은 왼쪽과 오른 쪽이 같다. 단지 다른 것은 stack 과 heap 영역이다.

8M 16M
stack 150K 4.3M
heap 150K 4.3M

우선 문제가 되는 것은 저 엄청나게 줄어든 두 영역이다. 저 두 영역은 컴파일 할 때는 크게 문제가 되지 않지만, 실제로 프로그램을 돌릴 때 문제가 될 수 있다.
현재 내가 기본적인 동작(채널 스캔, 채널 채인지등)을 해본 결과, 중간에 죽거나, 다운되는 현상은 없었다.

지금은 현재로는 SDRAM 이 8M 가 되어도 괜찮지만, 만일 여기서 더 추가가 된다면, 과연 어디를 줄여야 할까?
내가 볼때는 def_code 와 def_const 영역이다. 흔히 말해, 프로그램 코드가 저장되는 영역과, 광역 변수가 차지하는 영역이다. 둘 중에 하나를 꼽으라면, def_const 이다.
찾아본 결과, def_const 에서는 osd part 가 전체 80% 이상을 차지하고 있다.
또한 무려 3.1M 나 잡고 있던 system_section

어찌 되었든 나중에 플래시에 저장되어야 한다.

#gmake arena.hex

위와 같이 명령을 내리면, 다음의 것들이 플래시에 저장된다.

  1. 프로그램 코드
  2. Global 변수
  3. 함수

로컬 변수는 플래시에 따로 잡히지 않는다. 이런 것들은 함수가 호출 될 때, 스택에 잡히고, 함수가 끝나면, 자동으로 리소스를 해제시킨다.

  • computer/digitalarena/dacs1000_메모리_구조.txt
  • Last modified: 3 years ago
  • by likewind