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



Teraz jest 13 gru 2024, o 21:32


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
 Tytuł: NTP client
PostNapisane: 7 lis 2011, o 09:00 
Offline
Nowy

Dołączył(a): 06 paź 2011
Posty: 24
Pomógł: 0

Witam!!!
Uruchomiłem kod NTP clienta pobrany z tuxgraphics.com używając karty sieciowej ATB oraz zestawu testowego ATB.
Nie potrafię rozgryść wywołania poniższej funkcji ( co to za dziwoląg?):
Kod:
minutes=gmtime(time+(int32_t)-360*(int32_t)hours_offset_to_utc,day,clock);

oto ciało funkcji:
Kod:
uint8_t gmtime(const uint32_t time,char *day, char *clock)
{
        char dstr[4];
        uint8_t i;
   uint32_t dayclock;
        uint16_t dayno;
   uint16_t tm_year = EPOCH_YR;
   uint8_t tm_sec,tm_min,tm_hour,tm_wday,tm_mon;

   dayclock = time % SECS_DAY;//godzin w danym dniu
   dayno = time / SECS_DAY;//dni

   tm_sec = dayclock % 60UL;//sekund w danym dniu
   tm_min = (dayclock % 3600UL) / 60;
   tm_hour = dayclock / 3600UL;
   tm_wday = (dayno + 4) % 7;   /* day 0 was a thursday */
   while (dayno >= YEARSIZE(tm_year)) {
      dayno -= YEARSIZE(tm_year);
      tm_year++;
   }
   tm_mon = 0;
   while (dayno >= monthlen(LEAPYEAR(tm_year),tm_mon)) {
      dayno -= monthlen(LEAPYEAR(tm_year),tm_mon);
      tm_mon++;
   }
        i=0;
        while (i<3){
                dstr[i]= pgm_read_byte(&(day_abbrev[tm_wday*3 + i]));
                i++;
        }
        dstr[3]='\0';
   sprintf_P(day,PSTR("%s %u-%02u-%02u"),dstr,tm_year,tm_mon+1,dayno + 1);
   sprintf_P(clock,PSTR("%02u:%02u:%02u"),tm_hour,tm_min,tm_sec);
        return(tm_min);
}


funkcja przyjmuje 3 argumenty:
1. Zmienna uint32_t time.
2. Wskaźnik na string day.
3. Wskaźnik na string clock.


1. Jak rozszyfrować pierwszy argument funkcji??

time+(int32_t)-360*(int32_t)hours_offset_to_utc

2. Co nam daje dopisanie do wartości UL, np. 3600UL

czym ten zapis różni się od 3600??

pozdrawiam
smalski

_________________
smalski



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: NTP client
PostNapisane: 7 lis 2011, o 12:32 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27317
Lokalizacja: Szczecin
Pomógł: 1041

Na początek to chyba się koledze coś pomyliło (chyba literówka) ale w tym:

minutes=gmtime(time+(int32_t)-360*(int32_t)hours_offset_to_utc,day,clock);

nie może być znaku MINUS pomiędzy (int32_t)-360 a liczbą 360 - to tak dla ścisłości\

ad.1) .... to jest konwersja czasu z uwzględnieniem przesunięcia UTC

ad.2) ... no to jest wyjaśnione w książce ;) UL oznacza, że chcemy aby kompilator potraktował liczbę poprzedzającą ten zapis jako Unsigned Long

Po wyjaśnieniu wyżej chyba już wiadomo czym będzie się różnić liczba 3600 od 3600UL czy nie? dla pewności podpowiem, że bez UL będzie przechowywana w dwóch bajtach bo przecież mieści się w zakresie 0-65535 a w drugim przypadku będzie przechowywana i brana do obliczeń jako unsigned long czyli będzie zapisana na 4 bajtach - a to chyba spora różnica prawda?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: NTP client
PostNapisane: 7 lis 2011, o 13:10 
Offline
Nowy

Dołączył(a): 06 paź 2011
Posty: 24
Pomógł: 0

To, że jest to konwersja czasu to ja wiem:)

minutes=gmtime(time+(int32_t)-360*(int32_t)hours_offset_to_utc,day,clock);

tylko co robią te zwroty (int32_t)??Interesuje mnie zrozumienie pierwszego argumentu.
a minus jest w kodzie, zwrot skopiowałem z kodu źródłowego.

UL-dzięki, znowu przeoczyłem w książce:)

kod:
Kod:
void print_time_to_lcd(void)
{
        char day[16];
        char clock[16];
        uint8_t minutes;

        // returns day and time-string in seperate variables:
        minutes=gmtime(time+(int32_t)-360*(int32_t)hours_offset_to_utc,day,clock);<<<<<<<<<<----------- TU
        if (prev_minutes!=minutes){
                // update complete display including day
                lcd_clrscr();
                lcd_gotoxy(0,1);
                lcd_puts(day);
                // update complete display
        }
        // write first line
        lcd_gotoxy(0,0);
        lcd_puts(clock);
        lcd_puts_P(" (");
        if (hours_offset_to_utc>=0){
                lcd_puts_P("+");
        }
        itoa(hours_offset_to_utc,gStrbuf,10);
        adddotifneeded(gStrbuf);
        lcd_puts(gStrbuf);
        lcd_puts_P(")");
        // write to first line
        lcd_gotoxy(15,0);
        lcd_putc(lindicator);
        prev_minutes=minutes;
        // before every hour
        if (minutes==57 && update_at_58_avoid_duplicates==0){
                client_gw_arp_refresh();  // causes a refresh arp for the GW mac
                update_at_58_avoid_duplicates=1;
        }
        if (minutes==58 && update_at_58_avoid_duplicates==1){
                // mark that we will wait for new
                // ntp update
                haveNTPanswer=2;
                send_ntp_req_from_idle_loop=1;
                update_at_58_avoid_duplicates=2;
        }
        // we need this update_at_58_avoid_duplicates variable
        // otherwise we will send every second an arp or ntp request
        // in that minute
        if (minutes<56){
                update_at_58_avoid_duplicates=0;
        }
}


smalski

_________________
smalski



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: NTP client
PostNapisane: 7 lis 2011, o 13:15 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27317
Lokalizacja: Szczecin
Pomógł: 1041

(int32_t)360 hmm można powiedzieć że to robić coś podobnego niejako do tego UL ;) tzn mówimy kompilatorowi, że chcemy aby potraktował liczbę 360 jako 32bitową liczbę ze znakiem. Prawidłowo nazywa się to "rzutowanie typów" w języku C.

Ale jeśli tam jest minus to coś chyba jest nie tak - i zdaje się, że nie powinno się to skompilować ;)

aaaaa nie !!! zaraz - no przecież,

(int32_t)-360

to po prostu rzutowanie ujemnej liczby -360 na ujemną liczbę 32bitową ze znakiem ;) bo domyślnie bez rzutowania kompilator robi promocję typów do 16bitowych. A tu zdaje się wszystkie obliczenia muszą być przeprowadzone na 32 bitowych ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: NTP client
PostNapisane: 7 lis 2011, o 13:20 
Offline
Nowy

Dołączył(a): 06 paź 2011
Posty: 24
Pomógł: 0

No i wszystko jasne!!!
Dziękuję

_________________
smalski



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: 5 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


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