Dzień dobry,
mój problem jest następujący:
Napisałem task scheduler z wywłaszczaniem, zaprogramowałem na urządzenie (arduino uno programowane bezpośrednio przez isp(bez bootloadera). I dziwne rzeczy zaczynają się dziać gdy próbuję podzielić dwie zmienne typu uint32 (4 bajty).
Program (dzielenie) napisany jest w c, natomiast przerwanie w assemblerze. Inne operacje (działanie, inkrementacja, itp. itd) działają bez zarzutu.
Moja procedura przerwania (schedule) działa następująco:
* pushuje 32 rejestry na stos
* push SREG
* zapisuje stack pointer w tablicy
* wczytuje z tablicy stack pointer kolejnego tasku
* ustawiam wskaźnik stosu na stos kolejnego tasku
* pop SREG
* pop 32 rejestry
* RETI (do kolejnego tasku)
Oczywiście wcześniej przygotowuje odpowiednio stosy tasków. Kod przerwania:
Kod w c powodujący problemy:
val1/2/3 to zmienne uint32. Żadna z tych zmiennych nie jest używana poza taskiem (dopiero potem są one przepisywane do zmiennych volatile, które są używane w innym tasku).
ASM wygenerowany dla powyższego kodu w c:
Nie ma tu instukcji specyficznych tylko dla tej funkcji, nie mam pomysłu co może być źle. Nie mam też sprzętowego debuggera, żeby sprawdzić co się dzieje na uc, po prostu wszystkie wejścia przechodzą w stan niski - na wyświetlaczach 7 segment pojawiają się 8, jednak multipleksowanie chyba działa, ponieważ nic nie płonie (do uc podpiętych jest 8 cyfr).
Zastanawiam się, czy nie popełniam jakiegoś oczywistego błędu (brak zapamiętania jakiegoś rejestru z pamięci sram z ukrytym stanem) itp.
mój problem jest następujący:
Napisałem task scheduler z wywłaszczaniem, zaprogramowałem na urządzenie (arduino uno programowane bezpośrednio przez isp(bez bootloadera). I dziwne rzeczy zaczynają się dziać gdy próbuję podzielić dwie zmienne typu uint32 (4 bajty).
Program (dzielenie) napisany jest w c, natomiast przerwanie w assemblerze. Inne operacje (działanie, inkrementacja, itp. itd) działają bez zarzutu.
Moja procedura przerwania (schedule) działa następująco:
* pushuje 32 rejestry na stos
* push SREG
* zapisuje stack pointer w tablicy
* wczytuje z tablicy stack pointer kolejnego tasku
* ustawiam wskaźnik stosu na stos kolejnego tasku
* pop SREG
* pop 32 rejestry
* RETI (do kolejnego tasku)
Oczywiście wcześniej przygotowuje odpowiednio stosy tasków. Kod przerwania:
Kod: text
Kod w c powodujący problemy:
Kod: C / C++
val1/2/3 to zmienne uint32. Żadna z tych zmiennych nie jest używana poza taskiem (dopiero potem są one przepisywane do zmiennych volatile, które są używane w innym tasku).
ASM wygenerowany dla powyższego kodu w c:
Kod: text
Nie ma tu instukcji specyficznych tylko dla tej funkcji, nie mam pomysłu co może być źle. Nie mam też sprzętowego debuggera, żeby sprawdzić co się dzieje na uc, po prostu wszystkie wejścia przechodzą w stan niski - na wyświetlaczach 7 segment pojawiają się 8, jednak multipleksowanie chyba działa, ponieważ nic nie płonie (do uc podpiętych jest 8 cyfr).
Zastanawiam się, czy nie popełniam jakiegoś oczywistego błędu (brak zapamiętania jakiegoś rejestru z pamięci sram z ukrytym stanem) itp.
