eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaZagwozdka w C Keil. › Re: Zagwozdka w C Keil - wyjaśnienie.
  • Data: 2019-02-13 11:28:08
    Temat: Re: Zagwozdka w C Keil - wyjaśnienie.
    Od: "J.F." <j...@p...onet.pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    Użytkownik "Irek.N." napisał w wiadomości grup
    dyskusyjnych:q3vee4$o74$...@n...news.atman.pl...
    >Na wstępie małe usprawiedliwienie - procedura była napisana na 8051 i
    >uruchomiona na jednym z pierwszych PLC jakie zrobiłem, w latach 90,
    >ale stosowana też później*. W tamtych czasach wydawało mi się, że
    >ogarniam podstawy C :)

    >W maszynie którą diagnozowałem definicja zmiennej DEL_STEP była o
    >zgrozo jako unsigned char. Nie zwróciłem na to uwagi, choć
    >zauważyłem, że sprawdzany jest tylko młodszy - przekazany - bajt
    >zmiennej z którą wywołano funkcję. Wygląda więc na to, że kompilator
    >miał rację.

    uzyc niewlasciwy typ - zdarza sie.
    Ale nie spojrzec jaki to typ przy sprawdzaniu/szukaniu bledu ... czas
    na lecytyne :-)

    >Po zmianie definicji na unsigned int kompilator robi OLR na obu
    >połówkach zmiennej DEL_STEP a następnie sprawdza czy wynik operacji
    >jest zerowy. Bardzo ładne rozwiązanie moim zdaniem.

    Typowe.

    >Zrobiłem jeszcze jedną rzecz. Ponieważ jak zauważyliście, nie ma
    >gwarancji, że sprawdzenie 16 bitów będzie poprawne w przypadku gdy
    >przerwanie może je zmienić, podłączyłem oscyloskop, persystencję na
    >nieskończoną i obserwowałem czas generowany przez procedurę. Zdarzały
    >się błędnie odliczone interwały, ale nie za często.

    Czyli potrafi przerwanie trafic miedzy dwie instrukcje ?
    No w sumie - zawsze miedzy dwie trafia, tylko kwestia
    prawdopodobienstwa, kiedy trafi miedzy dwie istotne.

    A tych instrukcji przy ORL byc moze nawet wiecej.

    >Zrobiłem jak Mateusz podpowiedział - flaga w przerwaniu modyfikującym
    >zmienną. Nie złapałem żadnego błędnego odliczenia.

    Rozumiem, ze najpierw zmieniles typ zmiennej na int ?

    Ale nie bardzo rozumiem - przerwanie ustawia flage, modyfikuje
    zmienna, gasi flage ?
    na przetwarzanie w procesie głownym nie ma to znaczenia - sprawdzi
    sobie, ze flagi nie ma, zacznie czytac zmienna ... i tu przerwanie
    przychodzi.
    Co innego gdy uzywa zmiennej przerwanie wyzszego poziomu.

    Ja bym tam wylaczyl przerwania na czas sprawdzenia, to raptem kilka
    instrukcji, ale w pojedynczym while zaprogramowac to trudno.

    A swoja droga - czy Keil sam ich nie wylacza ? Dla zmiennych volatile
    powinien.

    >* w późniejszych wersjach kodu (trochę inna wersja PLC) już była
    >poprawna definicja jako typ 16 bitowy, czyli kiedyś to zauważyłem,
    >poprawiłem i zapomniałem :(

    Ale o co chodzi - powiekszyles wartosc opoznienia ponad 255, i sie
    okazalo, ze nie czeka tyle co powinien ?

    J.

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: