GNU/Linux >> Znalost Linux >  >> Linux

Datum v milisekundách na Openwrt na Arduino Yun?

Používám OpenWRT na Arduino YUN a snažím se získat přesné datum v milisekundách (DD/MM/RRRR h:min:sec:ms) získáním času časovým serverem.

Bohužel date +%N vrátí pouze %N , ale ne nanosekundy. Slyšel jsem +%N není zahrnuto v datu OpenWRT.

Existuje tedy nějaký způsob, jak získat datum (včetně milisekund), jak ho chci?

Přijatá odpověď:

Na OpenWRT date je busybox , který má omezení, ale toto není striktně jedno z nich. Základním problémem je, že knihovna libc (uClibc) nepodporuje toto rozšíření GNU strftime. (Ačkoli ani glibc, více o tom níže.)

Měli byste mít lua ve výchozím nastavení, ale to nepomůže bez některých dalších nevýchozích modulů.

hwclock volá gettimeofday() pro porovnávání/nastavení RTC (hardwarové hodiny), ale nebude mít na výstupu subsekundové rozlišení (přístup k RTC může být dostatečně pomalý, takže stejně nemusí být užitečný). Kromě toho OpenWRT poskytuje pouze staré rdate , který má pouze celosekundové rozlišení.

Zdá se, že neexistuje žádný přímý způsob, jak získat přesné časové razítko přímo z /proc , nejužitečnější časové razítko je v /proc/timer_list (3. řádek), což je doba provozuschopnosti v nanosekundách (rozlišení bude záviset na platformě).

Pokud byl váš busybox vytvořen pomocí CONFIG_BUSYBOX_CONFIG_ADJTIMEX set, pak byste měli být schopni použít adjtimex pro čtení hodin jádra (i když si uvědomte, že verze busybox má obě různé argumenty a jiný výstup do standardního adjtimex.

Normální verze, adjtimex -p , poslední řádek výstupu:

   raw time:  1416419719s 146628us = 1416419719.146628

Verze Busybox, adjtimex (bez -p !), poslední 3 řádky:

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

Goldilocks's je skvělé řešení, za předpokladu, že máte nastavení OpenWRT cross build (důrazně doporučujeme!).
Vaše coreutils-date řešení funguje, protože zatímco coreutils si je vědom glibc, není to výhradně glibc. Dodává se s vlastní samostatnou implementací strftime (odvozeno z glibc) a používá to k uzavření (prostřednictvím strftime_case() ) základní strftime tak, aby podporoval různá rozšíření (a jinak se vrátí k verzi uClibc).

Dokonce ani glibc (až do aktuální verze 2.23) nepodporuje %N , coreutils strftime() odvozené z kanonické verze glibc přidává %N a %:z a několik dalších změn. Variace a opravené verze strftime() přetékají (včetně verzí v bash a gawk).

Související:Jak zkontrolovat, jaké signály proces poslouchá?
Linux
  1. Jak zobrazit datum a čas restartu systému Linux

  2. Příkaz k získání času v milisekundách

  3. Najděte soubory vytvořené v určitém časovém období

  1. linux-shell:přejmenování souborů na čas vytvoření

  2. Nastavte systémové datum a čas pomocí C++ v Linuxu

  3. Nastavte relativní čas pomocí příkazového řádku

  1. Linux – Jak zjistit datum vytvoření souboru?

  2. Existuje alternativní funkce spánku v C až milisekundy?

  3. Jak získat formátovaný datum a čas v pythonu