Easyelectronics.ru

Электроника для всех
Текущее время: 26 май 2020, 18:45

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



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

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

Зарегистрирован: 19 май 2015, 01:52
Сообщения: 71
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
Сообщения: 4601
Откуда: КЧР, поселок Нижний Архыз
Не ту кнопку нажал. Тут хрен поймешь, куда жамкать, чтобы процитировать: в нормальном виде кнопка снизу, а в идиотском, оказывается, сверху!


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

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

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


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

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

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


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


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

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

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


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

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


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

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


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

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


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

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


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

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


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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Абсолютный штамп времени от старта системы, с тиками и субтиками:
Код:
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
Сообщения: 1434
Только volatile не хватает кое-где.


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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
volatile timestamp_t timestamp;
volatile uint32_t systick_count;


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

Зарегистрирован: 14 июн 2015, 17:41
Сообщения: 2678
Откуда: Русь, Новороссийск
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
Сообщения: 243
я сделал так
конфигурирую таймер фри ран
Код:
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
Сообщения: 71
Изящное решение.


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


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


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

Сейчас этот форум просматривают: AstraHard, Google [Bot], Maik


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

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

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