ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
4 июля
1261307 Топик полностью
VVB (22.11.2022 14:38, просмотров: 209) ответил IBAH на Всем спасибо, идея гавно! как атомарность обеспечивать? Типа, таймер подожди я твое значение считаю
Я в нувотоне вот так делаю. Без запрета прерываний. Без останова таймера. Без использования регистров захвата. С работой в вытесняющей многозадачности. 

Значение переменной cntTimer2Irq у меня увеличивается на 1 при переполнении таймера в обработчике IRQ, в вашем случае это абсолютное значение второго 16-битного таймера.

Таймер 24-битный, увеличивается на единицу с периодом 1 мкс.

uint32_t getTicksBy10us_32bit()
{
  const uint32_t n1 = cntTimer2Irq;
  const uint32_t t1_24bit = getclock_24bit();
  const uint32_t n2 = cntTimer2Irq;
  if (n1 == n2)
  {
    const uint64_t v_us = (uint64_t)t1_24bit | (uint64_t)(n1 << 24);
    return (uint32_t)(v_us / 10ULL);
  }
  else
  {
    const uint32_t t2_24bit = getclock_24bit();
    const uint64_t v_us = (uint64_t)t2_24bit | (uint64_t)(n2 << 24);
    return (uint32_t)(v_us / 10ULL);
  }
}

Предполагается, что второй счётчик может увеличиться максимум на 1 в течение работы этой функции, то есть относительно медленный.