Easyelectronics.ru

Электроника для всех
Текущее время: 23 окт 2019, 23:30

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 41 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Миллисекундный Таймстамп, Производительность против Точности
СообщениеДобавлено: 17 сен 2019, 21:21 
Заглядывает иногда

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 62
VladislavS писал(а):
zacher, это стёб такой? Запускаешь любой таймер, чтобы тикал с частотой 0,1 мс к примеру. В начале измерения обнуляешь его счётчик, в конце измерения считываешь. Накладные рамсходы 3 ассемблерных команды на запуск и столько же на чтение результата. Остаётся только подобрать таймер по разрядности, чтобы не переполнялся за максимально требуемый период измерения. На выбор 16, 24 и 32-битные таймеры есть.

Ты остальной код так же как этот несчастный таймер запрограммировал? Тогда не удивительно...

я работал через прерывания. а надо именно считывать счётчик.

все доработал. всем спасибо.

Вот результаты измерений:
================================
Отправка 256 сообщений:
0xD889AA4C - 0xD7955443 = 16012809
Приём 256 сообщений:
0xD6F5BCA-0x3E2E6D5 = 16019992

=============================
значения в мкс
если кому-то нужен код , могу выложить.

Удачи!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Миллисекундный Таймстамп, Производительность против Точности
СообщениеДобавлено: 17 сен 2019, 21:41 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4016
Откуда: КЧР, поселок Нижний Архыз
Не ту кнопку нажал. Тут хрен поймешь, куда жамкать, чтобы процитировать: в нормальном виде кнопка снизу, а в идиотском, оказывается, сверху!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Миллисекундный Таймстамп, Производительность против Точности
СообщениеДобавлено: 17 сен 2019, 22:00 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2623
Откуда: Санкт-Петербург
zacher, выглядит так, будто проблема ни разу не в SysTick, а в том, что у вас не хватает ресурсов на прочие задачи. Прерывания при отправке/приёме данных идут так плотно и занимают столько времени, что в течение миллисекунды не находится времени вызвать SysTick. Такого быть не должно.

Напрашивающееся решение (частичное, для полного надо больше ресурсов или оптимизировать код) - по максимуму выносить код из этих прерываний в главный цикл.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Миллисекундный Таймстамп, Производительность против Точности
СообщениеДобавлено: 17 сен 2019, 22:05 
Заглядывает иногда

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 62
aamonster писал(а):
zacher, выглядит так, будто проблема ни разу не в SysTick, а в том, что у вас не хватает ресурсов на прочие задачи. Прерывания при отправке/приёме данных идут так плотно и занимают столько времени, что в течение миллисекунды не находится времени вызвать SysTick. Такого быть не должно.

Напрашивающееся решение (частичное, для полного надо больше ресурсов или оптимизировать код) - по максимуму выносить код из этих прерываний в главный цикл.


Поскольку потоки сообщений в общем случае непрерывны, смысла выносить куда-то что-то особенно нет. Хотя конечно же, сделана буферизация с максимальным упрощением (здесь тоже встаёт вопрос, чем жертвовать - оперативной памятью или процессорным временем, но это уже отдельная песня). Скорость сообщений я указал какая выше. А может, теоретически, быть в два раза быстрее... Поэтому, действительно, пауз практически нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Миллисекундный Таймстамп, Производительность против Точности
СообщениеДобавлено: 17 сен 2019, 22:49 
Старожил
Аватара пользователя

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2620
Откуда: Русь, Новороссийск
zacher писал(а):
VladyMile писал(а):
У него аж 120 МГц и систик целых 1 мс - всё будет хорошо.
со скоростью 1бит сообщения в 2 мкс (500КГЦ)
Вы вот определитесь - вам нужна точность 1 мс или 2 мкс?

Ладно. Исправили, работает - и ладно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Миллисекундный Таймстамп, Производительность против Точности
СообщениеДобавлено: 17 сен 2019, 23:31 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3662
Заработало? Ну и славабогу. Кстати, да, нужны миллисекунды или микросекунды? Разница в 1000 раз. Но даже при этом, если использовать субсчет (24-битный счетчик самого систика), то можно отсчитывать и более точно, не нагружая частыми прерываниями.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Миллисекундный Таймстамп, Производительность против Точности
СообщениеДобавлено: 17 сен 2019, 23:31 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1027
zacher писал(а):
Отправка 256 сообщений:
0xD889AA4C - 0xD7955443 = 16012809
Хинт. Обнуление счётчика в начале измерений занимает меньше времени, чем его считывание и сохранение в переменной. Точно так же, получение времени с обнулённого счётчика избавляет от операции вычитания. То есть, можно в 3-4 раза сэкономить затраченное на измерения времени время.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Миллисекундный Таймстамп, Производительность против Точности
СообщениеДобавлено: 17 сен 2019, 23:40 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3662
Одно дело - измерить интервал времени между двумя событиями, и другое дело - получить для каждого события штамп времени в абсолютных цифрах от старта системы. Что из этого нужно топикстартеру? Штамп времени применяется например в логгировании событий.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Миллисекундный Таймстамп, Производительность против Точности
СообщениеДобавлено: 17 сен 2019, 23:57 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1027
В любом случае, вести лог или одно измерение от нуля выгоднее по операциям.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Миллисекундный Таймстамп, Производительность против Точности
СообщениеДобавлено: 18 сен 2019, 10:53 
Старожил
Аватара пользователя

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2620
Откуда: Русь, Новороссийск
Если нужен лог по куче событий в юникс-времени, то получится, что надо засекать юникс-время обнуления Х, потом считать значение У от момента обнуления для каждого события, а потом для каждого значения вычислять Х+У=Z (Z - юникс-время каждого события)?
Имхо - накладненько.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Миллисекундный Таймстамп, Производительность против Точности
СообщениеДобавлено: 18 сен 2019, 18:02 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3662
Абсолютный штамп времени от старта системы, с тиками и субтиками:
Код:
typedef struct {
   uint32_t tick;
   uint32_t subtick;
} timestamp_t;

timestamp_t timestamp;
uint32_t systick_count;

void GetTimeStamp(void)
{
   __disable_irq();
   timestamp.subtick = SysTick->VAL;
   timestamp.tick = systick_count;
   __enable_irq();
}

void SysTick_Handler(void)
{
   systick_count++;
}

uint32_t __SysTick_Config(uint32_t ticks)
{
   if (ticks > SysTick_LOAD_RELOAD_Msk)
      return 1;

   SysTick->LOAD = ticks - 1;
   NVIC_SetPriority(SysTick_IRQn, 0);
   SysTick->VAL = 0;
   SysTick->CTRL = SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;
   return 0;
}
........

int main(void)
{
   __SysTick_Config(8000000 / (100 * 8));
....
        GetTimeStamp();       // обновление переменной штампа времени по событию, которое нужно зафиксировать
.....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Миллисекундный Таймстамп, Производительность против Точности
СообщениеДобавлено: 18 сен 2019, 19:34 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1027
Только volatile не хватает кое-где.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Миллисекундный Таймстамп, Производительность против Точности
СообщениеДобавлено: 18 сен 2019, 19:46 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3662
volatile timestamp_t timestamp;
volatile uint32_t systick_count;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Миллисекундный Таймстамп, Производительность против Точности
СообщениеДобавлено: 19 сен 2019, 13:37 
Старожил
Аватара пользователя

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2620
Откуда: Русь, Новороссийск
BusMaster писал(а):
Код:
...
uint32_t systick_count;
...
void SysTick_Handler(void)
{
   systick_count++;
}
Я намекнуть на конечную разрядность uint32_t systick_count :)
Код:
/**************************************************************************
*   Function name :   SysTime_Handler()
*   Returns :      нет
*   Parameters :   нет
*   Purpose :      Обработчик системного времени
***************************************************************************/

void SysTime_Handler() {
   SysTick = 0;         // опускаем флаг систика

   DISABLE_INTERRUPT();
      SysTime++;         // сдвигаем стрелку системных часов
   RESTORE_INTERRUPT();
      
   // если устройство не RUN (не в работе), а системное время SysTime превысило
   // половину размера своей переменной,
   if ((GTStates[GTIMER_RUN] == TIMER_STOPPED) && ((SYS_TIME_MAXIMUM/2) < SysTime)) {
      DISABLE_INTERRUPT();
      GTimer_Init();      // то обнуляем системное время и
                     // реинициализируем все рабочие таймеры
      RESTORE_INTERRUPT();
   }
}
Если ТСу нужно юникс-время (я под этим подразумеваю какое-то "человечье" время), то разрядность systick_count, возможно, придётся увеличить. Ну или дополнительно ввести переменную unix_time, которую будет щёлкать systick_count


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Миллисекундный Таймстамп, Производительность против Точности
СообщениеДобавлено: 25 сен 2019, 18:08 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 234
я сделал так
конфигурирую таймер фри ран
Код:
void TIM_FreeRunSetup(TIM_TypeDef * TIMx)
{
    IRQn_Type TIMx_IRQn;
    TIM_EnableClock(TIMx, &TIMx_IRQn);
    TIMx->PSC = 7200-1;  //100us
    TIMx->ARR = 0xFFFF;
    //udate interrupt enable
    TIMx->DIER |= TIM_DIER_UIE;
    NVIC_EnableIRQ(TIMx_IRQn);
    TIMx->CR1 |= TIM_CR1_CEN;
}

в прерывании сумирую роловер
Код:
void TIM6_DAC_IRQHandler (void)
{
    added_val += 0xFFFF;
    TIM6->SR = (uint16_t)~TIM_IT_Update;
}

и сама функция возврата прошедших милисекунд
Код:
static uint32_t timer_counter = 0;
static uint32_t added_val = 0;

uint32_t TIM_GetTimeStamp_ms(TIM_TypeDef * TIMx)
{
    uint16_t time_stamp = TIMx->CNT;
    timer_counter = (time_stamp + added_val) / 10;
    return timer_counter;
}

и потом юзаю
Код:
g_timestamp = TIM_GetTimeStamp_ms(TIM6);
if (g_timestamp > ir_reset_timeout)
{
     ir_reset_timeout = g_timestamp + ir_data.debounce_time;   
     
     ir_reset = 0;
     IR_Reset();
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Миллисекундный Таймстамп, Производительность против Точности
СообщениеДобавлено: 25 сен 2019, 18:17 
Заглядывает иногда

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 62
Изящное решение.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 41 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB