GNU/Linux >> Linux Esercitazione >  >> Linux

Data in millisecondi su Openwrt su Arduino Yun?

Sto usando OpenWRT su Arduino YUN e sto cercando di ottenere la data esatta in millisecondi (GG/MM/AAAA h:min:sec:ms) ottenendo l'ora da un timeserver.

Sfortunatamente date +%N restituisce solo %N , ma non i nanosecondi. Ho sentito +%N non è incluso nella data di OpenWRT.

Quindi c'è un modo per ottenere la data (inclusi i millisecondi) come voglio?

Risposta accettata:

Su OpenWRT, date è busybox , che ha dei limiti, ma questo non è strettamente uno di questi. Il problema di fondo è che la libc (uClibc) non supporta questa estensione GNU strftime. (Anche se nemmeno glibc lo fa, ne parleremo più avanti.)

Dovresti avere lua per impostazione predefinita, ma ciò non aiuterà senza altri moduli non predefiniti.

hwclock chiama gettimeofday() per confrontare/impostare l'RTC (orologio hardware), ma non produrrà una risoluzione inferiore al secondo (l'accesso agli RTC può essere sufficientemente lento da non essere comunque utile). A parte questo, OpenWRT fornisce solo l'antico rdate , che ha solo una risoluzione al secondo intero.

Non sembra esserci un modo semplice per ottenere un timestamp accurato direttamente da /proc , il timestamp più utile è in /proc/timer_list (3a riga) che è il tempo di attività in nanosecondi (la risoluzione dipenderà dalla piattaforma).

Se la tua busybox è stata creata con CONFIG_BUSYBOX_CONFIG_ADJTIMEX set, dovresti essere in grado di usare adjtimex per leggere l'orologio del kernel (sebbene si noti che la versione busybox ha entrambi argomenti diversi e output diverso rispetto allo standard adjtimex.

Versione normale, adjtimex -p , ultima riga di output:

   raw time:  1416419719s 146628us = 1416419719.146628

Versione Busybox, adjtimex (senza -p !), ultime 3 righe:

   [...]
   time.tv_sec:  1416420386
   time.tv_usec: 732653
   return value: 0 (clock synchronized)

Quella di Goldilocks è un'ottima soluzione, supponendo che tu abbia la tua configurazione di build incrociata OpenWRT (altamente consigliata!).
La tua coreutils-date la soluzione funziona perché mentre coreutils è a conoscenza di glibc, non è esclusivamente glibc. Viene fornito con la propria implementazione autonoma di strftime (derivato da glibc) e lo usa per concludere (tramite strftime_case() ) il sottostante strftime in modo da supportare varie estensioni (e in caso contrario tornare alla versione uClibc).

Anche glibc (fino all'attuale 2.23) non supporta %N , le coreutils strftime() derivato dalla versione canonica di glibc aggiunge %N e %:z e poche altre modifiche. Variazioni e versioni con patch di strftime() abbondano (comprese le versioni in bash e gawk).

Correlati:come verificare quali segnali sta ascoltando un processo?
Linux
  1. Esiste una funzione di sospensione alternativa in C in millisecondi?

  2. Come ottenere la data e l'ora formattate in Python

  3. Comando per ottenere il tempo in millisecondi

  4. Trova i file creati tra un intervallo di date

  5. linux-shell:ridenominazione dei file al momento della creazione

Come trovare la data e l'ora di installazione del sistema operativo Linux

11 Esempi utili di comandi data di Linux

Come impostare data e ora su Linux

L'indicatore dell'ora non mostra la data/l'ora?

Esempi di comandi data di Linux

Come modificare data, ora e fuso orario in Linux Mint 20