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 예외 처리기가 특별한 경우라는 사실과 관련이 있습니까?