2017-10-23 18 views
2

I했습니다 껍질-M0에 SVC 예외 처리기에 대한 다음의 구현 :GCC 알몸 속성은 일부 후행 기능 프롤로그 ASM 지침을 잎

int __attribute__((naked)) 
sv_call_handler(uint32_t n, uint32_t arg1, uint32_t arg2, uint32_t arg3, 
       uint32_t arg4, uint32_t arg5) 
{ 
     irq_off(); 

나는 그것이 다음과 같습니다 피질-M0을 위해 구축 : 때문에 물론 하드 고장 발생

0x7a50 <sv_call_handler>  movs r4, r0                  
    0x7a52 <sv_call_handler+2>  str r1, [r7, #12]                
    0x7a54 <sv_call_handler+4>  str r2, [r7, #8]                
    0x7a56 <sv_call_handler+6>  str r3, [r7, #4]                
    0x7a58 <sv_call_handler+8>  bl  0x3194 <irq_off> 

는 R7의 값이 '미정의'가되고, 그 어드레스 범위 내에 있지 않은 값을 포함하는 높은 가능성이있다.

내가 벌거 벗은 속성을 제거

은 조립이 훨씬 더 의미가 있습니다 :

0x7a50 <sv_call_handler>  push {r4, r5, r7, lr}               
    0x7a52 <sv_call_handler+2>  sub sp, #32                 
    0x7a54 <sv_call_handler+4>  add r7, sp, #8                 
    0x7a56 <sv_call_handler+6>  str r0, [r7, #12] 

내가 전에 문제없이 벌거 벗은 속성을 사용했습니다, 그래서 왜이 지금 발생합니까? 그것은 svc 예외 처리기가 특별한 경우라는 사실과 관련이 있습니까?

답변

2

매개 변수를 사용하는 기본 기능을 사용하지 마십시오. 이 매개 변수는 당신이 원하는 것이 아닌 가능성이 높은 어떤 프롤로그에 의해 처리되어야합니다.

조립품 (IMO)에서 작성하는 것이 좋습니다.

5

gcc 설명서에 따르면 기능 속성은 기본 asm 문만 포함하는 기능에만 사용할 수 있습니다. 이러한 기능에서 확장 된 asm 문장이나 일반적인 c- 코드를 사용하는 것이 효과가있는 것처럼 보일 수 있지만, 그렇게 보장 할 수는 없습니다.

코드에는 알몸 함수에서 정상적인 함수 호출이 있습니다. 이것은 아마도 문제의 근원입니다.