-
- Ну как-то так на столе. Процесс синхронизации, шкалы в миллисекундахупс!. Опорное время транслируется раз в 8 секунд. Dingo(1 знак., 26.01.2023 07:42, картинка)
- Работа с одной и той же периферией в разных контекстах выполнения
кода -- плохая идея. VVB_(380 знак., 25.01.2023 16:12, , ссылка)
- Набор суеверий кокойты. Таймер выполняет роль часов на стене, он по
задумке глобальный: всем можно смотреть на часы. Двойное чтение
нужно там, где не получается прочитать атомарно, и снова это не тот
случай. - SciFi(25.01.2023 16:33)
- "Обрабатываю пакеты сети, которым надо отметку времени". Я бы завёл
глобально доступную переменную, которую изменял бы в прерывании 1
мс. Просто и тупо. - VVB_(25.01.2023 17:08, )
- А если нужна более высокая разрешающая способность? - =AlexD=(25.01.2023 17:09)
- Приемлемая точность - десятки микросекунд, до сотни. Но как всегда:
чем точнее, тем не хуже. - Dingo(26.01.2023 05:45)
- Может аппаратный таймстамп использовать? Если не изменяет склероз,
nuc970 умеет в IEEE1588. - LightElf(26.01.2023 10:11)
- Почитал описание. А время в пакет он как вставляет? Или всё равно
ручками? Выигрыш в специализированном автономном таймере? - Dingo(26.01.2023 10:58)
- Складывает в дескриптор пакета. В Programming Guide же описано LightElf(1 знак., 26.01.2023 13:05, картинка)
- У меня попытка изменить приоритет прерываний сети нарушает работу сетевого стека(код из примера), а тут я вообще увязну. Однако - спасибо, что указали! - Dingo(26.01.2023 10:28)
- Почитал описание. А время в пакет он как вставляет? Или всё равно
ручками? Выигрыш в специализированном автономном таймере? - Dingo(26.01.2023 10:58)
- Может аппаратный таймстамп использовать? Если не изменяет склероз,
nuc970 умеет в IEEE1588. - LightElf(26.01.2023 10:11)
- А если не нужна? - SciFi(25.01.2023 20:23)
- Или тут VVB_(1 знак., 25.01.2023 17:12, , ссылка)
- Это был намёк, что ваше решение не универсально. - =AlexD=(25.01.2023 17:22)
- Извините, мне надо более толстые намёки :-). Embedded Control
Systems подразумевает "заточку" под имеющиеся ресурсы. - VVB(25.01.2023 18:46)
- Похеру на ваши трудности, когда сетевые пакеты имеют временные метки наносекундной точности. - =AlexD=(25.01.2023 19:17)
- Извините, мне надо более толстые намёки :-). Embedded Control
Systems подразумевает "заточку" под имеющиеся ресурсы. - VVB(25.01.2023 18:46)
- Это был намёк, что ваше решение не универсально. - =AlexD=(25.01.2023 17:22)
- В этой ветке есть код ниже VVB_(1 знак., 25.01.2023 17:12, , ссылка)
- Приемлемая точность - десятки микросекунд, до сотни. Но как всегда:
чем точнее, тем не хуже. - Dingo(26.01.2023 05:45)
- А если нужна более высокая разрешающая способность? - =AlexD=(25.01.2023 17:09)
- "Обрабатываю пакеты сети, которым надо отметку времени". Я бы завёл
глобально доступную переменную, которую изменял бы в прерывании 1
мс. Просто и тупо. - VVB_(25.01.2023 17:08, )
- Набор суеверий кокойты. Таймер выполняет роль часов на стене, он по
задумке глобальный: всем можно смотреть на часы. Двойное чтение
нужно там, где не получается прочитать атомарно, и снова это не тот
случай. - SciFi(25.01.2023 16:33)
- Первая версия: где-то забыли поставить volatile. - SciFi(25.01.2023 12:53)
- Структура объявлена как volatile (поля в ней - нет). Это как-то
объясняет поломку работы сети при смене приоритета? - Dingo(25.01.2023 12:59)
- Я вообще ничего не понял из описания проблемы, извините. То ли
туплю, то ли описание расплывчатое, то ли линейная комбинация того
и другого... - SciFi(25.01.2023 13:06)
- Думаю, комбо. Я ещё и на кэши грешил, но потом отбросил эту ветку,
когда прочитал в память для логов значения регистров таймера. То
есть ситуация: мы в обработчике сети читаем через взятие времени
регистры таймера, и там по сочетанию регистров вижу, что прерывание
"вот только что" было, но регистр сравнения ещё не скорректирован.
В обработчиках пишу в память, а когда вижу ситуацию - прошу
выплюнуть на консоль всё накопленное: 64 Мб позволяют. - Dingo(25.01.2023 13:16)
- Яснее не стало. "Взятие времени"? "Регистр сравнения"? Что? Где?
Когда? Зачем? Почему? - SciFi(25.01.2023 13:19)
- Таймер считает без остановки, от нуля до 2^24, при совпадении с
регистром сравнения вырабатывается запрос на прерывание. Приоритет
таймера ниже, чем прерываний сетевого интерфейса. В обработчике
сети есть "взять время" - получаем точное набортное время,
вычисляется с использованием регистров таймера. Но возникает
ситуация, когда регистр счёта перешагнул значение регистра
сравнения, но само значение регистра сравнения ещё не обновилось
(запрос на прерывание есть, но мы в Dingo(46 знак., 25.01.2023 13:26)
- Ну это да, такая ситуация возможна. Я повсеместно применяю аппаратный таймер для меток времени, и он переполняется довольно часто. Только прерывание не использую, гораздо проще делать так: SciFi(430 знак., 25.01.2023 13:36)
- Если запрос на прерывание таймера висит необработанным, значит текущее время нужно скорректировать на единичку, обычно так. - =AlexD=(25.01.2023 13:33)
- А автоматического сброса таймера по совпадению с регистром
сравнения нет? Если в битах порыться. По логике должно быть, иначе
оно всё время будет глючить. - =AlexD=(25.01.2023 13:31)
- Весь Timer Control and Status Register (TMR_CSR) Но может выйти ещё
хуже: событие произошло, а мы его пропустили. Dingo(1 знак., 25.01.2023 13:44, картинка)
- Вы Periodic mode, надеюсь, используете? - LightElf(25.01.2023 19:19)
- Конечно, нет. Все режимы кроме continous сбрасывают счёт таймера при записи
регистра сравнения. ETMR не смотрел в этом отношении. Dingo(439 знак., 26.01.2023 05:52)
- Чёт я не пойму изыска. Зачем обновлять регистр сравнения? Делаете
переменные задержки на том же таймер или что? - LightElf(26.01.2023 10:07)
- Период счёта не кратен секунде, да и нет двух одинаковых кварцев.
Например, у меня по результату вместо 12`000`000Гц оказался
12`000`126Гц. И это не точно: может в референсном устройстве тоже
не ровно, а подстраиваться к нему надо. Ну и опять же - ошибка всё
равно накопится, даже если разница будет в единицы Гц или даже
доли. Поэтому - постоянно подводить локальные часы. - Dingo(26.01.2023 10:13)
- Ну если вам нужна такая точность, что начинает существенную роль играть разброс кварцев, то вам прямая дорога в IEEE1588. Там и 64-битный таймер на 150МГц, и поправки дробные и синхронизация с мастером. - LightElf(26.01.2023 13:09)
- Я бы их в другом месте подводил. Зафиксировал бы таймер с периодом 12000000, чтобы в этом месте геморроя не было, а поправки вносил бы потом при помощи нехитрой арифметики. - SciFi(26.01.2023 10:17)
- Период счёта не кратен секунде, да и нет двух одинаковых кварцев.
Например, у меня по результату вместо 12`000`000Гц оказался
12`000`126Гц. И это не точно: может в референсном устройстве тоже
не ровно, а подстраиваться к нему надо. Ну и опять же - ошибка всё
равно накопится, даже если разница будет в единицы Гц или даже
доли. Поэтому - постоянно подводить локальные часы. - Dingo(26.01.2023 10:13)
- Чёт я не пойму изыска. Зачем обновлять регистр сравнения? Делаете
переменные задержки на том же таймер или что? - LightElf(26.01.2023 10:07)
- Конечно, нет. Все режимы кроме continous сбрасывают счёт таймера при записи
регистра сравнения. ETMR не смотрел в этом отношении. Dingo(439 знак., 26.01.2023 05:52)
- Вы Periodic mode, надеюсь, используете? - LightElf(25.01.2023 19:19)
- Весь Timer Control and Status Register (TMR_CSR) Но может выйти ещё
хуже: событие произошло, а мы его пропустили. Dingo(1 знак., 25.01.2023 13:44, картинка)
- Таймер считает без остановки, от нуля до 2^24, при совпадении с
регистром сравнения вырабатывается запрос на прерывание. Приоритет
таймера ниже, чем прерываний сетевого интерфейса. В обработчике
сети есть "взять время" - получаем точное набортное время,
вычисляется с использованием регистров таймера. Но возникает
ситуация, когда регистр счёта перешагнул значение регистра
сравнения, но само значение регистра сравнения ещё не обновилось
(запрос на прерывание есть, но мы в Dingo(46 знак., 25.01.2023 13:26)
- Яснее не стало. "Взятие времени"? "Регистр сравнения"? Что? Где?
Когда? Зачем? Почему? - SciFi(25.01.2023 13:19)
- Думаю, комбо. Я ещё и на кэши грешил, но потом отбросил эту ветку,
когда прочитал в память для логов значения регистров таймера. То
есть ситуация: мы в обработчике сети читаем через взятие времени
регистры таймера, и там по сочетанию регистров вижу, что прерывание
"вот только что" было, но регистр сравнения ещё не скорректирован.
В обработчиках пишу в память, а когда вижу ситуацию - прошу
выплюнуть на консоль всё накопленное: 64 Мб позволяют. - Dingo(25.01.2023 13:16)
- Я вообще ничего не понял из описания проблемы, извините. То ли
туплю, то ли описание расплывчатое, то ли линейная комбинация того
и другого... - SciFi(25.01.2023 13:06)
- Структура объявлена как volatile (поля в ней - нет). Это как-то
объясняет поломку работы сети при смене приоритета? - Dingo(25.01.2023 12:59)