AVR-GCC i obsługa przerwań

Jul 15, 2004 4 Replies

Witam Jak w gcc pozbyć się prologu i epilogu w obsłudze przerwania ?


************* 73:koderrc.c **** SIGNAL(SIG_OUTPUT_COMPARE1A) 170 .LM19: 171 /* prologue: frame size=0 */ 172 0064 1F92 push __zero_reg__ 173 0066 0F92 push __tmp_reg__ 174 0068 0FB6 in __tmp_reg__,__SREG__ 175 006a 0F92 push __tmp_reg__ 176 006c 1124 clr __zero_reg__ 177 /* prologue end (size=5) */ 74:koderrc.c **** cbi(PORTB, PB3); 179 .LM20: 180 006e C398 cbi 56-0x20,3 75:koderrc.c **** } 182 .LM21: 183 /* epilogue: frame size=0 */ 184 0070 0F90 pop __tmp_reg__ 185 0072 0FBE out __SREG__,__tmp_reg__ 186 0074 0F90 pop __tmp_reg__ 187 0076 1F90 pop __zero_reg__ 188 0078 1895 reti
*******************

w sumie wystarczyłoby 180 006e C398 cbi 56-0x20,3 188 0078 1895 reti



a zależy mi na jak najszybszym wykasowaniu tego bitu po przyjściu przerwania. Możeby jakąś wstawkę assemblerową zrobić, tylko nie wiem jak to wkleić w obsugę przerwania.



Pozdrawiam Grzegorz Kurczyk


void SIG_OUTPUT_COMPARE1A(void) __attribute__ ((naked));

void SIG_OUTPUT_COMPARE1A(void) { __asm__ __volatile__ ("cbi 56-0x20,3\n" "reti\n" ::); }

w.

Thu, 15 Jul 2004 14:14:59 +0200, na pl.misc.elektronika, Grzegorz Kurczyk napisał(a):

AFAIK tylko pisząc obsługę w asemblerze w oddzielnych modułach .S ( ale nie próbowałem )

Thu, 15 Jul 2004 14:45:23 +0200, na pl.misc.elektronika, Wojtek Kaniewski napisał(a):

Dzięki za przypomnienie o naked - zupełnie mi wypadło z głowy.

BTW - obie metody działają dobrze - można sobie wybrać wg preferencji. Wersja z naked jest szybka i zgrabna, natomiast oddzielny asm pozwala uniknąć barokowej składni inline-asm i korzystać z preprocesora :

<>

// plik przerwań asemblerowych #define __SFR_OFFSET 0 #include <avr\io.h>

.section .text .global SIG_OUTPUT_COMPARE1A SIG_OUTPUT_COMPARE1A: cbi PORTB,3 reti </>

Użytkownik Wojtek Kaniewski napisał:

Działa !!! Dzięki serdeczne !!!

Pozdrawiam Grzegorz Kurczyk

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required