Easyelectronics.ru

Электроника для всех
Текущее время: 22 июл 2018, 23:10

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



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

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

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

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

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

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


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

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


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

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


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

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


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

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

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

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

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


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

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

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


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

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

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

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


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

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


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


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

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


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


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

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


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

_________________
elisey.su


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

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2657
У себя так и сделано. Есть "эталон", в виде 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
Сообщения: 553
Откуда: Германия
CheMax писал(а):
dev писал(а):
Плохая идея. Очень.


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


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

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


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

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


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

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

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

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


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

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


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


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


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

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время и RTOS
СообщениеДобавлено: 11 дек 2017, 16:32 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 ноя 2010, 20:11
Сообщения: 59
Откуда: Омск
Наверное, я сейчас задам странный вопрос, но...
Почему бы не использовать уже имеющийся ВНУТРЕННИЙ точный таймер? Я говорю о блоке RTC.
Лично у меня ОС хоть и работает от кварца и имеет какую-то, предположим, высокую точность интервалов времени, но как-то внятно получить эти самые данные аптайма - не вышло (пока что борюсь, но есть мысль, что банально забью и буду использовать более забавные костыли).
Самый простой способ получить время, имея RTC - считать два регистра:
RTC->DR + RTC->TR - календарь + время. Если есть желание получить милисекунды - нет ничего проще.
uint16_t ms = 1000-(RTC->SSR * 1000 / 1024);
Да, погрешность, но это будет лучше, чем высчитывать их из тиков таймера, которые могут быть пропущены, либо приостановлены.

Итого в консоли получаю:
Код:
[2017-12-11 16:58:44.858] System starting.
[2017-12-11 16:58:44.858] System Frequency: 96MHz
[2017-12-11 16:58:44.858] Initializing RTC.
[2017-12-11 16:58:44.858] RTC Already started.
<...> Инициализация периферии, карты памяти...
[2017-12-11 16:58:44.988] Starting FreeRTOS.
[2017-12-11 16:58:44.988] System Ready.


Запомнить штамп времени? Не вопрос:
Код:
uint32_t now, reg_data;
reg_data = RTC->TR;
now = (reg_data & 0x0F) + (((reg_data >> 4) & 0x07) * 10) + (((reg_data >> 8) & 0x0F) * 60) + (((reg_data >> 12) & 0x07) * 600) + (((reg_data >> 16) & 0x0F) * 3600) + (((reg_data >> 20) & 0x03) * 36000);

Получаем секунды с начала суток.
Если хочется - можно всё перевести в Unix-time нехитрыми функциями. Кстати, сразу получится упрощёный интерфейс.


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

Зарегистрирован: 01 ноя 2011, 23:51
Сообщения: 532
dev писал(а):
CheMax писал(а):
dev писал(а):
Плохая идея. Очень.


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


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

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


Однако! Чувствуется опыт работы с Системами Единого Времени..


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

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 222
Откуда: Таганрог
-Alan- писал(а):
Наверное, я сейчас задам странный вопрос, но...
Почему бы не использовать уже имеющийся ВНУТРЕННИЙ точный таймер? Я говорю о блоке RTC.


а потому что точность нужна порядка единиц мс а без внешнего часового кварца это сложно. а его нет и не будет.

P.S. вопрос был решен несколько дней назад, использование хитрой мат.обработки времени от NTP и внутреннего мс счетчика.
Точность хода проверяли при помощи генерации одиночного импульса каждую 1с на orangepi и на МК. Расхождение получилось менее 4мс. Приводка при расхождении часов отрабатывает корректно.


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

Зарегистрирован: 23 ноя 2010, 20:11
Сообщения: 59
Откуда: Омск
CheMax писал(а):
-Alan- писал(а):
Наверное, я сейчас задам странный вопрос, но...
Почему бы не использовать уже имеющийся ВНУТРЕННИЙ точный таймер? Я говорю о блоке RTC.
а потому что точность нужна порядка единиц мс а без внешнего часового кварца это сложно. а его нет и не будет.

Часы могут тактироваться от системного кварца. Нужно только подобрать правильные значения регистров.

Лично для себя решил не слишком заморачиваться с ТАКИМИ временнЫми интервалами. Точность - конечно, хорошо, но кванты времени в ОС - это дело диспетчера задач. И чем их больше - тем сильнее может дрожать время наступления события (фактически, его обработки внутри потока).
Лично я бы попробовал для очень-критичной-ко-времени-задачи найти другое решение.
Кстати, тот же DWT позволяет считать такты ядра. Так что там точность будет зависеть только от внешнего кристалла / генератора. А это может быть менее 25MHz - 20ppm

В любом случае, поздравляю с решением =)


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

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 222
Откуда: Таганрог
Дело не в том, что хотелось, а в том что надо было)
это ж не хоббийный проект, а основная работа так сказать.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время и RTOS
СообщениеДобавлено: 25 янв 2018, 14:13 
Здравствуйте!

Зарегистрирован: 25 янв 2018, 13:41
Сообщения: 4
Доброго времени суток! Сразу к делу.
Задача: выводить время на дисплей из задачи FreeRTOS стандартными функциями HAL.
Суть проблемы: В отладчике Keil работает исправно, а в железе неисправно. А именно, берет время один раз и выводит постоянно, т. е. не меняя первое значение. При этом все остальные задачи работают исправно.

Время беру стандартной функцией:

HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BCD);

Указатели на структуры времени прописаны

RTC_HandleTypeDef hrtc;
RTC_TimeTypeDef sTime;

Что с этим делать подскажите пожалуйста.


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

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 459
При внешней синхронизации не нужно перестраивать время сразу, вместо этого необходимо накапливать ошибку в плюс или минус, с последующим усреднением. И вот тогда уже можно переустановить часы. Синхронизация возможна даже на уровне nc, если заблаговременно вычислить все задержки. Другой вопрос - а нужно ли...

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время и RTOS
СообщениеДобавлено: 25 янв 2018, 19:00 
Здравствуйте!

Зарегистрирован: 25 янв 2018, 13:41
Сообщения: 4
Возможно я чуток неясно выразился, время я устанавливаю в начале программы, еще до старта FreeRTOS, а выводить хочу в одной из задач. Просто выводить текущее время на дисплей, меняя его раз в минуту. Ничего сверхестественного. И не могу понять почему HAL_RTC_GetTime берет его только один раз, а потом не хочет менять значения структуры sTime. Как будто RTC вырубается и больше не считает. Но при этом в отладчике все работает правильно.


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

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 459
Не вырубается, а лочится. Для перезаписи нужно сбросить часы, HAL_RTC_GetTime не выполняет сброс.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время и RTOS
СообщениеДобавлено: 25 янв 2018, 21:33 
Здравствуйте!

Зарегистрирован: 25 янв 2018, 13:41
Сообщения: 4
Простите, не понял, если я сброшу часы, то мне придется их заново выставлять. А какой в этом смысл? И если так то как их разлочить?


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

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


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

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


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

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

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