• RVDS 3.0에서 지원하는 Pragma 형식

    2010. 1. 6.

    by. 꼼발남자





    ARM 컴파일러는 다음 형식의 pragma를 인식합니다.

    #pragma [no_]feature-name
    

    Note

    Pragma는 관련 명령 행 옵션을 재정의합니다. 예를 들어, #pragma arm --thumb 명령 행 옵션을 재정의합니다.

    Table 3.1은 ARM 컴파일러 pragma의 목록입니다. 다음 단원에서 이들 pragma에 대해 좀 더 자세히 설명합니다.

    pragma 상태를 저장하고 복원하기 위한 pragma

    다음 pragma를 사용하면 pragma 상태를 저장하고 복원할 수 있습니다.

    push

    현재 pragma 상태를 저장합니다.

    pop

    이전에 저장된 pragma 상태를 복원합니다.

    여러 개의 최적화 작업을 제어하는 pragma

    이 pragma를 사용하면 각 함수에 여러 개의 최적화 작업을 할당할 수 있습니다. pragma는 함수 밖에 두어야 하며, 한 함수에 둘 이상의 최적화 작업을 적용할 수 없습니다. 다음은 이러한 최적화 작업을 제어하는 pragma입니다. 자세한 내용은 여러 최적화 옵션을 참조하십시오.

    Onum

    최적화 수준을 변경합니다. num의 값은 0, 1, 2 또는 3입니다.

    Ospace

    공간을 최적화합니다.

    Otime

    시간을 최적화합니다.

    코드 생성을 제어하는 pragma

    다음 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 링커 및 유틸리티 설명서 스캐터 로딩 설명 파일 사용 장 참조).

    PCH 처리를 제어하는 pragma

    다음 pragma가 PCH 처리를 제어합니다.

    hdrstop

    사전 컴파일이 필요한 헤더 파일 세트가 끝나는 위치를 지정할 수 있습니다.

    이 pragma는 사전처리 지시문에 속하지 않은 첫 번째 토큰 앞에 있어야 합니다.

    no_pch

    해당 소스 파일에 대해 PCH 처리를 하지 않습니다.

    PCH 파일에 대한 자세한 내용은 사전 컴파일된 헤더 파일을 참조하십시오.

    익명 구조체 및 공용체를 제어하는 pragma

    다음 pragma는 익명 구조체 및 공용체의 사용을 제어합니다.

    anon_unions

    익명 구조체와 공용체를 지원하도록 합니다. 자세한 내용은 익명 클래스, 구조체 및 공용체를 참조하십시오.

    진단 메시지를 제어하는 pragma

    다음 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

    댓글