Easyelectronics.ru

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

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



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

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

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 54
Привет,

Казалось бы простая задача - создание миллисекундного отсчёта, тем не менее, не нашёл удовлетворительного решения.
Сразу скажу, в моей задаче важна производительность, так как работает множество периферии (SDIO, SPI, CAN и пр) в довольно быстром темпе.

Кроме этого, мне необходимо делать замеры времени, с точностью 0.001-0.002 сек.
Сначала, я просто поставил таймер.
Но тут возникла такая проблема: если таймеру дать высокий приоритет прерывания (0,0 например), то он начинает жутко тормозить все остальные процессы, переполняются буфера и все перестает нормально работать. Хотя в таймере что - только SysTime++.

Если же дать таймеру низкий приоритет, он сильно потеряет точность, и это будут уже не миллисекунды, а дай бог, десятки миллисекунд.

RTC вроде бы не даёт миллисекундной точности (поправьте меня если я не прав).

Кто-то сталкивался с подобными задачами или на системной шине скороктью 120мгц это вообще не решаемо?

P.S.> просьба писать только по делу, комментарии типа "ты не умеешь программировать и прочее" я оставлю без внимания. Спасибо за понимание.


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

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1015
zacher писал(а):
Кроме этого, мне необходимо делать замеры времени, с точностью 0.001-0.002 сек.
Сначала, я просто поставил таймер.
Но тут возникла такая проблема: если таймеру дать высокий приоритет прерывания (0,0 например), то он начинает жутко тормозить все остальные процессы, переполняются буфера и все перестает нормально работать. Хотя в таймере что - только SysTime++.

Я ведь правильно понял, что одно прерывание от таймера каждые 120'000 тактов в котором просто инкрементится переменная вызывает тормоза?


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

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6213
Так, как раз в том и проблема, что "ты не умеешь программировать"(с)zacher.
Таймер должен просто тикать, без каких либо "прерываний" и "приоритетов".
Если нужно измерить, сколько времени прошло, то счетчик таймера считывается ДО и ПОСЛЕ. Разница и есть "интервал". Если делать это в самом исполняемом потоке, без обертки в функции, то получающиеся значения достаточно точны.
В качестве "таймера" можно использовать или системные таймеры процессора, или аппаратный таймер, желательно 32-битный.

Если вам надо делать не "замеры", а задержки, то делается аналогично описанному, но с проверкой достижения целевого времени Tstart+Tdelay.


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

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 54
Reflector писал(а):
Я ведь правильно понял, что одно прерывание от таймера каждые 120'000 тактов в котором просто инкрементится переменная вызывает тормоза?

Нет, таймер килогерцовый. Счетчик 1


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

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1015
zacher писал(а):
Нет, таймер килогерцовый. Счетчик 1

Ну и сколько тактов будет между прерываниями если системная шина на 120мгц?


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

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


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

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 54
u37 писал(а):
Если нужно измерить, сколько времени прошло, то счетчик таймера считывается ДО и ПОСЛЕ. Разница и есть "интервал". Если делать это в самом исполняемом потоке, без обертки в функции, то получающиеся значения достаточно точны.

Можно пример кода. Я такого найти не смог.
Пересмотрел сотни исходников, все что то прибавляют или вычитают.
Считывать состояние аппаратного счетчика звучит очень заманчиво
Спасибо


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

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3996
Откуда: КЧР, поселок Нижний Архыз
zacher, можно взять 32-битный таймер и настроить его на период 1мс. Но в результате мы теряем 32-битный таймер. А где-то его вообще нет (16-битные по понятной причине не годятся для этого).
Поэтому удобней все-таки взять systick (который все равно ни для чего другого не используешь) и пусть каждую миллисекунду в прерывании инкрементирует счетчик.


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

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2618
Откуда: Русь, Новороссийск
Eddy_Em писал(а):
Поэтому удобней все-таки взять systick (который все равно ни для чего другого не используешь) и пусть каждую миллисекунду в прерывании инкрементирует счетчик.
Простите, что с моим дилетантизмом в программировании осмеливаюся открыть рот, но я в своих проектах не инкременчу счётчик в прерывании, а только ставлю флаг, а уж потом...
Я всё делаю неправильно?


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

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6213
Процессор?


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

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2277
Цитата:
но я в своих проектах не инкременчу счётчик в прерывании, а только ставлю флаг, а уж потом...

На STM32 можно и сразу инкрементировать счетчик 32-битный. Всё-равно 1 инструкция всего. Это на 8-битном авр это конечно лишние инструкции в прерывании крутить.


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

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 54
Eddy_Em писал(а):
zacher, можно взять 32-битный таймер и настроить его на период 1мс. Но в результате мы теряем 32-битный таймер. А где-то его вообще нет (16-битные по понятной причине не годятся для этого).
Поэтому удобней все-таки взять systick (который все равно ни для чего другого не используешь) и пусть каждую миллисекунду в прерывании инкрементирует счетчик.

Ну у меня сделано то же самое на таймере. Systick я так понял работает с приоритетом 15, т.е. самый последний.
Он вообще незнамо что покажет. Разумеется, если пожертвовать точностью, то проблем нет.

Интереснее предложение от u37 по поводу считывания значения аппаратного таймера. Я хотел бы попросить глянуть как это сделать.

Что касается тех людей, у которых не тормозит ничего, возможно, ваши приложения не достаточно нагружены, попробуйте нагрузить их высокопроизводительной нагрузкой - непрерывным чтением и записью на частоте 50 мгц.


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

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 54
u37 писал(а):
Процессор?

STM32F2XX


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

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2618
Откуда: Русь, Новороссийск
NStorm, а, точно, благодарю за вразумление.


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

Зарегистрирован: 16 дек 2013, 16:38
Сообщения: 115
zacher, так выкладывайте проект, посмотрим


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

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6213
Код:
#define UtilsCPUfreq MySYSCLK_FREQ_MHz

void DWT_Init(void)
{

  if (!(CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk))
  {
    CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
    DWT->CYCCNT = 0;
    DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
  }
}

uint32_t GetTime_us(uint32_t *pTime)
{
  int32_t ct = DWT->CYCCNT;
  int32_t ret = (ct - *(volatile uint32_t *)pTime - 40)/UtilsCPUfreq;
   // "-40" - компенсация задержки на время выполнения этой процедуры
   *(volatile uint32_t *)pTime = ct;
   return (ret);
}


Использовать:
1. в init запустить DWT_Init
2. определить переменную хранения текущего времени для _данного_ измерителя = TimeVar
3. для измерения времени вызывать time=GetTime_us(&TimeVar);
Будет возвращать time от последнего вызова. Например:
time1=GetTime_us(&TimeVar);
...
time2=GetTime_us(&TimeVar);
...
time3=GetTime_us(&TimeVar);
В time1 лежит фигня, в time2 лежит время выполнения куска 1-2, в time3 - время куска 2-3. В TimeVar хранится значение времени (абсолютное) последнего вызова.
Соответственно, переменных может быть множество, можно измерять время в параллельных кусках.


Последний раз редактировалось u37 17 сен 2019, 17:37, всего редактировалось 1 раз.

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

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2618
Откуда: Русь, Новороссийск
zacher писал(а):
Eddy_Em писал(а):
...Поэтому удобней все-таки взять systick...
Ну у меня сделано то же самое на таймере. Systick я так понял работает с приоритетом 15, т.е. самый последний.
Он вообще незнамо что покажет. Разумеется, если пожертвовать точностью, то проблем нет.
Систик-прерывание (даже с приоритетом 15) даст лишь джиттер внутри 1 мсек (при любом вменяемом количестве прерываний от остальной периферии будет меняться только джиттер), но он всё равно каждую миллисекунду будет отрабатывать, т.к. из 120000 тактов между систиками он точно найдёт себе дырочку отработать свои 10-20 тактов при любом вменяемом количестве остальных высокоуровневых прерываний.


Последний раз редактировалось VladyMile 17 сен 2019, 18:16, всего редактировалось 2 раз(а).

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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3643
SysTick - это 24-битный счетчик. Вот вам и субсчет, используйте значение из счетчика систика.
Хотя при работе МК на частоте от 16 МГц и выше систик с периодом прерываний в 1 мс ведет себя достаточно хорошо.


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

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2618
Откуда: Русь, Новороссийск
У него аж 120 МГц и систик целых 1 мс - всё будет хорошо.


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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3643
Ну тогда тем более! О чем там волноваться то! :))) Можно даже с точностью до 0,1 мс.


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

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 54
VladyMile писал(а):
У него аж 120 МГц и систик целых 1 мс - всё будет хорошо.

Сделал SysTick, чтобы удовлетворить Ваши предположения.
Послал 256 сообщений со скоростью 1бит сообщения в 2 мкс (500КГЦ).
Мы замеряем отсыл и приёмку(systick).

Разницу Timestamp будем считать от первого до последнего:
Отсылка:
0xC610BE01 - 0xC5162417 = 16423402 / 1000 = 16423 мс
Приём (считаем для простоты сразу в миллисекундах):
0x7e0c - 0x4106 = 15622 мс

И того - секунда погрешности!


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

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3996
Откуда: КЧР, поселок Нижний Архыз
VladyMile писал(а):
я в своих проектах не инкременчу счётчик в прерывании, а только ставлю флаг

И получается хороший шанс пропустить миллисекунду-другую...
NStorm писал(а):
Он вообще незнамо что покажет. Разумеется, если пожертвовать точностью, то проблем нет.

Хм, никогда не замечал, чтобы миллисекунды пропадали...
NStorm писал(а):
попробуйте нагрузить их высокопроизводительной нагрузкой - непрерывным чтением и записью на частоте 50 мгц.

Тогда только выделять 32-битный таймер, пусть себе тикает сам по себе.
BusMaster писал(а):
И того - секунда погрешности!

Может, в коде проблема?


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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3643
zacher, значит, вы в где-то что-то не так сделали, если погрешность в секунду. Возможно, вы в прерывании где-то долго висите и не позволяете прерыванию систика "выйти в эфир". Или где-то ошибаетесь в расчетах. Пока я не очень понимаю, что вы там делаете и как считаете.


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

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1002
zacher, это стёб такой? Запускаешь любой таймер, чтобы тикал с частотой 0,1 мс к примеру. В начале измерения обнуляешь его счётчик, в конце измерения считываешь. Накладные рамсходы 3 ассемблерных команды на запуск и столько же на чтение результата. Остаётся только подобрать таймер по разрядности, чтобы не переполнялся за максимально требуемый период измерения. На выбор 16, 24 и 32-битные таймеры есть.

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


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

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2277
Eddy_Em писал(а):
NStorm писал(а):
Он вообще незнамо что покажет. Разумеется, если пожертвовать точностью, то проблем нет.

Хм, никогда не замечал, чтобы миллисекунды пропадали...
NStorm писал(а):
попробуйте нагрузить их высокопроизводительной нагрузкой - непрерывным чтением и записью на частоте 50 мгц.

Тогда только выделять 32-битный таймер, пусть себе тикает сам по себе.

Вот как вы так цитируете?! Я такого не писал!


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

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


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

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


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

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

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