Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 10 kwi 2026, o 08:42


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 11 paź 2015, o 16:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 cze 2014
Posty: 47
Pomógł: 0

Witam, jakiś czas temu wysypał się mój zegar NTP. Szukając przyczyny problemów natrafiłem na bardzo ciekawą rzecz. Metodą komentowania kolejnych linii kodu doszedłem, że problem leży w zdarzeniu od NTP, które wcześniej działało bez problemów. Schodząc głębiej spotkałem jeszcze większe dziwy - procek blokował się nie w pętli ani inny podejrzanym miejscu, ale tu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Wewnątrz funkcji client_ntp_process_answer z biblioteki tuxgraphic, przy operacji która, przynajmniej według mojej wiedzy, nie ma prawa nic blokować.
Dodam jeszcze, że taka sytuacja zdarzyła się wcześniej kilka razy, ale wtedy wystarczyło na chwilę wyłączyć zasilanie i wszystko ruszało.
Widział któryś kolega kiedyś takie cuda?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 paź 2015, o 20:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 18 maja 2014
Posty: 126
Pomógł: 12

Sprawdzałeś czy nie brakuje Ci stosu?

_________________
Pozdrawiam, Adrian.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 paź 2015, o 15:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 cze 2014
Posty: 47
Pomógł: 0

To raczej nie jest problem. Tzn. przy starym stanie ramu(83,6%) mogło tak być, zwłaszcza że mam dość pamięciożerne funkcje, ale teraz zjechałem do 64,4% i dalej to samo.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 paź 2015, o 15:57 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

W czystym projekcie spróbuj tą konwersję zrobić rzutując na wskaźnik 32-bitowy albo z użyciem unii tablicy i zmiennej 32-bitowej. Porównaj kod asemblerowy np.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Daje od nopa do nopa:
Składnia: [ Pobierz ] [ Ukryj ]
język bash
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Autor postu otrzymał pochwałę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 paź 2015, o 19:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 cze 2014
Posty: 47
Pomógł: 0

Sprawdziłem oba warianty, i przy obu działało, tyle że na wyjściu otrzymywałem jakieś głupoty. Co synchronizację była zupełnie inna godzina.
Najpierw myślałem, że to przez zwykłe niedopatrzenie - 52 zamiast 0x52, ale po zmianie(i czyszczeniu projektu) nic się nie zmieniło. Na koniec, w akcie desperacji zakomentowałem nowy kod i odpaliłem na powrót to co było. I teraz najlepsze - ruszyło od strzała jak trzeba :shock: Na razie działa, jakby znowu coś się walnęło to dam znać. I dzięki Krauser za pomoc, nie wiem jak, ale twoje metody chyba uzdrowiły ATmege :D.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 paź 2015, o 19:25 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

robi99956 napisał(a):
Co synchronizację była zupełnie inna godzina

Znaczy, że rzutowanie nie przejdzie, ale w tablicy można zamienić kolejość:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 paź 2015, o 22:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 18 maja 2014
Posty: 126
Pomógł: 12

Nie przejdzie, bo kolega trzyma dane w buforze od najstarszego bajtu (big endian) a AVRy są "little endian". Tak mi jeszcze przyszło do głowy pytanie. Przestawiasz gdzieś jeszcze w kodzie ten wskaźnik "time"?

_________________
Pozdrawiam, Adrian.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2015, o 07:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 cze 2014
Posty: 47
Pomógł: 0

Nie, to jest argument funkcji z biblioteki tuxgraphic. Używam go tylko w tym miejscu. A po drodze to wygląda tak:
1. Jest sobie globalna struktura w której trzymam wszystkie dane o czasie.
2. Wskaźnik do tej struktury jest przekazywany do zdarzenia od NTP.
3. W tym zdarzeniu wskaźnik do pola struktury z czasem unixowym idzie do funkcji bibliotecznej (tak - &czas->czas_unix)
Zauważyłem jeszcze jedną rzecz, otóż dekodowanie z odwróconymi bajtami nie wiesza systemu, efekt jest taki sam przy unii i rzutowaniu. Natomiast ręczne składanie i odwrócona unia dają efekt w postaci zawieszenia.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2015, o 19:42 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Federerer napisał(a):
Sprawdzałeś czy nie brakuje Ci stosu?
Cytuj:
To raczej nie jest problem.

W Greenbooku Mirek opisuje jak monitorować stos, a na płycie jest oczywiście kod programu. To, że po kompilacji masz pokazane użycie pamięci na poziomie 64% oznacza tylko tyle, że zmienne globalne tyle zajmują. Sprawdź sobie co zmieni zdefiniowanie dużej tabeli przed funkcją main i w funkcji main. Ta tablica buf jest raczej duża wnioskując po buf[0x52]

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 paź 2015, o 09:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 cze 2014
Posty: 47
Pomógł: 0

Wiecie co koledzy? Należą się wam przeprosiny. Problem nie leżał w tym miejscu. Dziś wrzuciłem projekt na zestaw ATB, i sytuacja się powtórzyła. ATmega1284 automatycznie wyklucza wszelkie problemy ze stosem, więc zacząłem szukać gdzie indziej. Okazało się, że w funkcji wykonującej korekcję czasu do odpowiedniej strefy czasowej wkradła się potencjalna pętla nieskończona. Zakomentowanie składania czasu unixowego sprawiało, że jej warunek był zawsze fałszywy, więc nie powodowała wtedy problemów. Na razie wygląda na to, że wszystko jest OK, ale to potwierdzi dopiero dłuższa obserwacja. Dzięki wam obu za zainteresowanie sprawą i mam nadzieję, że taka sytuacja się nie powtórzy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Majestic-12 [Bot] i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO