Il modo migliore per modellare ora e delta UTC in C incorporato

3

Mi sto preparando a lavorare su un prototipo di firmware incorporato che ha un chip GPS collegato (dritto su un braccio0, senza sistema operativo).

Sono distrutto su come modellare istanti e time delta UTC. Tradizionalmente in C, sceglievo solo una risoluzione e un'epoca offset e modellistica con numeri interi "abbastanza grandi", ma non mi preoccupavo di UTC, ma solo di un riferimento temporale interno.

Ultimamente, ho lavorato un po 'su Swift / Kotlin / Python3, e mi sono ritrovato a chiedermi se non sarei stato meglio servito costruendo una rappresentazione leggera di ordine superiore di istantaneo e delta in C. Qualcosa in cui avevo una struttura distinta per ogni entità, e ha scritto alcune funzioni per fare la matematica di cui ho bisogno tra loro.

Ciò richiederebbe un po 'più di tempo (da sviluppare), ma probabilmente mi darà un po' più di sicurezza (tipo).

Immagino di essere curioso di sapere come hanno fatto gli altri che hanno dovuto modellare le ore UTC in C incorporato. Dovrei andare con il classico modello intero offset / epoca? Oppure modello con le strutture effettive?

(Non sono molto preoccupato per le prestazioni per questo)

Chiarimento?

Un sacco di processi incorporati devono misurare il tempo o fare le cose in determinati momenti. Ho fatto un sacco di quelli. Una sorta di contatore di systick rolling è la tua base di tempo, e fai matematica contro di essa. L'unico vero inconveniente che ho trovato nel corso degli anni è che è possibile avere bug relativi alle differenze semantiche tra un marcatore temporale (un istante che si verifica sul contatore del tempo) e una durata o un delta, tra due di questi tempi . Poiché entrambi sono (u) inte, è facile mescolare i due senza avvisi.

La parte difficile qui è l'introduzione del GPS. I tempi GPS NMEA sono nei valori del campo UTC (ad esempio yymmdd, hhmmss). Mentre l'UTC elimina l'incubo TimeZone, non si sbarazza di cose come gli anni bisestili. Quindi, al minimo, devo implementare la matematica per nascondere i valori dei campi in un offset di secondi, e quindi correlarli / mapparli con il contatore del tempo locale. Questo ha portato alla domanda: se devo farlo comunque, perché non andare fino in fondo. Il mio obiettivo è pianificare che le cose accadano in determinati orari UTC.

    
posta Travis Griggs 29.09.2018 - 01:36
fonte

2 risposte

2

Best way to model UTC time and deltas

Cerca gli standard per guidarti.

ISO 8601 tratta molti dei problemi che riguardano sia i timestamp che i delta temporali.

Anche se è principalmente correlato alla presentazione dell'ora testuale, il formato del tempo come testo si riferisce direttamente alle strutture di dati in C.

Tempo di parete e ora di orologio.

L'ora sul muro è un'idea condivisa su scala mondiale di che ore sono quando è UTC.

Il tuo dispositivo incorporato ha semplicemente bisogno di un conteggio clock ad un certo livello e, a meno che tu non abbia registrato i dati nella memoria non volatile, può iniziare da 0 ogni volta che le unità si accendono.

La relazione tra il tempo di parete e l'orologio di solito è solo un offset e una scala. La bilancia può essere assunta fissa, calibrata in fabbrica o ricalibrata sporadicamente. offset , questa è la parte difficile, poiché il codice deve sincronizzarsi con il mondo esterno obbliga lo scambio di informazioni almeno una volta.

Semplicità

My goal is to schedule things to happen at certain UTC times.

Userei l'idea di UTC locale per la pianificazione. Questa è la migliore comprensione dell'UTC del tuo processore, che potrebbe andare alla deriva nel tempo con quella reale. A volte, potrebbe richiedere la sincronizzazione - essere prepreparati per questo. Il codice può utilizzare unità convenienti (anziché secondi) per il processore come la frequenza di clock e int64_t . Questo approccio lineare semplificherà la pianificazione. Le traduzioni YMDhms da / a your_time_t devono avvenire solo quando si comunica all'esterno del processore (verso persone o altre macchine).

    
risposta data 02.10.2018 - 23:47
fonte
0

This would require a little more time (to develop), but possibly give me a little more (type) safety.

Questo è il cuore del compromesso e nessuno può rispondere per te perché dipende dal tuo caso d'uso:

  • Se stai facendo lotti di manipolazione del tempo, è probabilmente meglio scrivere la libreria. Dovresti avere molte routine che interagiscono con il tempo in modi diversi.
  • Se interagisci solo con il tempo un po '(principalmente solo' misura del tempo trascorso '), dovresti semplicemente usare int e andare avanti. Se si ha tempo in un secondo momento, è sempre possibile retrocedere e riformattare il codice in una libreria con una struttura. Ma è più probabile che altre parti del tuo programma attirino la tua attenzione, quindi il tempo speso per scrivere una libreria di tempo causerà solo ritardi per altre parti.

Rilevante anche: Questo articolo ha alcune osservazioni interessanti sui diversi usi di tempo.

    
risposta data 30.09.2018 - 20:32
fonte

Leggi altre domande sui tag