• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Синхронизация часов.

nikolz

Well-known member
Провел измерения относительной синхронизации системных часов двух ESP.
---------------------------------
В результате могу предложить метод повышения точности синхронизации примерно на два порядка.
Метод основан на учете систематическиой погрешности часов.
-----------------------------------
Например, для исследованных мною двух ESP функция систематической ошибки имеет вид
E(мкс)=6071 +53.3*T(сек)
Если время, получаемое от системных часов синхронизированного ESP ,
скорректировать на величину ошибки E,
то уравнение ошибки скорректированного времени имеет вид E = 0.0993*x - 0.0565.
===========================
Вот некоторые примеры получаемой погрешности синхронизации
----------------------
Пример 1:
Предположим, что мы синхронизируем часы двух ESP с интервалом 100 мс.
Будем считать, что в момент синхронизации ошибка равна нулю.
Из уравнения E(мкс) следует, что в конце интервала 100 мс, ошибка составит 5.3 мкс.
Если мы применим данный способ компенсации систематической ошибки,
то остаточная ошибка синхронизации составит 0.01 мкс.
------------------------------------
Пример 2:
Предположим, что в момент включения двух ESP мы синхронизируем их через провод, что обеспечивает нулевую ошибку начальной синхронизации.
После этого никакой синхронизации не делается, кроме коррекции систематической ошибки.
Рассчитаем максимальное время работы ESP, при котором взаимный уход часов не превысить 10 мкс.
это время составить 10/0.0993=100 секунд.
-----------------------
 

sasasa

Member
@niкolz, вы можете дать пример кодa, чтобы сделать тест на ЕСПках? Пока мне рубеж 50мкс не удаётся преодалеть.
Про систематические ошибки не совсем полял. Что и как вычислять?
 
  • Like
Реакции: pvvx

pvvx

Активный участник сообщества
Но Вы все равно не можете отличить метод от алгоритма. Бывает...
Стандартный метод и алгоритм наверно лучше? :)
Он уже встроен в систему, но Espressif его закрыл, т.к. не может представить исходный код. Он тянут из чужих источников… Пример уже приведен.
 
Последнее редактирование:

nikolz

Well-known member
@niкolz, вы можете дать пример кодa, чтобы сделать тест на ЕСПках? Пока мне рубеж 50мкс не удаётся преодалеть.
Про систематические ошибки не совсем полял. Что и как вычислять?
Я пишу на СИ, поэтому пример на дурине дать не могу.
У меня нет доступа к значению TSF, а делать так как pvvx с патчами библиотек я не хочу.
------------------------------
Дело в том, что использование TSF позволяет решать задачу с использованием двух ESP,
а если использовать системное время, то надо три ESP.
---------------------------------
Не совсем понятна причина ошибки у Вас в 50 мкс.
Можете пояснить каким образом Вы обнаружили эти ошибки и привести статистику по ним?

------------------------------------
Код достаточно простой но на си.
1) На одном eSP посылаем значение системного времени
2) На втором принимаем и вычисляем разность.
===================-
Могу предложить Вам провести такой эксперимент, который показывает как учесть систематическую погрешность и фактически не использовать синхронизацию по wifi вообще.
Возьмите две ESP, подключите их к двум компьютерам по USB.
После этого запишите лог системных часов обоих чипов в течении 1 часа.
Потом совместите логи и вычислите разность.
Постройте функцию ошибки.
Полученную функцию используйте для коррекции времени одного из чипов.
В результате получите указанную выше точность синхронизации
---------------------
 

nikolz

Well-known member
Стандартный метод и алгоритм наверно лучше? :)
Он уже встроен в систему, но Espressif его закрыл, т.к. не может представить исходный код. Он тянут из чужих источников… Пример уже приведен.
Можете ответить на вопрос:
в irom есть функция save_tsf_us
можно ли по аналогии сделать функцию get_tsf_us , заменив команду сохранить из регистра в tsf на команду загрузить из tsf в регистр.
при этом ничего патчить не надо.
Чем такое решение будет отличаеться от Вашего патча библиотеки?
 

pvvx

Активный участник сообщества
Я пишу на СИ, поэтому пример на дурине дать не могу.
За всё время я не смог найти смыслу вставки запретов прерываний на срок более 2-х us в системе ESP. И то это при халявном подходе. Атомарные операции, которые может нарушить разрешение прерывания, бывают редко и их объем кода обычно не более нескольких операций процессора. Это решается алгоритмически. Но в Espressif программисты используют в системе запреты прерываний до нескольких ms. Это говорит о их безразличию к итоговому качеству софта и отсутствию знаний. Примерно как у Nikolz :)
На Дурине идет любой код. Хоть СИ, хоть C++. Вставляете заголовок описания переменных и функций из SDK и вперед - компилятор, SDK и исходные объекты одни и те-же.
 

pvvx

Активный участник сообщества
Можете ответить на вопрос:
в irom есть функция save_tsf_us
можно ли по аналогии сделать функцию get_tsf_us , заменив команду сохранить из регистра в tsf на команду загрузить из tsf в регистр.
при этом ничего патчить не надо.
Чем такое решение будет отличаеться от Вашего патча библиотеки?
В ПО к модулю ESP от Espressif нет функции получения TSF. У других - есть.
 

pvvx

Активный участник сообщества
Я Вам задал конкретный вопрос про Вашу поделку и Espressif о ней ничего не знает.
Поэтому не надо ля-ля.
Моя поделка сделана по методу Обратная разработка — Википедия.
Таким методом пользуются известные компании - к примеру AMD в начальном конфликте с Intel.
Мой код оригинален и не совпадает с Espressif или FreeBSD, от куда он тянут у Espressif :)
 
Последнее редактирование:

nikolz

Well-known member
Еще это назывется промышленный шпионаж или " как смотреть гланды через зад".
Я же не спрашивал Вас -через какое место Вы ее делали. Вы опять уходите от ответа на вполне конкретный вопрос.
Все и так понятно.
Признать что делали сложно то, что можно сделать проще не можете. Бывает...
 

pvvx

Активный участник сообщества
Еще это назывется промышленный шпионаж или " как смотреть гланды через зад".
Я же не спрашивал Вас -через какое место Вы ее делали. Вы опять уходите от ответа на вполне конкретный вопрос.
Все и так понятно.
Признать что делали сложно то, что можно сделать проще не можете. Бывает...
Ваше признание что мой код в десятку байт и намного проще чем ваше решение не требуется. Во первых так веселее - вы проявляете неимоверную глупость, а мы смеемся. Клоунада в разгаре :)
Во первых - промышленный шпионаж у Espressif, а у меня оригинальное решение. Чуете разницу?
Во вторых ваше предложение по синхронизации является, как вы правильно заметили "как смотреть гланды через зад". В системе уже есть синхронизация и более точная, чем ваше предложение.
 
Последнее редактирование:

nikolz

Well-known member
Ваше признание что мой код в десятку байт и намного проще чем ваше решение не требуется. Во первых так веселее - вы проявляете неимоверную глупость, а мы смеемся. Клоунада в разгаре :)
Во первых - промышленный шпионаж у Espressif, а у меня оригинальное решение. Чуете разницу?
Во вторых ваше предложение по синхронизации является, как вы правильно заметили "как смотреть гланды через зад". В системе уже есть синхронизация и более точная, чем ваше предложение.
Удивительно то, что вы свое решение в десятки команд называете оригинальным по сравнению с решением в три команды.
Как говорят -чем бы детя не тешилось, лишь бы не плакало .
Вы смеетесь - значит все нормально.
Вы и на вики сослались и в собственной оригинальности себя обличили, а на простой вопрос не ответили.
Сплошная демагогия.
 

pvvx

Активный участник сообщества
Удивительно то, что вы свое решение в десятки команд называете оригинальным по сравнению с решением в три команды.
Как говорят -чем бы детя не тешилось, лишь бы не плакало .
Вы смеетесь - значит все нормально.
Вы и на вики сослались и в собственной оригинальности себя обличили, а на простой вопрос не ответили.
Сплошная демагогия.
На вики я сослался чтобы показать то, что вы не понимаете. А решения вопроса, описанного в топике темы от вас пока нет. Есть только моё и уже работает. Тут не сложно понять и кто гонит демагогию. :)
Смотрим как это делают оф. предстваители Espressif: Mon Oct 27, 2014 11:08 am
Re: Hardware timestamping
Postby ESP_Faye » Mon Jul 20, 2015 4:59 pm

Hi,

Thanks for your interest in ESP8266 !

We are assessing it .

We will let you know if there is any update.
И сравниваем время запроса решения на данном сайте и получение готового кода. :)
 
Последнее редактирование:

nikolz

Well-known member
На вики я сослался чтобы показать то, что вы не понимаете. А решения вопроса, описанного в топике темы от вас пока нет. Есть только моё и уже работает. Тут не сложно понять и кто гонит демагогию. :)
Судя по последнему замечанию автора топика, Ваше решение не работает. А то, что вы прибавили к системному время базы - это "очень оригинально" так как очевидно.
Я предложил решение с коррекцией систематической ошибки которое по точности примерно в 100 раз точнее и вполне может быть использовано в экспериментах.
А использование трех eSP посволяет получить тот же результат что и у Вас без ссылок на вики и без всякой оригинальность Число команд - не больше, и не надо не реинжиниринга ни патчей.
Но Вы же легких путей не ищите. Вам этого не понять.
 

pvvx

Активный участник сообщества
Судя по последнему замечанию автора топика, Ваше решение не работает. А то, что вы прибавили к системному время базы - это "очень оригинально" так как очевидно.
Я предложил решение с коррекцией систематической ошибки которое по точности примерно в 100 раз точнее и вполне может быть использовано в экспериментах.
А использование трех eSP посволяет получить тот же результат что и у Вас без ссылок на вики и без всякой оригинальность Число команд - не больше, и не надо не реинжиниринга ни патчей.
Но Вы же легких путей не ищите. Вам этого не понять.
Вы пока бредите. Изучите получше то, что уже описано и дайте хоть какое-то решение точнее приведенного. Приведенное решение имеет разброс в пару микросекунд. Невозможность привязки внешнего события к считыванию get_tsf_staion() завязано на разгильдяйстве программистов из Espressif, а не в моем решении. :p Вам уже указано - получить внешнее событие точнее +-50 us нет возможности из-за прерывания процесса с запретом прерываний разгильдяйским кодом от Espressif. Пробуйте по NMI или перестановкой приоритетов прерываний и очередными патчами быдлокода от Espressif.

PS: Вас очередной раз ввожу в курс текущих проблем, которые сказываются на любом алгоритме синхронизации. Вместо предоставления решения вы обычно пасуете или разводите демагогию.

Вам самое время скрыться и подождать когда читатели забудут ваши приколы с постоянными ошибками в каждом предложенном методе и вылезти через время с новыми приколами и уводами от решения проблем пользователей с кривым ПО от Espressif.

Совершенно не понятна ваша навязчивая идея доказывающая, что программисты из Espressif не могут вставить в своё ПО пару строк кода за многие годы по множеству вопросов. Но это уже доказано – ESP8266 уже выпал из актуальности его использования в каких-либо серьезных поделках кроме игрушек на вечер из-за громадного кол-ва ошибок в ПО. Испортили своим подходом базовую разработку Tensilica Xtensa

Как теперь заявляет производитель – они ещё будут тянуть свой кривой подход 8 лет для ESP8266. :)
Для ESP-32S они уже собрали очередную группу программистов-халтурщиков для создания ПО на него и кормят пользователей только обещаниями :) как и Nicolz - манера одна и та-же :)
 
Последнее редактирование:

sasasa

Member
Код достаточно простой но на си.
1) На одном eSP посылаем значение системного времени
2) На втором принимаем и вычисляем разность.
Давайте код в Си, там уже разберёмся. А то не понятно как и чем переслать, чтобы задержка была одинакова и не скачила. И как обойти задержки на прерываниях из-за которых (возможно) на столько большие отклонения. Ибо точные часы, без возможности фиксировать событие по их времени ни к чему.
Ещё раз напомню мою задачу - фиксировать разность по времени с точностью 5мкс (20мкс) срабатывание 2-х сенсоров(пъезо+RC trigger) на 2-х ЕСПках, которые подключены к GPIO прерыванию.
 

pvvx

Активный участник сообщества
Для начала надо скорректировать, т.е. разобраться с запретами прерываний. В зависимости от использования необходимо корректировать код сохранения счетчиков и запроса к ним. Т.е. разберитесь со вставками ets_intr_lock()/ets_intr_unlock() в своем коде и в коде процедур из wifi_tsf.c
Код:
/*
 * wifi_tsf.c
 *
 *  Created on: 28/12/2016
 *      Author: pvvx
 */
#if 1

#include "user_config.h"
#include "bios.h"
#include "hw/esp8266.h"
#include "hw/eagle_soc.h"
#include "sdk/add_func.h"
#include "ets_sys.h"
#include "osapi.h"

// struct code FreeBSD
struct ieee80211_scanparams {
    uint8_t        status;        /* bitmask of IEEE80211_BPARSE_* */
    uint8_t        chan;        /* channel # from FH/DSPARMS */
    uint8_t        bchan;        /* curchan's channel # */
    uint8_t        fhindex;    
    uint16_t    fhdwell;    /* FHSS dwell interval */
    uint16_t    capinfo;    /*  802.11 capabilities */
    uint16_t    erp;        /* NB: 0x100 indicates ie present */
    uint16_t    bintval;
    uint8_t        timoff;
    uint8_t        *ies;        /* all captured ies */
    size_t        ies_len;    /* length of all captured ies */
    uint8_t        *tim;      
    uint8_t        *tstamp;
    uint8_t        *country;
    uint8_t        *ssid;
    uint8_t        *rates;
    uint8_t        *xrates;
    uint8_t        *doth;
    uint8_t        *wpa;
    uint8_t        *rsn;
    uint8_t        *wme;
    uint8_t        *htcap;
    uint8_t        *htinfo;
    uint8_t        *ath;
    uint8_t        *tdma;
    uint8_t        *csa;
    uint8_t        *quiet;
    uint8_t        *meshid;
    uint8_t        *meshconf;
    uint8_t        *spare[3];
};

volatile uint64 recv_tsf; // принятый TSF от внешней AP
volatile uint32 recv_tsf_time;    // время приема TSF (младшие 32 бита - считем, что для времязависимых приложений не ставят время следования beacon более 4294967296 us :) )

// #define MAC_TIMER64BIT_COUNT_ADDR 0x3ff21048
//===============================================================================
// get_mac_time() = get_tsf_ap() -  TSF AP
//-------------------------------------------------------------------------------
uint64 ICACHE_FLASH_ATTR get_mac_time(void)
{
    union {
        volatile uint32 dw[2];
        uint64 dd;
    }ux;
    ets_intr_lock();
    volatile uint32 * ptr = (volatile uint32 *)MAC_TIMER64BIT_COUNT_ADDR;
    ux.dw[0] = ptr[0];
    ux.dw[1] = ptr[1];
    if(ux.dw[1] != ptr[1]) {
        ux.dw[0] = ptr[0];
        ux.dw[1] = ptr[1];
    }
    ets_intr_unlock();
    return ux.dd;
}

extern void cnx_update_bss_mor_(int a2,  struct ieee80211_scanparams *scnp, void *a4);
//===============================================================================
// save_tsf_station()
//-------------------------------------------------------------------------------
void ICACHE_FLASH_ATTR cnx_update_bss_more(int a2,  struct ieee80211_scanparams *scnp, void *a4)
{
    //ets_intr_lock();
    recv_tsf_time = *((volatile uint32 *)MAC_TIMER64BIT_COUNT_ADDR);
    os_memcpy((void *)&recv_tsf, (void *)scnp->tstamp, 8);
    //ets_intr_unlock();
    cnx_update_bss_mor_(a2, scnp, a4);
}
//===============================================================================
// get_tsf_station()
//-------------------------------------------------------------------------------
uint64 ICACHE_FLASH_ATTR get_tsf_station(void)
{
    ets_intr_lock();
    uint32 cur_mac_time = *((volatile uint32 *)MAC_TIMER64BIT_COUNT_ADDR) - recv_tsf_time;
    uint64 cur_tsf = recv_tsf + cur_mac_time;
    ets_intr_unlock();
    return cur_tsf;
}

#endif
 

pvvx

Активный участник сообщества
Т.е. в вашем коде надо корректно описать атомарность – связку события с запросом времени.

К примеру, если вы запрашиваете счетчик в процедуре прерывания, которая выше приоритетом чем другие, то ets_intr_lock()/ets_intr_unlock() там не нужны.

Если событие определяете по циклическому опросу в коде, то необходимо использовать ets_intr_lock()/ets_intr_unlock().

Например, при опросе события в предполагаемое временное окно:
Код:
    i = 1000;
    while(i--) {
        ets_intr_lock();
        if(pin_active) {
            event_timestamp = get_tsf_ststion();
            break;
        }
        ets_intr_unlock();
    }
Если обработка производится в прерывании, то быстро выполняете все атомарные операции и выходите из него, передав информацию в system_os_post() для дальнейшей обработки в процедуре назначенной в system_os_task(). В обработчике прерывания код должен отрабатывать быстрее 1 us, тогда всегда получите реакцию системы с этим джиттером, а не как пишут горе-программеры и халтурщики из Espressif запрещая прерывания на сотни миллисекунд.
1us– это 160 тактов CPU и всегда достаточно для отработки необходимой атомарности действий в любой системе. Но увы - халтурщики из Espressif алгоритмически и интеллектуально ограничены в понимании как и Nicolz. От этого у них тяга друг к дружке. :) Они могут давать только советы использовать лишний код и никчемные навороты. Потом им стыдно привести исходники. :) :) Обратиться в защиту интеллектуальных прав Espressif не может, т.к. всё её ПО составлено из кусков чужого, цельно тянутого. По этой же причине, создавая код на SDK от Espressif, вы вступаете в сговор с нарушителями. :) Выход из этой ситуации всего один – переписывание кода и его публикация с лицензией. Какие-то копошения по данному поводу идут – описано в сообщениях от iggr, но скорее всего этого так и не предвидится...
Ну а пока этого нет - (с) Espressif = пустой звук (с отрицательными нотами), то мы продолжим свой бардак и не будем слушать всяких защитников Espressif типа Nicolz. :p
 
Последнее редактирование:
Сверху Снизу