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

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Независимое время в программе  (Прочитано 2533 раз)
Egor
Пользователь

Сообщений: 19


« : 29 Июля, 2014, 07:13:21 »

Здравствуйте. Столкнулся с такой проблемой: Требуется синхронизировать время компьютера под управлением QNX 4.25 от внешнего источника. Использую для корректировки времени функцию clock_settime(). Проблема заключается в том, что эта функция сбрасывает таймеры CLOCK_REALTIME, соответственно в другой программе запущенной на QNX начинаются проблемы.
Код:
      case WAIT_REPLY:
                timespec currtime;

                if (clock_gettime(CLOCK_REALTIME, &currtime) < 0)
                {
                    cerr << "Can't get time: errno = " << errno << endl;
                }
                long int delay = ((currtime.tv_sec - sendtime.tv_sec)*1000000000. + (currtime.tv_nsec - sendtime.tv_nsec)) / 1000000.;
                // cerr << "DELAY = " << delay << endl;

                if (delay < (1000 + timeout)) return;

                state = READY_TO_SEND;
       case READY_TO_SEND:
                outd->Write(outpack);
                if (clock_gettime(CLOCK_REALTIME, &sendtime) < 0)
                {
                    cerr << "Can't get time: errno = " << errno << endl;
                }
                state = WAIT_REPLY;
Попробовал поменять в этом коде clock_gettime() на times() - время прошедшее с момента запуска программы. Но в структуре все нули. Мне кажется, что отключен time accounting. Как это проверить? как его включить? Может быть есть другая возможность отсчитывать независимое от перевода время?

 P.S. Проект разрабатывался еще до меня, разработчики естественно, уже уволились и уехали )) я теперь пытаюсь его поддерживать. Сложность еще в том, что экземпляр системы для которой требуется новая программа синхронизации времени, находится в паре тысяч километров от меня и удаленного доступа я к ней не имею. Могу только через персонал на позиции отправлять файлы,скрипты обновлений. Персонал не имеет root доступа.
Записан
Антон Падалко
Пользователь

Сообщений: 34


« Ответ #1 : 29 Июля, 2014, 08:22:29 »

Попробовал поменять в этом коде clock_gettime() на times() - время прошедшее с момента запуска программы. Но в структуре все нули. Мне кажется, что отключен time accounting. Как это проверить? как его включить?
Вам не кажется, проверить можно посмотрев опции с которыми запущен менеджер процессов Proc32: sin -P Proc32 arg
Опция "-a" отключает time accounting, чтобы он заработал надо пересобрать образ загрузки исключив эту опцию из строки запуска Proc32
Записан
Egor
Пользователь

Сообщений: 19


« Ответ #2 : 29 Июля, 2014, 08:49:59 »

sin показывает что Proc32 запущен :
/boot/sys/Proc32 -l 1 -f 16 1024 32768

При этом в tms структуре все равно ноль
Код:
       case WAIT_REPLY:
                clock_t currtime;
                times(&buffer);
                currtime = buffer.tms_stime;
//                if (clock_gettime(CLOCK_REALTIME, &currtime) < 0)
//                {
//                    cerr << "Can't get time: errno = " << errno << endl;
//                }
                clock_t delay = (currtime - sendtime);

                cerr << "DELAY = " << delay << "= " <<currtime <<"-" <<sendtime<< endl;
                if (delay < (1000 + timeout)) return;
                
                state = READY_TO_SEND;
        case READY_TO_SEND:
                outd->Write(outpack);
                times(&buffer);
                sendtime = buffer.tms_stime;
//                if (clock_gettime(CLOCK_REALTIME, &sendtime) < 0)
//                {
//                    cerr << "Can't get time: errno = " << errno << endl;
//                }
                cerr<<"sendtime = "<< buffer.tms_stime<<endl;
                state = WAIT_REPLY;
Может существуют какие-либо другие варианты решения ситуации с переводом времени. Что-нибудь подобное uptime()?
« Последнее редактирование: 29 Июля, 2014, 13:11:23 от Egor » Записан
Egor
Пользователь

Сообщений: 19


« Ответ #3 : 30 Июля, 2014, 06:24:19 »

Сегодня попробовал запустить простенькую программу:
Код:
int main()
{
struct tms buffer;
for(int i = 0; i< 10; i++)
sleep(1);
times(&buffer);
cout << "times = " << buffer.tms_stime <<" "<< buffer.tms_utime <<" "<<buffer.tms_cstime<<" "<<buffer.tms_cutime<<endl;
return 0;
}
Все поля структуры 0. Хотя я ожидаю там увидеть 10*CLOCK_PER_SEC, верно ли я понимаю?
Proc32 в памяти висит без -a : /boot/sys/Proc32 -l 1 -f 16 1024 32768
« Последнее редактирование: 30 Июля, 2014, 06:29:19 от Egor » Записан
Александр Покид
Сотрудник СВД ВС
Интересующийся

Сообщений: 4


WWW
« Ответ #4 : 31 Июля, 2014, 09:42:43 »

Возможно, Вам подойдёт вариант с вычитыванием 64-разрядного счетчика CPU (аналог функции ClockCycles() из QNX6).
Записан

Egor
Пользователь

Сообщений: 19


« Ответ #5 : 31 Июля, 2014, 12:53:41 »

Спасибо, за наводку. Сделал через вызов rdtsc. Запустил на прогонку, пока что работает, конечно решение не очень получилось, аппаратно зависимо, да еще и с погрешностью, но эта погрешность мне не критична.
Записан
Александр Покид
Сотрудник СВД ВС
Интересующийся

Сообщений: 4


WWW
« Ответ #6 : 31 Июля, 2014, 14:19:43 »

Небольшие пояснения по поводу работы функции times(). Структура tms содержит 4 поля:

tms_utime - время исполнения инстукций вызывающего процесса
tms_stime - время исполнения инструкций вызывающего процесса в пространстве ядра
tms_cstime - сумма системного времени выполнения всех дочерних процессов
tms_cutime - сумма времени выполнения всех завершенных дочерних процессов

В вашем случае все поля данной структуры содержали нули, так как время выполнения инструкций процесса было ничтожно мало(Время проведенное в ожидании в функции sleep() не учитывается, так как выполнение потока на время ожидания приостанавливается).
Записан

Страниц: [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 посещал эту страницу 15 Октября, 2016, 20:56:39