Официальный форум СВД Встраиваемые Системы
03 Декабря, 2016, 05:23:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Синхронизация время QNX 6.5  (Прочитано 1089 раз)
gralexi
Интересующийся

Сообщений: 2


« : 24 Октября, 2013, 13:30:33 »

Стоит задача синхронизации системного времени по прерыванию в QNX 6.5.

Загвоздка в определении точное время в данный момент времени  - в точности наносекунды.

Есть функция ClockTime(), которая должна выдавать текущее время в наносекундах, но она выдает значение времени кранное тику процесса. В чем проблема? Для  этих целей есть функции times().

Для этого запустил следующую программу:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/neutrino.h>
#include <stdint.h>
int main(int argc, char *argv[]) {

   volatile int i;
   uint64_t  ClockCycles_x[10000];
   uint64_t  ClockCycles_z;
   struct _clockperiod new_period;
   struct _clockperiod old_period;

   new_period.fract = 0;
   new_period.nsec = 2500000;
   ClockPeriod(CLOCK_REALTIME, &new_period, &old_period, 0);
  printf ("===--= %li\n", old_period.nsec);

   for(i = 0; i < 100000; i++)
   {
      ClockTime( CLOCK_REALTIME , NULL, &ClockCycles_x); //CLOCK_REALTIME CLOCK_MONOTONIC
   }


   for(i = 0; i < 10000-1; i+=1)
   {
      if (ClockCycles_x[i+1] - ClockCycles_x != 0)
         printf("%4i %12lli\n", i,(unsigned long long)(ClockCycles_x[i+1] - ClockCycles_x));
   }

   return EXIT_SUCCESS;
}

Результат
===--= 2500217
 402      2500217
1209      2500217
2054      2500217
2861      2500217
3719      2500217
4573      2500217
5435      2500217
6282      2500217
7127      2500217
8005      2500217
8872      2500217
9735      2500217   


Записан
Андрей Сеньков
Администратор
Опытный пользователь

Сообщений: 262



WWW
« Ответ #1 : 28 Октября, 2013, 10:38:54 »

Здравствуйте!

Описанное Вами поведение является корректным, поскольку функция ClockTime() (как и другие подобные функции) выдает текущее время в наносекундах, но с определенной точностью. Точность отсчета времени в ОС определяется разрешающей способностью системного таймера (ticksize), для изменения которой используется функция  ClockPeriod().

Подробнее о механизме формирования системного времени и его точности можно прочитать  в документации: http://www.qnx.com/developers/docs/6.5.0_sp1/index.jsp?topic=%2Fcom.qnx.doc.neutrino_getting_started%2Fs1_timer.html

Функция times() применяется для другой цели - учета используемого задачей процессорного времени. 

Записан

gralexi
Интересующийся

Сообщений: 2


« Ответ #2 : 29 Октября, 2013, 09:51:01 »

Спасибо, Андрей Сеньков.
Я уже ознакомился со своей ошибкой (http://www.qnx.com/developers/docs/6.5.0_sp1/index.jsp?topic=%2Fcom.qnx.doc.neutrino_getting_started%2Fs1_timer.html)!
Тогда как узнать точное время?
Как определить время, пройдённое между обработчиком прерывания и  событие-прерывания  SEGEV_INTR? Что лучше  обрушатся к счетчику 82С54, отвечающий за Time of Day, напрямую по портам или использовать  ClockCycles()?   
Записан
Андрей Сеньков
Администратор
Опытный пользователь

Сообщений: 262



WWW
« Ответ #3 : 29 Октября, 2013, 19:01:39 »

Что лучше  обрушатся к счетчику 82С54, отвечающий за Time of Day, напрямую по портам или использовать  ClockCycles()?

В общем случае, использовать сервисные функции ОС, например, ClockCycles(), предпочтительнее, чем обращаться к аппаратуре напрямую.

Добавлю, что функция ClockCycles() работает с аппаратным счетчиком тактов процессора, а не с таймером.
Записан

frolik0777
Интересующийся

Сообщений: 5


« Ответ #4 : 11 Ноября, 2013, 05:25:34 »

Как вариант для определения точного времени можно использовать следующий алгоритм:
1. В обработчике прерывания 0 запоминать ClockCycles
2. При вызове функции точного времени брать текущее время (ClockTime) + время прошедшее с момента последнего прерывания (ClockCycles)
3. Логически учесть что в процессе обработки данных может возникнуть прерывание 0
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP © 2002-2016 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на forum.kpda.ru обязательна.

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines | © Aiwan. Kolobok smiles | Sitemap
Valid XHTML 1.0! Valid CSS!
Сайт СВД ВС

В последний раз google посещал эту страницу 28 Октября, 2016, 16:51:08