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

Atmega, zapis liczby 16bit procesor 8bit i przerwanie - konflikt

tom1eczek 23 Paź 2017 21:45 777 1
REKLAMA
  • #1 16775147
    tom1eczek
    Poziom 20  
    Zastanawiam się, jak się odbywa zapis zmiennej 16 bitowej w procesorze 8 bitowym. Najpewniej najpierw przepisywana jest pierwsza połowa, następnie druga.

    A czy możliwe jest, żeby jeśli przerwanie wystąpi równo w tym momencie i będzie chciało odczytać wartość tej zmiennej to odczyta pierwszą połowę nową, a drugą starą?

    czyli jeśli a=0000 zmieniam na a=FFFF to odczytam a=FF00 lub a=00FF?

    Czy trzeba wyłączać w takim razie przerwania podczas zapisu takiej liczby?
    Disable interrupts..[zapis zmiennej np a=FF]...enable interrupts


    Jeśli nastąpiło przerwanie, procesor przeszedł w obsługę przerwania i nastąpiło drugie przerwanie (Int1 i timer2). Podobno procesor sam wyłącza obsługę przerwań na czas jego wykonywania ale na wszelki wypadek robię to sam i obsługa przerwania wygląda tak:

    obsluga_sekundnika:
    Disable Interrupts
    ...instrukcje
    enable Interrupts
    return


    Co się wydarzy?
    Procesor skończy obsługiwać jedno przerwanie i razem z instrukcją return włączy system przerwań i zacznie obsługiwać drugie?

    Czy procesor skończy obsługiwać to pierwsze, a to drugie zostanie utracone (czyli np będę sekundę w plecy)?


    Trzecia sprawa. Obsługując przerwanie wywołuję procedurę lub funkcję. Program wykonuje ją, kończy i wraca do obsługi przerwania, kończy przerwanie i wraca do obsługi programu głównego do...loop? Czy dzieje się coś na czym za bardzo nie można zapanować?

    
    on timer2 obsluga_sekundnika
    obsluga_sekundnika:
    Disable Interrupts
    Call Odczyt_czasu
    enable Interrupts
    return
    sub odczyt czasu
    ...instrukcje....
    end sub
    
  • REKLAMA
  • #2 16776361
    JacekCz
    Poziom 42  
    1. idealnie to analizujesz, dokładnie tak zapis 16bit może być podzielony przez przerwanie

    2. leczy się to przez rzeczywiście wyłączenie przerwań ORAZ jako baza zadeklarowanie zmiennej jako volatile (wielu wierzy tylko magiczna moc volatile - błąd).
    Przywrócenie przerwań jest IMHO ładniejsze, jak ma charakter "push stan przerwań / disable / algorytm / zdjęcia ze stosu". Przykład, który to ilustruje: po jakimś rozwoju kodu z jednej funkcji wołasz drugą, która dawniej był samodzielna (z takim samym zabezpieczeniem) , następuje przywrócenie, i ta druga wierzy że ma wyłączone, a nie ma.

    Która to Atmega? Starsze mają tylko ten prymitywniejszy tryb, nowsze mają przerwania o wiele rozbudowane.
    Mamy na elektrodzie specjalny dział na mikrokontrolery

    3. Wywołanie funkcji z przerwań... "to zależy" jak bardzo jest tłusta, jak ma rozległe skutki (np czy modyfikuje zmienne globalne, czy na 8bitowcach zużywa dużo stosu itd). Koncepcyjnie podlega takiemu samemu rygorowi jak bezpośredni handler przerwania, a przez przegląd kodu tego nie widać. czasem coś można spieprzyć.

    Ramowo rzecz biorą następuje powrót "bez sensacji" - moja wypowiedź dotyczy przypadku jeśli funkcja coś nabroi.
REKLAMA