Wpis z mikrobloga

#programowanie #c #mikrokontrolery #kinetis #cortex

Nosz kurde blaszka... Jak wrzucę takie coś, to w losowym miejscu program się wysypuje. Jak zakomentuję wszystko oprócz jednej linii inicjalizacji to wszystko działa godzinami. Program przechodzi przez tego ifa tylko raz.

if ( sekunda>0) {

MyRTCPtr = RTC1_Init((LDD_TUserData *)NULL, TRUE); /* Initialize the device, reset all RTC registers */

} else {

MyRTCPtr = RTC1_Init((LDD_TUserData *)NULL, TRUE); /* Initialize the device, preserve time settings */

}

Co ja robię nie tak :/
  • 16
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@mariuzpl:

w losowym miejscu program się wysypuje


nieskończona rekurencja albo pętla z alokacją pamięci lub przesuwaniem wskaźnika? Co robi RTCI_Init? Czym dokładnie się wysypuje? Nie masz debugera?

edyta: widzisz, że if i else robią to samo?
  • Odpowiedz
@badasq: Mam debuggera,procek wskakuje w **PE_DEBUGHALT();**

Jeżeli zamienię warunek na (0) to tez się nie wykrzacza.

Zmienna sekunda to volatile char i jest ustawiana na 0 przy
  • Odpowiedz
@badasq: co do if i else to widzę, w jednym przypadku powinno być false na końcu żeby korzystał z aktualnych wartości jeżeli RTC działało. Zmieniłem w ten sposób żeby sie upewnić że nie mam gdzies babola w związku z tym.

Możliwe, żeby program wykonał przy jednym sprawdzeniu warunku obie części ifa?
  • Odpowiedz
@mariuzpl: syntaktyka tego fragmentu kodu wydaje się w pełni poprawna, bez szerszego kontekstu raczej nikt nie jest w stanie ci pomóc. Z tego co piszesz ja bym sprawdził dokładnie RTC1_Init, musi mieć jakiegoś babola.
  • Odpowiedz
@badasq: Procesr dostaje sygnał Hard_Fault. ehh...

Jeżeli nie jest możliwa sytuacja, że przeleci przez obie części ifa to ja już nie wiem. Wiem, że RTC nie lubi podwójnej inicjalizacji... Poszukam informacji czy deinit kasuje licznik sekund. Jeżeli nie to dorzucę deinit przed każdym initem i zobaczymy
  • Odpowiedz
@mariuzpl: Jeśli masz wiele wątków to chyba możliwa jest sytuacja, że wykona się inicjalizacja, wejdzie if, wczyta wartość zmiennej do porównania, przerwanie zmieni wartość tej zmiennej, i dopiero potem if poleci na starej wartości przez co inicjalizacja wykona się drugi raz w kolejnym przebiegu. Jak masz jakąś konsole w tym co programujesz to wstaw pare printefów i zobacz co się tam dokładnie dzieje.

Ogólnie nie jestem specjalistą od programowania przy
  • Odpowiedz
@badasq: Dorzuciłem nową zmienną raz przepisującą ze zmiennej sekunda tuż przed ifem i dalej to samo.

Chyba skończy się na tym, że zegar będzie na zewnętrznym scalaku a nie wewnątrz procesora :/
  • Odpowiedz
@badasq: Idę spać. Analizując program krok po kroku mam wrażenie, że do sprawdza if, potem wykonuje dla prawdy, znowu sprawdza if (cofa się w programie) i znowu wykonuje dla prawdy i dopiero idzie dalej :|
  • Odpowiedz
@mariuzpl: Po co robisz if/else skoro w obu warunkach masz dokładnie ten sam kod? (albo ja jestem ślepy i nie widzę różnic) Jeśli masz optymalizację kodu, to wtedy kompilator jest w stanie to w ogóle wywalić.

Nie pamiętam dokładnie jak to jest z

char
ami, ale możliwe, że one domyślnie są bez znaku, więc proponuję zmienić
  • Odpowiedz
@almafater: Wspominalem już o kodzie wewnątrz if/else. Przy prawidłowym rozpisaniu (różniące się funkcje) jest to samo.

sekunda jest zmieniona na volatile int i nie pomogło.

Spróbuję zmienić durnazmienna na volatile, ewentualnie mogę ją deklarować jako stałą...
  • Odpowiedz