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

[stm32f4][przerwania] - Przerwania nie zawsze wykonują się poprawnie.

Meh05 22 Paź 2013 11:37 1980 9
  • #1 22 Paź 2013 11:37
    Meh05
    Poziom 9  

    Mam skonfigurowany I2C wraz z DMA do odbierania danych z sensorów.
    Inicjalizacja odbioru następuję z częstotliwością 100Hz i jest załączana przez timer, następnie standardowo w przerwaniach od I2C i DMA dane są odbierane.
    Konfiguracja jest prawidłowa, ponieważ gdy testuje odbiór danych podczas nieskończonej pustej pętli while w głównej funkcji main():

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Wszystko jest w porządku - czyli dane są odbierane prawidłowo.

    Jednak gdy w pętli while pojawi się jakiś algorytm np:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Wtedy komunikacja się gubi (nie dojdzie do końca, przez co I2C ma status 'busy')
    Oczywiście w algorytmie (jakas_funkcja() ) jest zawarta logika czysto matematyczna tylko z obliczeniami, nic tam cokolwiek związanego z komunikacją nie jest ustawiane. Jaka może być tego przyczyna? Może to mieć coś związanego z zarządzaniem pamięcią( przykładowo funkcje są za bardzo rozbudowane... ) ?

    0 9
  • #4 22 Paź 2013 12:49
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Którego stosu i czy aby na pewno tego co trzeba? Jeśli używasz moich plików (skrypt linkera, startup, itd.) to polecam ze zrozumieniem przeczytać opis powyżej rozmiarów stosów w skrypcie linkera.

    4\/3!!

    0
  • #5 22 Paź 2013 14:03
    Meh05
    Poziom 9  

    Twoich plików nie używałem. Szczerze mówiąc jestem raczej początkujący jeśli chodzi o mikrokontrolery. Do tej pory wystarczało mi:
    -konfiguracja mC i peryferiów i napisanie jakiegoś algorytmu obliczeniowego.
    Zarządzanie pamięcią nawet się nie tykałem (stosy, sterty itp).
    Jeśli chodzi o problem to zwiększyłem rozmiar stosu dwa razy i wygląda na to, że wszystko chodzi teraz. Nawiasem mówiąc czy tak o mogłem sobie to zrobić i nie wyniknął z tego jakieś problemy to nie wiem. W ogóle jak sprawdzać ile program potrzebuje stosu a ile sterty, albo kiedy nastąpi przepełnienie stosu, czy sterty?
    I przy okazji czy nauka c z jakieś książki dla windowsa (lub ewentualnie linuxa) wystarczy, żeby lepiej załapać c dla mikrokontrolerów? ( Nie chodzi mi o podstawy składni jak wskaźniki, struktury- takie rzeczy mniej więcej znam).

    0
  • #6 24 Paź 2013 00:12
    dziechu
    Poziom 27  

    Jeżeli nie chodzi Ci o podstawy C, to książka dla win czy linuxa ma się nijak do programowania mikrokontrolerów. Programowanie mikrokontrolerów to w dużym stopniu znajomość i umiejętność obsługi peryferiów, czyli sprzętu. Z reguły (przynajmniej w moim przypadku) najwięcej kłopotów i błędów pojawia się właśnie przy odpowiedniej konfiguracji i funkcjach obsługi peryferiów, reszta to już sama zabawa. Tych zagadnień nie ma w książkach dla win. Poza tym faktem jest że książek o programowaniu STM32 w C jest kilka i nie są one zbyt wiele warte. Przykłady tam zamieszczane, podobnie jak większość przykładów 'firmowych' czy z internetu są oparte na bibliotekach SPL, które bardzo utrudniają analizę programu i naukę ustawień, konfiguracji itd.

    0
  • #7 24 Paź 2013 00:35
    94075
    Użytkownik usunął konto  
  • #8 24 Paź 2013 11:02
    dziechu
    Poziom 27  

    Ale wręcz przeciwne do czego? Bo napisałem że książki do win się nie nadają, a i te dla STM32 są do niczego, więc - jak można się domyśleć - pozostaje dokumentacja procesora.

    0
  • #9 24 Paź 2013 14:25
    Meh05
    Poziom 9  

    Dzięki za odpowiedzi. Póki co podszkolę się jeszcze z c dla win (głównie chodzi o zarządzanie pamięcią) a dalej zobaczymy.

    0
  • #10 24 Paź 2013 14:31
    BlueDraco
    Specjalista - Mikrokontrolery

    Akurat "zarządzanie pamięcią" pod Windows ma niewielki związek z programowaniem mikrokontrolerów, podobnie jak typowe struktury programów, które pisze się na komputery osobiste.

    Podszkol się lepiej z przerwań i pisania programów w konwencji automatów.

    0