Easyelectronics.ru

Электроника для всех
Текущее время: 23 авг 2017, 20:29

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



    • JLCPCB for PCB Prototyping: 10 шт. 2-слоя 100*100mm 2$(около 140rub), изготовление за 24 часа.
    • Создание принципиальных схем и проектирование печатных плат
    • Крупнейший китайский онлайн магазин радиодеталей. Скидка 50%
    • Просмотр GERBER файлов

Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: Время и RTOS
СообщениеДобавлено: 08 авг 2017, 18:46 
Свой человек
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 145
Откуда: Таганрог
Доброго времени суток!

Имеется МК STM32L4 пользующийся услугами FreeRTOS. Есть возможность получить время сети, синхронизированное по NTP в формате UTC либо в более удобно виде (YYYY-MM-DD|HH:MM:SS).

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

Собственно вопрос: а можно ли убедить операционку облегчить мне задачу и считать время не с 0 каждый раз, а с некоего значения, полученного по сети? Таким образом можно получить систему выдающее реальное время, а не относительное.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время и RTOS
СообщениеДобавлено: 08 авг 2017, 19:01 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 233
Создайте свою собственную переменную времени и инкрементируйте еёйную по тикам РТОС. Там есть коллбек-функция для системных тиков vApplicationTickHook, становится доступной при дефайне configUSE_TICK_HOOK. В функции vApplicationTickHook инкрементируйте переменные вашего юзер-времени.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время и RTOS
СообщениеДобавлено: 08 авг 2017, 19:07 
Свой человек
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 145
Откуда: Таганрог
Вариант то конечно хороший,
вот только: разве сия функция не имеет наиболее низкий приоритет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время и RTOS
СообщениеДобавлено: 08 авг 2017, 19:14 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 233
Она имеет приоритет SysTick_Handler. Да, приоритет этого прерывания установлен очень низким, но если вы не наговнокодите с прерываниями то степени зависания операционки или с чрезмерно высокой частотой систиков, то ваше время будет отсчитываться. Точность времени зависит от точности изначального тактирования МК. HSI для отсчетов времени совершенно не подходит, очень большая погрешность.
Высокий приоритет для отсчета времени не нужен. Если любое высокоприоритетное прерывание гарантированно завершается в период между двумя систиками, то пропуска тиков не будет, будет только джиттер (дрожание) между двумя соседними отсчетами тиков, но в целом на длинном промежутке погрешности нивелируются.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время и RTOS
СообщениеДобавлено: 08 авг 2017, 19:23 
Свой человек
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 145
Откуда: Таганрог
Используется кварц в качестве источника тактов.

Прерываний особо много и нет. Единственное затяжное от DMA где приходится гасить SPI, да и то его длительность десяток мкс. Однако есть длинные задачи, порядка 40 мс с низким приоритетом.

Время тика стандартное - 1мс.

Будем пробовать,


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время и RTOS
СообщениеДобавлено: 08 авг 2017, 19:33 
Старожил
Аватара пользователя

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

Про "стандартное время тиков 1 мс". Это "стандартное" может вылезти вам боком, если частота МК 8 и менее мегагерц. Чем ниже системная частота МК, тем больше издержек времени будет уходить на работу операционки со "стандартными" тиками в 1 мс. Образно говоря, КПД падает, доля времени на переключения задач возрастает по сравнению с долей времени на полезную работу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время и RTOS
СообщениеДобавлено: 08 авг 2017, 23:40 
Свой человек
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 145
Откуда: Таганрог
Частота 12,288 МГц не больше, не меньше.
Время переключения контекста порядка 70мкс, согласно замеру логическим анализатором. В целом устраивает все, из сложного вот только работа со временем.

Да, система вытесняющая насколько я понимаю. Опыта работа с операционкой маловато ещё у меня. Потому и вопросы часто глупые))

Немного офтопа: кто нибудь пробовал использовать компилятор 6версии от KEIL (тот который armclang) совместно с FreeRTOS?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время и RTOS
СообщениеДобавлено: 09 авг 2017, 00:02 
Старожил

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 398
Откуда: Германия
CheMax писал(а):
Собственно вопрос: а можно ли убедить операционку облегчить мне задачу и считать время не с 0 каждый раз, а с некоего значения, полученного по сети? Таким образом можно получить систему выдающее реальное время, а не относительное.


Плохая идея. Очень.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время и RTOS
СообщениеДобавлено: 09 авг 2017, 01:28 
Свой человек
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 145
Откуда: Таганрог
dev писал(а):
Плохая идея. Очень.


Какие ваши аргументы?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время и RTOS
СообщениеДобавлено: 09 авг 2017, 03:07 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1791
Откуда: Новокузнецк
Если не нужно считать милисекунды, то просто создать задачу, которая будет каждые 1000 мс инкрементировать переменную. В переменной Unix Time.
Код:
vTaskDelayUntil(1000, &prevTickValue);
mutex_lock();
unixTimeCounter++;
mutex_unlock();


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

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время и RTOS
СообщениеДобавлено: 09 авг 2017, 08:49 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2283
У себя так и сделано. Есть "эталон", в виде DS3231, и резервные софтовые часы, если вдруг DS3231 отвалится. Просто таск, с низким приоритетом:
Код:
// Резервные часы
void   RTC_Tick1sRTOS( void *pvParameters )
{
   portTickType xLastWakeTime;
   xLastWakeTime = xTaskGetTickCount();
   while(1)
   {
      TickRTC_1sec++;
      vTaskDelayUntil(&xLastWakeTime, 1000);
   }
}


Преобразование счетчика:
Код:
#define JD0               2451911         // дней до 01 янв 2001 ПН

typedef enum
{
   RTC_INIT = 1,      // Еще не запустились
   RTC_OK,            // все хорошо
   RTC_RESERVE,      // ошибка, работаем с резервным RTC
}List_RTC_Stat;

typedef struct {
         uint8_t      Sec;            //Секунды
         uint8_t      Min;            //Минуты
         uint8_t      Hours;            //Часы
         uint8_t      Day;            //День недели (1-7)
         uint8_t      Date;            //День
         uint8_t      Month;            //Месяц
         uint8_t      Year;            //Год
         int8_t      Temp_Int;         //Температура (целая часть) (-127-127)
         uint8_t      Temp_Fract;         //Дробная часть (0-3), каждая единица - 0.25°С
   List_RTC_Stat      Status;            //Статус часов
} _RTC_DATA_STRUCT;

uint32_t   TimeToCounter(_RTC_DATA_STRUCT * ftime)
{
   uint32_t   JDN;
   uint16_t   y;
   uint8_t      m, a;

   // Вычисление необходимых коэффициентов
   a = (14 - ftime->Month)/12;
   y = ftime->Year +2000 + 4800 - a;            //2000 т.к. у нас дата идет от 0 до 99
   m = ftime->Month + (12*a) - 3;
   // Вычисляем значение текущего Юлианского дня
   JDN = ftime->Date;
   JDN+= (153*m + 2)/5;
   JDN+= 365*y;
   JDN+= y/4;
   JDN+= -y/100;
   JDN+= y/400;
   JDN-= 32045;
   JDN-= JD0;                              // так как счетчик у нас нерезиновый, уберем дни которые прошли до 01 янв 2001
   JDN*= 86400;                           // переводим дни в секунды
   JDN+= (ftime->Hours*3600);                  // и дополняем его секундами текущего дня
   JDN+= (ftime->Min*60);
   JDN+= (ftime->Sec);
   // итого имеем количество секунд с 00-00 01 янв 2001
   return JDN;
}
void   CounterToTime(uint32_t counter,_RTC_DATA_STRUCT* ftime)
{
   uint32_t ace;
   uint8_t b,d,m;

   ace = (counter/86400) + 32044 + JD0;
   b = (4*ace + 3)/146097;
   ace = ace - ((146097*b)/4);
   d = (4*ace + 3)/1461;
   ace = ace - ((1461*d)/4);
   m = (5*ace + 2)/153;

   ftime->Date = ace - ((153*m+2)/5) + 1;
   ftime->Month = m + 3 - (12*(m/10));
   ftime->Year = 100*b + d-4800 + (m/10) - 2000;
   ftime->Hours = (counter/3600)%24;
   ftime->Min = (counter/60)%60;
   ftime->Sec = (counter%60);
}

Функции откуда-то честно стырил, уже не помню.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время и RTOS
СообщениеДобавлено: 09 авг 2017, 10:16 
Старожил

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 398
Откуда: Германия
CheMax писал(а):
dev писал(а):
Плохая идея. Очень.


Какие ваши аргументы?


Время - очень интересная штука, оно гораздо сложнее, чем кажется из обыденной жизни. В частности, оказывается, что оно ни равномерно ни даже монотонно.

* При старте устройства NTP может быть недоступен
* NTP наверняка не stratum 0, т.е. точного времени он сам не знает, поэтому его показания будут плавать.
* Есть такая замечательная вещь, как високосная секунда. И надо очень сильно думать, что с ней делать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время и RTOS
СообщениеДобавлено: 09 авг 2017, 12:44 
Свой человек
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 145
Откуда: Таганрог
dev писал(а):
* При старте устройства NTP может быть недоступен
* NTP наверняка не stratum 0, т.е. точного времени он сам не знает, поэтому его показания будут плавать.
* Есть такая замечательная вещь, как високосная секунда. И надо очень сильно думать, что с ней делать.


*при старте не доступен, тут спорить нет смысла. появляется примерно через 10 секунд после подключения к серверу времени. Однако, и железка начинает свою работу только после подключения. Таким образом, дефакто считаем что время все же есть всегда. Но все же, предполагается периодическая подсинхронизация. Алгоритмов много, но для выбора нужно определиться кто будет отсчитывать время;

*точность которую обеспечит сервер в данном конкретном случае хватит за глаза, ибо точность нужна порядка 1мс. К тому периодическая подсинхронизация поможет во время обнаружить начавшийся разбег часов;

* не-а, не надо. не предполагается сверх долгая работа устройства. а на коротких интервалах достаточно совпадения времени на сервере и на железке

Итак, два из трех аргумента отпали, оставшийся сомнителен. Ещё аргументы будут, готов рассмотреть и принять во внимание


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время и RTOS
СообщениеДобавлено: 09 авг 2017, 12:45 
Свой человек
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 145
Откуда: Таганрог
elisey писал(а):
Если не нужно считать милисекунды, то просто создать задачу, которая будет каждые 1000 мс инкрементировать переменную. В переменной Unix Time.
Код:
vTaskDelayUntil(1000, &prevTickValue);
mutex_lock();
unixTimeCounter++;
mutex_unlock();


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


Точность нужна до 1мс. К сожалению Ваш способ не совсем подходит


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время и RTOS
СообщениеДобавлено: 09 авг 2017, 12:50 
Свой человек
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 145
Откуда: Таганрог
Hold,
Не совсем подходит. Софтовые часы конечно можно завести, но с шагом 1 мс будет грустно по расходам. К тому же, есть один поток, обработка которого длится порядка 40мс, приоритет ниже только у отладочных функций.

Буду пробовать идею с использованием vApplicationTickHook для отсчета время, из предложенного самый оптимальный вариант.

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

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


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

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


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

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

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