3.1 Introduction
AVR-GCC에서는 내부램의 앞부분부터 시작해서, 첫번째로 .data 변수들을 위치시키고, 다음 부분에 .bss를 위치시킨다.
스택은 내부램의 Top에서 시작해서 아래 방향으로 자란다.
힙은 .bss의 끝부분 다음에 위치한다.
따라서 동적메모리가 램 변수와 충돌을 일으킬 위험이 없다.(할당자의 구현에 버그가 있는 경우를 제외하면)
하지만 스택과 힙 영역이 충돌한 위험은 여전히 존재한다. (힙이나 스택에 많은 메모리 공간이 요구되는 경우에)
3.2 Internal vs. external RAM
만일 외부램을 사용할 수 있다면, 힙을 외부램으로 옮길것을 강력히 추천한다. 스택은 항상 내부램에 두는 것이 좋다.
내부램이 일반적으로 더 빠르고, 부가적인 wait state 를 요구하지 않기 때문이다.
스택과 힙을 각각 개별 메모리 영역에 위치시키는 것이 충돌을 피하는 가장 효과적인 방법이다.
3.3 Tunables for malloc()
malloc() 함수가 정해진 메모리 영역만을 사용하도록 하기 위해
__malloc_heap_start 와
__malloc_heap_end 변수를 사용한다.
이 변수들은 __heap_start 와 __heap_end 를 포인트하도록 초기화된다.
__heap_start는 링커에 의해 .bss 의 바로 다음 부분을 가리키도록 채워지고, __heap_end는 0으로 설정되어서 malloc()
함수가 heap이 stack의 아래에 있다고 가정하게 만든다.
만일 힙영역이 외부메모리로 옮겨지면, __malloc_heap_end 도 따라서 이동시켜야 하는데,
이것은 __heap_end의 값을 조정하여 링크 타임에 자동실행하게 할 수도 있고,
런타임에 __malloc_heap_end 변수에 직접 값을 써주어서 변경 시킬 수 도 있다.
다음 예제는 .data, .bss, heap을 외부메모리의 0x1100 주소에 재배치하는 링커 커맨드이다.
heap은 0xffff 까지 확장된다.
avr-gcc ... -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff ...
만일 변수들을 내부램에 유지한채로, 동적 메모리가 외부램에 위치하게 되면, 다음 처럼 사용하게 된다.
이것은 외부램에 있는 힙의 윗쪽과 아랫쪽에 "holes"를 만들게 되고, 이 holes는 동적 메모리할당 또는 정규 변수에 의해 접근할 수 없는 영역으로 남아있게 된다.(아래 그림에서 연한 비스켓 색으로 표시된 부분)
avr-gcc ... -Wl,--defsym=__heap_start=0x802000,--defsym=__heap_end=0x803fff ...
만일 __malloc_heap_end 의 값이 0이면, 할당자는 힙과 스택의 충돌을 막기 위해서 스택의 끝(bottom)을 검출하려고 할것이다.
이것은 __malloc_margin 바이트들을 감소시킴으로써 현재 스택의 범위를 넘기지 않게 된다.
__malloc_margin 의 기본값은 32 이다.
< 이부분은 나중에 이해하고 재정리 해야되겠다. 내가 봐도 무슨말인지 모르겠네>
3.4 Implementation details
malloc(), free(), realloc() 함수의 작동 방식에 대한 설명인것 같다.
===========================
외부메모리 사용 질답 : http://cafe.naver.com/carroty/141066
'AVR' 카테고리의 다른 글
8 How to Build a Library (0) | 2014.04.17 |
---|---|
7 Inline Assembler Cookbook (0) | 2014.04.17 |
6 avr-libc and assembler programs (0) | 2014.04.17 |
5 Data in Program Space (0) | 2014.04.17 |
4 Memory Sections (0) | 2014.04.17 |