Non si vedeva "l'ora" di presentare questo terzo articolo del corso avanzato sul linguaggio C per Raspberry Pi. Esso, difatti, tratta di un importante argomento: come gestire la data e l'ora con i propri programmi. L'argomento è collocato esattamente a questo punto del percorso poiché esso è basato sull'utilizzo delle strutture, argomento studiato nella precedente puntata. Grazie all'accesso e alla gestione della data e dell'orario, si possono effettuare tutte quelle operazioni legate a questa tipologia di dati, come i calcoli temporali, le operazioni sulle date e sull'ora, le pause d'attesa, l'acquisizione del giorno, del mese e dell'anno e molte altre.
Interrogare e gestire la data e l'ora di sistema è un'operazione molto importante. La data e l'ora rappresentano, infatti, una tipologia di informazioni, automaticamente aggiornate dal sistema, utili in molti contesti. Il linguaggio C possiede alcune librerie e funzioni per gestirle al meglio ma nulla toglie, al programmatore, di realizzarne da sé, secondo le proprie esigenze.
Come il C tratta la data e l'ora
Il metodo utilizzato dal linguaggio C per trattare e gestire queste due importanti informazione è geniale e molto funzionale. Esso utilizza una variabile di tipo long (cioè a 4 bytes, 32 bits) che tiene conto del numero dei secondi trascorsi dal 1 gennaio 1970. In questa semplice maniera è facile calcolare qualsiasi altra data successiva (e precedente). Questo super numero è chiamato timestamp. Pertanto, se tale variabile, al momento teorica, avesse il valore 86400 vorrà dire che l'orologio del sistema segna le ore 00:00 del 2 gennaio 1970, dal momento che in un giorno sono contenuti proprio 86400 secondi. Così, allo stesso modo, se il timestamp contenesse il valore 864000, l'ora e la data del giorno sarebbero le 00:00 del 11 gennaio 1970. Ultimo esempio: un timestamp di 1234567890 corrisponderebbe alle 23:31:30 del 13 febbraio 2009.
A tale scopo basta cercare su Google la stringa "timestamp calculator" per ottenere centinaia di siti in grado di effettuare i calcoli da un particolare timestamp alla data e ora corrispondenti, e viceversa. Allo stato attuale, alcuni di questi servizi sono elencati di seguito:
- http://www.onlineconversion.com/unix_time.htm
- http://www.unixtimestamp.com/
- http://www.epochconverter.com/
- http://www.timestampconvert.com/
Si padroneggi con questa metodologia per comprendere come il sistema memorizzi qualsiasi ora e data grazie a questo numero speciale.
Il bug dell'anno 2038
Come abbiamo visto, il timestamp, ossia il numero di secondi trascorsi dal 1970, incrementa inesorabilmente ed arriverà il giorno in cui la variabile non riuscirà a contenere tale valore, perché esso diventerà troppo grande. Questa evenienza è detta overflow e si verifica quando un certo valore, per il suo elevato ammontare, non riesce ad essere rappresentato tramite i bytes per esso previsti dalla variabile. Come detto prima, il timestamp occupa 4 bytes, ossia 32 bits (signed) e con tali elementi si può rappresentare un valore massimo di (2^32)/2 = 2.147.483.648. Con tale grandezza il timestamp "traboccherà" esattamente (vedi figura 1) il 19 gennaio 2038 alle ore 3:14. Cosa succederà? Sicuramente non esploderà nulla ma i contatori dei computer considereranno negativo il conteggio segnando, come data di sistema, il 13 dicembre 1901. Un ritorno... al passato? Sicuramente no, a quell'epoca, i programmatori di sistemi operativi e di hardware riusciranno a risolvere brillantemente il problema. Basterebbe predisporre un timestamp a 64 bits (pari 8 bytes) per poter gestire un intervallo di quasi 600 miliardi di anni!
Visualizzare il timestamp: la funzione time()
Bene, vediamo di conoscere più da vicino il timestamp, realizzando un visualizzatore continuo. Con poche righe di codice si può realizzare il tutto. Ecco il programma, con il commento a seguire:
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 3186 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.
Avrei fatto un accenno anche a gettimeofday() che restituisce la struct timeval mto utilizzata in ambito microcontrollori.
Salve, questo corso è molto interessante ed io ho imparato moltissimo. Ho realizzato da poco un contapezzi e mi sono chiesta se nel corso è prevista una parte sulla gestione dell’interrupt con C e se è possibile anche gestire i grafici per i dati sempre attraverso il linguaggio C. Grazie
Salve, grazie dei complimenti. Siamo lieti che il corso sia di aiuto.
Purtroppo il corso non prevede una puntata specifica sugli interrupt. Tra qualche tempo uscirà un mio articolo che prevede l’uso degli interrupt per dei pulsanti da quiz, ma essi sono implementati con la scheda ESPertino.
Per quanto riguarda i grafici, certo che è possibile gestirli con il linguaggio C, il campo d’azione è immenso e le soluzioni sono infinite. La via più semplice è quella di esportare i dati elaborati su un normale file di testo delimitato e poi farlo importare a un foglio elettronico, per tirare fuori grafici e statistiche.
Saluti.