코드와 데이터 위치 독립 (ROPI와 RWPI)
기술노트 90935
아키텍처:
ARM
컴포넌트:
compiler
업데이트:
2021-05-12 오전 8:13
소개
IAR Embedded Workbench for ARM 버전 5.50 (혹은 상위버전)에서는 위치 독립 코드 및 위치 독립 데이터를 선택적으로 생성할 수 있습니다.
정의
- ROPI = 읽기 전용 위치 독립(Read-Only Position Independence). 이는 링커로부터 생성되는 ELF 출력안의 readonly 모든것과 관련이 있습니다. 여기에는 상수 데이터, 데이터 이니셜라이저도 포함됩니다. 일반적으로 FLASH에 포함된 모든 기능을 사용할 수 있습니다.
- RWPI = 읽기-쓰기 위치 독립(Read-Write Position Independence) 이는 링커로부터 생성되는 ELF 출력안의 readwrite 모든것과 관련이 있습니다.
- 현재 버전에는
--pi_veneers
옵션이 존재합니다. ( 위치 독립 베니어veneers, 더 많은 정보를 위해 Development Guide를 참고하세요.)
컴파일러 옵션
아래 기술할 내용은 Development Guide에서 일부 발췌한 내용입니다:
- 옵션: --ropi
이 옵션을 사용하여 컴파일러가 코드 및 읽기 전용 데이터를 다루기 위해 PC-relative 참조를 사용하는 코드를 생성하도록 합니다
이 옵션을 사용하면, 이러한 제한 사항이 적용됩니다:- C++ constructions 사용 불가
- 객체 속성
__ramfunc
사용 불가 - 포인터 상수는 다른 상수, 리터럴 문자열 또는 함수의 주소로 초기화할 수 없습니다. 그러나 쓰기 가능한 변수는 런타임시 상수 주소로 초기화할 수 있습니다.
--no_rw_dynamic_init 와(하단의) 전처리기 심볼 __ROPI__
을 참고하세요.
- 옵션: --rwpi
이 옵션을 사용하여 컴파일러가 주소 쓰기가 가능한 데이터를 위한 static 기반 레지스터 (R9)의 오프셋을 사용하여 코드를 생성합니다.
이 옵션을 사용하면, 이러한 제한 사항이 적용됩니다:
- 객체 속성
__ramfunc
사용 불가 - 포인터 상수는 쓰기 가능한 변수의 주소로 초기화할 수 없습니다
- 객체 속성
그러나, 런타임시 정적 쓰기 가능 변수는 쓰기 가능한 변수 주소로 초기화될 수 있습니다.
--no_rw_dynamic_init 와(하단의) 전처리기 심볼 __RWPI__
을 참고하세요.
- 옵션: --no_rw_dynamic_init
이 옵션을 사용하여 static C변수에 대한 런타임 초기화 과정을 비활성화할 수 있습니다. --ropi나 --rwpi 옵션과 함께 컴파일 되는 C소스코드는 링크 타임에 주소를 알지 못하는 객체들의 주소로 초기화된 상수와 static 포인터 변수를 가질 수 없습니다. 쓰기 가능한 static 변수에 대해 문제를 해결하려면, 컴파일러는 프로그램이 시작될때 초기화를 시행하는 코드를 생성해야 합니다. (C++의 동적 초기화 방법과 동일한 방식으로)
예제
ROPI/RWPI가 필요한 각 프로젝트에는, 프로그램의 설계, 개발 및 디버깅 환경이 모두 특별해야합니다. 많은 각기 다른 사용사례와 코드/데이터 위치 독립에 대한 요구는 예상할 수 없습니다.
모든 측면을 다루는 포괄적인 예제를 만드는 것은 어려운 일이지만, 기본적인 ROPI와 RWPI에 대한 예제를 소개합니다.
예제를 다운로드 하고 어떻게 빌드하고 실행하는지 readme.pdf 파일의 설명을 살펴보세요. STM32F4 Discovery board example 예제 또한 참고하시기 바랍니다.
참고:
최신 버전의 IAR Embedded Workbench for ARM을 사용하고 계시다면 빌드 에러가 발생할 수 있습니다. 해결방안은 아래의 문장을
static __global_reg char* rwpi_data @ "R9";
이렇게 변경하시기 바랍니다.
#if (__VER__ < 6020000)
static __global_reg char* rwpi_data @ "R9";
#else
static __no_init char* rwpi_data @ R9;
#endif
모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.