Wpis z mikrobloga

Nie mam już pomysłu co jest nieteges i jakim hasłem wołać wyszukiwarkę :/ Mirko jeszcze nigdy nie zawiodło!

Używam w kodzie SysTick, w którego przerwaniu inkrementuję zmienną uint32. Ta zmienna ma służyć jako flaga wykonania regulacji, a konkretniej ma zastąpić wywoływanie funkcji timerem.
Teoretycznie wszystko działa, zmienna w każdym przerwaniu jest coraz większa, ale w momencie kiedy ma wartość 999 cały program zawiesza się/przestaje inkrementować jakby SysTick przestał działać.
Warunek wykonania funkcji mam na równej wartości 1000 (ms), więc w obecnym przypadku kod się nie wykona i zawiesi. Jak zmniejszę warunek o np. 100 to funkcja wykona się, ale tylko raz. SysTick zacznie inkrementację ponownie, dobije do 99 i stanie.
Zmienna inkrementowana jest volatile (bo obsługiwana w przerwaniu i w zwykłym kodzie) i z racji udostępniania jej w kilku miejscach deklaruję ją z extern.

Co mogę robić nie tak? ( ͡° ʖ̯ ͡°)

#embedded #arm #programowanie #jezykc
  • 20
@zwei: a, fakt, nie opisałem tego. Debuggera nie ma. Mam przykaz na jak najbardziej bare metal, moim debuggerem jest UART.
No i z racji, że nie jest to projekt amatorski, a praco-dydaktyczny, to nie mogę go udostępniać, bo będzie przypał :(
@zwei: LPC11xx, w środku ARM M0. Nie mam debuggera, nie używam nawet IDE. Sam edytor tekstu, kompilator i make, a po stronie sprzętowej międzymordzie USB-UART do komunikacji i programowania.
Dobra, pokopiuję co najważniejsze części do jakiegoś jednego mikromaina. Nie będzie się to kompilowało, ale będzie kod.
@macgajster: no chwila, to jest ARM, więc ma interfejs SWD, a czymś to musisz programować, więc pewnie masz programator, który najprawdopodobniej jest również debuggerem skoro komunikuje się po SWD (no chyba, że tam rzeczywiście jest jakiś inny interfejs). ARM z pakietem arm-gcc udostępnia też gdb, więc na mój gust to powieneś mieć możliwość debugowania. No chyba, że się mylę, ale na twoim miejscu bym jednak poszukał jak podłączyć gdb do
Pierwsze co bym sprawdził na przykład diodą, to czy przerwanie nadal działa, czy stoi. Jeżeli udostępniasz licznik w kilku miejscach, to może być coś na rzeczy. Ale to tylko spekulacje. Jeśli na nic nie wpadniesz, pobierz sobie uVision tam masz symulator procka i możesz debugować proste programy bez debugera.
@Agent_Dijkstra: zaraz sprawdzę ledem, bo mam na płytce.
Właśnie funkcja działa spoko, bo wywoływana przez przerwanie timera chodzi bez problemu godzinami.
Szukałem czegoś na temat "blokowania się" zmiennej na danej wartości typu "przed 100" czy "przed 1000" i jedyne co to był brak volatile, który u mnie jest.
@Agent_Dijkstra: na LPC pluję jadem odkąd zacząłem programować. Dokumentacja nie do końca wszystko mówi, ogólnie to jakby NXP miał to gdzieś. Forum przeniesione po kilka razy i albo stare posty bez rozwiązań albo 404.
Po gitach szukając znalazłem jakieś przykłady, jest nawet jeden systick wykorzystujący to do robienia delaya. To chyba jedyna opcja żeby sprawdzić hw :/
@Agent_Dijkstra: akurat tych przykładów nie widziałem. Ściągnąłem kiedyś cały zestaw przykładów z CMSIS i na tym bazując przed chwilą odpaliłem i zostawiłem na trochę migającego leda zrobionego na delayu z SysTick - działa.
Wiesz co... jak jakieś peryferium odpalałem to za rozwiązaniem dotarłem do japońskiego forum i dopiero tam znalazłem informację co odpalić żeby zaczęło działać ;)

Co do takiego mocno ograniczonego to chyba bardziej jestem w stanie się przyzwyczaić niż
@zwei: @Agent_Dijkstra: znalazłem. Przerwanie timera 16B0 powoduje zwieszenie procka. Po modyfikacji pod SysTick została mi cała konfiguracja timera razem z jej wywołaniem i choć nie wykorzystywałem samego timera to wypluwał przerwanie.
Dlaczego tak jest to nie wiem, mam nadzieję, że nie przyda się już dalej ten timer ( ͡° ͜ʖ ͡°)