-
ARM 컴파일러는 다음 형식의 pragma를 인식합니다.
#pragma [no_]
feature-name
Note
Pragma는 관련 명령 행 옵션을 재정의합니다. 예를 들어,
#pragma arm
은--thumb
명령 행 옵션을 재정의합니다.Table 3.1은 ARM 컴파일러 pragma의 목록입니다. 다음 단원에서 이들 pragma에 대해 좀 더 자세히 설명합니다.
다음 pragma를 사용하면 pragma 상태를 저장하고 복원할 수 있습니다.
push
현재 pragma 상태를 저장합니다.
pop
이전에 저장된 pragma 상태를 복원합니다.
이 pragma를 사용하면 각 함수에 여러 개의 최적화 작업을 할당할 수 있습니다. pragma는 함수 밖에 두어야 하며, 한 함수에 둘 이상의 최적화 작업을 적용할 수 없습니다. 다음은 이러한 최적화 작업을 제어하는 pragma입니다. 자세한 내용은 여러 최적화 옵션을 참조하십시오.
O
num
최적화 수준을 변경합니다.
의 값은 0, 1, 2 또는 3입니다.num
Ospace
공간을 최적화합니다.
Otime
시간을 최적화합니다.
다음 pragma는 코드 생성 방식을 제어합니다. 다른 코드 생성 옵션은 컴파일러 명령 행에서 사용할 수 있습니다. 코드 생성 제어를 참조하십시오.
arm
코드 생성을 ARM 명령어 세트로 전환합니다. 이 pragma는
--thumb
컴파일러 옵션을 재정의합니다.thumb
코드 생성을 Thumb® 명령어 세트로 전환합니다. 이 pragma는
--arm
컴파일러 옵션을 재정의합니다.사전 Thumb-2 프로세서에 대한 코드를 컴파일하고 VFP를 사용하는 경우, 부동 소수점 연산이 포함된 모든 함수가 ARM에 대해 컴파일됩니다.
--exceptions_unwind --no_exceptions_unwind
런타임 시 함수 해제를 사용하거나 사용하지 않습니다. 자세한 내용은 실행 시 함수 해제를 참조하십시오.
once
이 pragma가 헤더 파일의 시작 부분에 있을 경우, 이것은 헤더 파일을 여러 번 포함하는 것이 한 번 포함하는 것과 동일한 효력을 갖도록 작성되었음을 의미합니다. 따라서 컴파일러는 이후에는 이 파일을 포함시키지 않습니다.
대개
#ifndef
가드를 파일의 본문 주위에 두고#ifndef
뒤에 가드 변수의#define
을 둡니다. 예를 들면 다음과 같습니다.#ifndef FILE_H #define FILE_H #pragma once // optional
... body of the header file ....
#endif이 예제에서
#pragma once
는 선택 사항으로 표시됩니다. 이는 컴파일러가#ifndef
헤더 가드 코딩을 인식하고#pragma once
가 없더라도 이후에는 포함시키지 않기 때문입니다.#pragma once
는 다른 컴파일러와 호환되며 다른 형식의 헤더 가드 코딩을 사용할 수 있습니다. 그렇지만 이식성이 우수하기 때문에#ifndef
및#define
코딩을 사용하는 것이 더 좋습니다.softfp_linkage no_softfp_linkage
#pragma softfp_linkage
는 다음#pragma no_softfp_linkage
까지 모든 함수 선언이 소프트웨어 부동 소수점 링키지를 사용하는 함수를 설명하도록 지정합니다.__softfp
키워드도 동일한 효과가 있습니다(함수 키워드 참조). pragma 형식은 해당 파일을 변경하지 않은 채 전체 인터페이스 사양(헤더 파일)에 적용될 경우 유용할 수 있습니다.import(
symbol_name
)
에 대한 가져오기 참조를 생성할 수 있습니다. 이것은 다음 어셈블러 지시문과 동일합니다.symbol_name
IMPORT
symbol_name
심볼 이름은 이미지의 심볼 테이블에 외부 심볼로 배치됩니다. 여기에 배치되지 않으면 사용되지 않습니다. 심볼을 정의하거나 참조하면 안 됩니다.
이 pragma를 사용하여 힙 구현 또는 실시간 나누기와 같은 C 라이브러리의 특정 기능을 선택할 수 있습니다. 이 설명서에 설명하는 기능을 사용하기 위해 심볼 참조를 가져와야 할 경우에는 필요한 심볼이 지정됩니다. 예제를 보려면 세미호스팅 사용 안 함을 참조하십시오.
arm section
section_sort_list
후속 함수나 오브젝트에 Code 또는 Data 섹션 이름을 사용하도록 지정합니다. 여기에는 컴파일러가 초기화를 위해 생성하는 익명 오브젝트의 정의가 포함됩니다. 이 옵션은 다음 사항에 영향을 주지 않습니다.
인라인 함수(및 해당 지역 정적 변수)
템플리트 초기화(및 해당 지역 정적 변수)
사용하지 않는 변수 및 함수 제거(다만
#pragma arm section
을 사용하면 사용 함수나 변수와 동일한 섹션에 있기 때문에 제거하지 않아도 되는 함수나 변수를 링커가 제거할 수도 있습니다.)오브젝트 파일에 정의가 기록되는 순서
이 pragma의 전체 구문은 다음과 같습니다.
#pragma arm section [
sort_type
[[=]"name
"]] [,sort_type
="name
"]*여기서
은 이 섹션에서 사용할 이름이고,name
은 다음 중 하나입니다.sort_type
code
rodata
rwdata
zidata
은 지정되었으나sort_type
은 지정되지 않은 경우,name
의 섹션 이름이 기본값으로 리셋됩니다.sort_type
#pragma arm section
만을 입력하여 모든 오브젝트 섹션의 이름을 기본값으로 복원하십시오(Example 3.1 참조).Example 3.1. 섹션 명명
int x1 = 5; // in .data (default) int y1[100]; // in .bss (default) int const z1[3] = {1,2,3}; // in .constdata (default) #pragma arm section rwdata = "foo", rodata = "bar" int x2 = 5; // in foo (data part of region) int y2[100]; // in ..bss int const z2[3] = {1,2,3}; // in bar char *s2 = "abc"; // s2 in foo, "abc" in ..conststring #pragma arm section rodata int x3 = 5; // in foo int y3[100]; // in ..bss int const z3[3] = {1,2,3}; // in ..constdata char *s3 = "abc"; // s3 in foo, "abc" in ..conststring #pragma arm section code = "foo" int add1(int x) // in foo (code part of region) { return x+1; } #pragma arm section code
#pragma arm section
의 대체 방법으로 함수나 변수에 대해 함수 특성에서 설명한 대로 GNU__attribute__((section(..)))
을 사용하십시오.ARM 링커가 있는 스캐터 로딩 설명 파일을 사용하여 명명된 섹션을 메모리의 특정 주소에 배치하는 방식을 제어하십시오(RealView Compilation Tools 버전 3.0 링커 및 유틸리티 설명서의 스캐터 로딩 설명 파일 사용 장 참조).
다음 pragma가 PCH 처리를 제어합니다.
hdrstop
사전 컴파일이 필요한 헤더 파일 세트가 끝나는 위치를 지정할 수 있습니다.
이 pragma는 사전처리 지시문에 속하지 않은 첫 번째 토큰 앞에 있어야 합니다.
no_pch
해당 소스 파일에 대해 PCH 처리를 하지 않습니다.
PCH 파일에 대한 자세한 내용은 사전 컴파일된 헤더 파일을 참조하십시오.
다음 pragma는 익명 구조체 및 공용체의 사용을 제어합니다.
anon_unions
익명 구조체와 공용체를 지원하도록 합니다. 자세한 내용은 익명 클래스, 구조체 및 공용체를 참조하십시오.
다음 pragma는 메시지 번호에
-D
접미사가 있는 진단 메시지의 출력을 제어합니다.diag_default
tag
[,tag
, ....]진단 메시지의 심각도를 pragma를 표시하기 전에 유효하던 심각도로 되돌립니다(즉, 명령 행 옵션에 의해 수정된 대로 메시지의 정상 심각도로 복귀).
--diag_error
tag
[,tag
, ...]지정된 태그가 있는 진단 메시지의 심각도를 오류로 설정합니다.
--diag_remark
tag
[,tag
, ...]지정된 태그가 있는 진단 메시지의 심각도를 주의로 설정합니다.
diag_suppress
tag
[,tag
, ...]지정된 태그가 있는 모든 진단 메시지를 표시하지 않습니다.
diag_warning
tag
[,tag
, ....]지정된 태그가 있는 진단 메시지의 심각도를 경고로 설정합니다.
예를 들어, 경고 메시지가 다음과 같이 표시될 수 있습니다.
경고: #550-D: 변수 "b"를 설정했으나 한 번도 사용하지 않았습니다.
이 경고를 주의로 낮추려면 다음과 같이 지정하십시오.
#pragma diag_remark 550
컴파일러는 기본적으로 주의를 표시하지 않습니다. 주의 메시지를 보려면
--remarks
컴파일러 옵션을 사용하십시오(진단 메시지의 출력 제어 참조).
'Embedded_System > ARM_Core' 카테고리의 다른 글
How do the ARM Compilers handle memcpy()? (0) 2010.01.13 iPhone 3G vs. iPhone 3GS → ARM11 vs. Cortex A-8 (0) 2009.11.10 ELF File Format (0) 2008.06.09 댓글