오버레이(overlay)와 수동 초기화 예제
기술노트 36546
아키텍처:
ARM
컴포넌트:
linker
업데이트:
2021-06-22 오전 9:48
소개
“IAR C/C++ Development Guide for ARM”의 “Manual initialization” 챕터에서 소개한 오버레이 기능(overlay functionality)은 이해하기 어려울 수 있으므로, 본 기술 노트는 간단한 예를 통해 보다 자세히 설명하는 것을 목표로 합니다.
예제
링크에서 예제 프로젝트 다운로드 및 열기: Overlay example project.zip
설명:
두 함수, test1()과 test2는 ROM의 두 섹션 (MYOVERLAY1_init와 MYOVERLAY2_init)에 초기화되어 있습니다. ICF 파일은 다음을 포함:
define overlay MyOverlay { section MYOVERLAY1 };
define overlay MyOverlay { section MYOVERLAY2 };
initialize manually { section MYOVERLAY1, section MYOVERLAY2 };
먼저 main 함수는 MYOVERLAY1_init의 데이터와 RAM의 MyOverlay섹션 초기화(memcpy 사용)합니다. - 즉 test1() 함수. 그런 다음 main은 "MyOverlay" 주소의 함수를 호출합니다. test1() 함수는 값 1을 반환합니다.
이 후, main 함수는 MYOVERLAY2_init 의 데이터를 사용하여 RAM의 MyOverlay 섹션을 초기화합니다. 그런 다음 main은 test1() 함수가 실행된 곳과 동일한 주소에서 test2() 함수를 호출합니다. test2() 함수는 값 2를 반환 합니다.
파일 "overlay_test.map"에서 두 기능이 동일한 주소에 연결되어 있음을 알 수 있습니다.
위의 예는 오버레이의 기본 사항을 나타내며 C-SPY 시뮬레이터를 사용하여 실행할 수 있습니다.
주의!
RAM에서 코드를 실행할 때는 ROM 데이터와 기능에 액세스하지 않도록 주의해야 합니다. 반대로 "__ramfunc" 키워드를 사용할 때 컴파일러는 모든 액세스가 정상인지 확인하고 다음과 같은 경고를 보냅니다:
"Warning[Ta022]: Possible rom access (romvar) from within a __ramfunc function".
기능이 RAM에 수동으로 입력되는 경우(예: 중첩 방법 사용 시)에는 이 검사를 수행할 수 없습니다.
모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.