2013-05-28 7 views
0

Надеюсь сделать svC# на c-код. Теперь я могу использовать сборку для получения значения svc.Cortex m3 svc с встроенной сборкой gcc

SVC_Handler: 
    tst lr, #0x4 
    ite eq 
    mrseq r0, msp 
    mrsne r0, psp 
    b SVC_Handler_C 

    void SVC_Handler_C(unsigned int *svc_args) 
    { 
     unsigned int svc_number; 
     svc_number=((char *)svc_args[6])[-2]; 

Но я надеюсь перевести его на встроенную сборку в c-код. Но я обнаружил, что sp будет изменяться по записи функции локальной переменной или что-то в этом роде. Можно ли решить эту проблему? Спасибо

ответ

2

Я предполагаю, что вы просто хотите встроенный код сборки. Если это так, то попробуйте следующее:

__attribute__((naked)) void SVC_Handler(void) { 
    __asm__ __volatile__ (
    " tst  lr, #0x4   \n\t" 
    " ite  eq     \n\t" 
    " mrseq r0, msp    \n\t" 
    " mrsne r0, psp    \n\t" 
    " b SVC_Handler_C   \n\t"); 
} 

Тогда напишите ваш SVC_Handler_C как нормальной функции C.

+0

Если вы напишете это так же, сделайте так, чтобы оно '__attribute __ ((noreturn))' ;-) –

+0

Можете ли вы объяснить, почему нужен атрибут 'noreturn'? Благодарю. – BlueSky

+0

Not _needed_, но хорошая идея, потому что он не позволяет компилятору создать «нормальный» возврат в конце функции ('b lr'). Просто проверьте различия разборки при компиляции выше с/без него. –

-1

Незначительные изменения по сравнению с версией Bluesky по:

__attribute__((naked)) void SVC_Handler(void) { 
    register unsigned int *svc_args __asm__("r0"); 

    __asm__ __volatile__ (
     "tst  lr, #0x4 
     ite  eq 
     mrseq %0, msp 
     mrsne %0, psp" : "=r"(svc_args)); 

    return SVC_Handler_C(svc_args); 
} 

Я удивлен, однако, что вы не считая просто сделать функцию C обработчик напрямую, и извлечение аргумент через выше маленького встроенного монтажного блока.

+0

Это не работает правильно, так как конец обработчика функции не имеет возврата, из-за голой. В результате код попадает в следующий соседний код и в моем случае застревает в бесконечном цикле, вызывающем SVC_Handler_C, который как смежный. –

+0

@WieserSoftwareLtd там может быть зависимость от компилятора. В тех случаях, когда я пытался, компилятор не выполнял 'bx' для' return SVC_Handler() '(но хвост-рекурсивный, через прямой' b ... 'и поэтому _cannot fall through_). Какова ваша сгенерированная сборка? См. Также последний комментарий BlueSky выше - это важно. –