logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

atmega8 i zmienne volatile

sbady 25 Kwi 2010 12:50 1281 2
  • #1 8001142
    sbady
    Poziom 10  
    witam, mam problem postaci:

    volatile int i;
    
    ISR (INT0_vect) {
      /* obsługa przerwania */
      i-=10;
    }
    
    int main(void) {
      /* ustawienie wartości początkowych zmiennych, włączenie przerwań itp */
    
      while(1) {
        /* kod w c */
    
        while (i-- > 0) asm("nop");
    
        /* kod w c */
      }
    }
    


    za pomocą pętli while (i-- >0) realizuje opóźnienie...
    teraz gdy wystąpi przerwanie pierwsze w momencie gdy jest przetwarzana pętla while (i-- > 0) to zmienna i ma taką samą wartość po wykonaniu funkcji obsługi przerwania jak przed, jak się domyślam jest to spowodowane tym, że wartość zmiennej i wędruje na stos co moim zdaniem nie powinno mieć miejsca w przypadku zmiennych typu volatile (dodatkowo optymalizacja w kompilatorze jest wyłączona), czy ktoś z szanownych forumowiczów zna sposób na rozwiązanie powyższego problemu? dodam że interesuje mnie dokładnie taki sposób realizowania opóźnienia jak zaprezentowałem, liczniki i inne tego typu rzeczy nie wchodzą w grę ponieważ już wszystkie wykorzystałem do innego celu... pozdrawiam
  • Pomocny post
    #2 8001206
    BoskiDialer
    Poziom 34  
    Powód jest bardzo prosty: zmniejszenie zmiennej w pamięci nie jest operacją atomową. Co prawda za każdym razem następuje odczytanie zmiennej, zmniejszenie jej a następnie zapis, to jeśli przerwanie wystąpi pomiędzy odczytem a zapisem, to utracisz zmianę dokonaną w przerwaniu. W przypadku gdy przerwanie i funkcja main konkurują o jeden zasób, musisz zrealizować jakiś sposób wywłaszczania zasobu. Operacje dokonywane w przerwaniu są zawsze nieprzerywalne, więc można je traktować jako operacje atomowe, jednak aby w funkcji main operacja na zmiennej "i" była atomową, musisz na czas tej operacji zablokować przerwania.
  • #3 8001345
    sbady
    Poziom 10  
    o to chodziło, wielkie dzięki, pozdrawiam
REKLAMA