ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 апреля
1278800 Топик полностью
SciFi (25.01.2023 13:36, просмотров: 205) ответил Dingo на Таймер считает без остановки, от нуля до 2^24, при совпадении с регистром сравнения вырабатывается запрос на прерывание. Приоритет таймера ниже, чем прерываний сетевого интерфейса. В обработчике сети есть "взять время" - получаем точное набортное время, вычисляется с использованием регистров таймера. Но возникает ситуация, когда регистр счёта перешагнул значение регистра сравнения, но само значение регистра сравнения ещё не обновилось (запрос на прерывание есть, но мы в
Ну это да, такая ситуация возможна. Я повсеместно применяю аппаратный таймер для меток времени, и он переполняется довольно часто. Только прерывание не использую, гораздо проще делать так: 
uint64_t timer_long; // accumulated TIMER_REG with no overflows

void update_time(void)
{
    static uint32_t before;
    uint32_t now = TIMER_REG;
    uint32_t diff = ((now << 8) - (before << 8)) >> 8;
    before = now;
    timer_long += diff;
}

Это для примера, сдвиги подобраны под ваши 24 разряда. Если вызывать функцию не реже, чем период переполнения таймера, то всё будет прекрасно.

ส็็็็็็็็็็็็็็็็็็็็็็็็็༼ ຈل͜ຈ༽ส้้้้้้้้้้้้้้้้้้้้้้้