Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

stm32103vct6 - Definicja przerwania poza main.c

27 Lis 2016 00:32 639 3
  • Poziom 11  
    Skonfigurowałem TIM4 aby wywoływał przerwanie. Jeżeli definicję przerwania umieszczę w main.c to wszystko działa. Jeżeli definicja zostanie umieszczona w innym pliku to każde wywowałnie wpada do Default_Handler. Przerwanie definuję w ten sposób:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Czy ktoś spotkał się z podobnym problemem i mógłby podpowiedzieć dlaczego tak sie dzieje?
  • Specjalista - Mikrokontrolery
    A ten "inny" plik nie jest przypadkiem plikiem C++, w którym po prostu nie dajesz >extern "C"< przed deklaracją przerwania? No i najważniejsze pytanie - czy ten "inny" plik na pewno jest kompilowany i linkowany?

    BTW - atrybut "interrupt" jest zupełnie zbędny na Cortexach - tylko bezsensownie powiększa kod i zwalnia działanie całości (oczywiście bardzo nieznacznie, ale jednak).
  • Poziom 11  
    Ech.. Przepraszam za zamieszanie. Problemem okazała się nazwa, którą nawet w poprzednim poście wkleiłem z błędem. Chodzi o void TIM4_Handler(void), a powinno być TIM4_IRQHandler.

    Freddie, dzięki za podpowiedz/pytanie czy plik jest linkowany. Plik był oczywiście kompilowany i linkowany. W pliku .lss zauważyłem, że zostaje podstawione Default_Handler i to mnie zastanowiło.

    Btw. dlaczego atrybyt "interrupt" jest zbędny i powiększa kod?
  • Specjalista - Mikrokontrolery
    koralgolek napisał:
    Btw. dlaczego atrybyt "interrupt" jest zbędny i powiększa kod?

    Dla Cortexów to co robi ten atrybut (zapewnienie wyrównania stosu do 8 bajtów) da się zrobić sprzętowo. W większości Cortexów jest to domyślnie włączone, w przypadku STM32F1 trzeba sobie to akurat włączyć przy użyciu takiej oto linijki "SCB->CCR |= SCB_CCR_STKALIGN_Msk;". Ponieważ atrybut ten dokłada trochę kodu na wejściu i wyjściu z przerwania, to w efekcie program jest nieco większy, a reakcja na przerwania (rozumiana jako czas pomiędzy zdarzeniem a rozpoczęciem wykonywania zasadniczego kodu) jest nieco dłuższa.