Нет, не равно. Счетчик 64-х битный, за время считывания по 32 бита может измениться... Это и есть проверка, что за время считывания счет в следующих 32-х разрядах не изменился.взял ваше решение для получения точного времени.
не могу понять логику функции
get_mac_time()
вот этот момент
------------------------------
ux.dw[0]=ptr[0];
ux. dw[1]=ptr[1];
if (ux.dw[1]!=ptr[1]) {...}
-------------------------------
но условие никогда не исполнится т к выше ux. dw[1]=ptr[1];
MAC_TIMER64BIT - это аппаратный таймер блока WiFi, а не значение TSF, принятое от AP.pvvx,
можете объяснить следующий эффект.
Беру Ваше значение как вы его называете: "принятый TSF от внешней AP"
*((volatile uint32 *)MAC_TIMER64BIT_COUNT_ADDR);
и беру значение системного времени функцией
system_get_time();
далее делаем следующий тест
в user_init()
запоминаем начальные значения
T1=*((volatile uint32 *)MAC_TIMER64BIT_COUNT_ADDR);
T2=system_get_time();
далее запускаем таймер с циклическим перезапуском на 10 секунд
а в колбеке таймера вычисляем прошедшее время от старта
T3=*((volatile uint32 *)MAC_TIMER64BIT_COUNT_ADDR)-T1;
T4=system_get_time()-T2;
===================================
естественно ожидать
что T3 будет прыгать относительно T4 ну хотя бы микросекунд на 100
но в действительности получаем статистическую разницу в 2 мкс вне зависимости 10 секунд прошло или 1000
иногда но редко в минус 2 мкс.
например
T3=11100000021
T4=11100000023
----------------------
вопрос За что боролись?
А вам таймер не нужен. Все имеющиеся таймеры в ESP8266 используются системой или другими спец.функциями.звучит фантастично....
С учетом того что я еще ничего не видел про доступ к таймерам этого процессора.
extern "C" unsigned xthal_get_ccount(void)
#define system_get_cpu_clk_count() xthal_get_ccount()
это на одном ядре?Нет, не равно. Счетчик 64-х битный, за время считывания по 32 бита может измениться... Это и есть проверка, что за время считывания счет в следующих 32-х разрядах не изменился.
Старшие 32 бита изменяются 1 раз в 4294.967296 сек.это на одном ядре?
но тогда и после этого надо все время проверять а вдруг изменился
и когда вышли из этой функции тоже
т е все 100 мс проверять на вдруг изменился.
millis() и micros() и system_get_time() считывают тот-же счетчик. От куда у вас погрешность?убрал статическое смещение получил
относительное отклонение системных часов и счетчика 1.5*10^-6
пока не понял что же счетчик нам дает
если погрешность времени в пределах погрешности кварца
единственно что дает
старт отсчета
без счетчика получим на уровне нескольких ms.
Со счетчиком - точнее.
На сколько пока под вопросом .
не знаюmillis() и micros() и system_get_time() считывают тот-же счетчик. От куда у вас погрешность?
Этим таймером тактируются и другие аппаратные счетчики. К нему есть и аппаратные компараторы, дающие прерывания и работающие со смещением (тоже аппаратно). Но всё заюзано в дровах WiFi.
Если есть смешение, то PLL у CPU и WiFi разные?не знаю
но можете сами проверить
примите в колбеке таймера на 10 секунд
значение системного времени
и вашей функции get_tsf_station()
зафиксируйте их в первый вызов колбека
после этого вычисляйте разницу всех последующих и зафиксированного значения
получается следующее:
10000000,10013399
20000000,20025182
30000000,30037821
и т д
как видим есть набег по времени это и есть статическое смещение
13399
25182
37821
если возьмем первое значение и вычтем его из последующих умножая на номер измерения получим
0
-1116
-2376 получилось на порядок меньше
Я так и не понял, что вы хотите получить?не знаю
пока просто разобрался как получить данные с помощью ваших функцийЯ так и не понял, что вы хотите получить?
Измерить уход счетчиков непонятных полусофт-таймеров и 64-х битного аппаратного счетчика на 1 us в WiFi блоке?
Кварц у всех один. PLL в чипе тоже одна. Все, включая CPU, от PLL и тактируются, исключая часть периферии CPU на шине, тактируемой от кварца.
в каком месте набегает и как это пересчитать на интервал в 10 секунд?APB_CLK_FREQ = 80*1000000 //unit: Hz
TIMER_CLK_FREQ (APB_CLK_FREQ>>8) //divided by 256
Т.е. таймер идет с дискретом в 312500 Гц
Если вы не попадаете в дискретность, то набегает 1/312500=3.1999999999999999000E-006 или 3.2 us на каждый заряд таймера.
Ну подумайте сами. Если счетчик таймера на прерывание заряжается на единицу меньше или больше... Такие поправки разные в разных SDK - китайский Espressif.в каком месте набегает и как это пересчитать на интервал в 10 секунд?