2014-04-23 2 views
1

저는 Cortex-m3에서 실행되는 프로그램을 작성하고 있습니다."svc"에 대한 gcc 컴파일러 프리미티브가 있습니까?

처음에는 'svc'를 실행하는 어셈블리 파일을 작성했습니다.

svc: 
    svc 0 
    bx lr 

나는 GCC의 인라인 어셈블리를 사용하기로 결정, 그래서 다음과 같이 내가 쓴하지만 svc 함수는 인라인되지 않았습니다.

__attribute__((naked)) 
int svc(int no, ...) 
{ 
    (void)no; 
    asm("svc 0\n\tbx lr"); 
} 

int f() { 
    return svc(0,1,2); 
} 

------------------ generated assembly ------------------ 
svc: 
    svc 0 
    bx lr 
f: 
    mov  r0, #0 
    mov  r1, #1 
    mov  r2, #2 
    b  svc 

나는 그것이 naked 때문에이 인라인하지, 그래서 나는 naked 속성을 떨어 같이 쓴 것 같아요.

int svc(int __no, ...) 
{ 
    register int no asm("r0") = __no; 
    register int ret asm("r0"); 
    asm("svc 0" : "=r"(ret) : "r"(no)); 
    return ret; 
} 

------------------ generated assembly ------------------ 
svc: 
    stmfd sp!, {r0, r1, r2, r3} 
    ldr  r0, [sp] 
    add  sp, sp, #16 
    svc 0 
    bx  lr 
f: 
    mov  r0, #0 // missing instructions setting r1 and r2 
    svc 0 
    bx  lr 

GCC는 불필요한 스택 연산을 추가하는 이유는 알 수 없지만

, svc이 좋다. 문제는 svc이 올바로 인라인되지 않았으며 가변 매개 변수가 삭제되었습니다.

svc 프리미티브가 gcc에 있습니까? gcc에없는 경우 gcc에 올바른 것을 쓰려면 어떻게해야합니까?

+0

인라인 함수는 "inline"함수를 표시하지 않았으므로 헤더 파일에 선언되어야합니다 (구현시 컴파일시 사용 가능해야 함). – IdeaHat

+0

@MadScienceDreams 둘 다 동일한 컴파일 단위에 정의되었습니다. 그렇지 않은 경우에도 링크 시간 최적화가 사용되면 인라인 될 수 있습니다. 'inline' 키워드는 여기에있는 해결책이 아닙니다. – kukyakya

+0

어셈블리 언어 함수를 작성하고 컴파일러 관련 인라인 함수를 처리하는 것보다 어셈블 및 링크하는 것이 훨씬 쉽습니다. svc는 즉각적인 인수를 취하므로 자기 수정 코드를 사용하지 않는 한 인수를 전달하지 않고 SVC를 즉시 사용할 수 있습니다. –

답변

0

Cortex-M 제품군 용 ARM CMSIS의 일부로 제공되는 core_cmFunc.h에서 사용되는 구문을 살펴보십시오. 여기에 우선 순위 마스크 레지스터에 값을 기록하는 예는 다음과 같습니다 그러나

__attribute__ ((always_inline)) static inline void __set_PRIMASK(uint32_t priMask) 
{ 
    __ASM volatile ("MSR primask, %0"::"r" (priMask)); 
} 

이 어려운 소리 같은 가변 함수를 만드는.