Страниц: 1 [2]
  Печать  
Автор Тема: Задержка в программе. HELP! HELP! HELP!  (Прочитано 11328 раз)
CaptHowdy
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля WWW
« Ответ #15 : Августа 02, 2003, 02:51:00 pm »


ed1k пишет:
Так вам 100 мкс или 10 мкс надо?

Надо, конечно же, 10 мкс. Но если при 100 мкс валится система...

Если найду рассуждения на этот счет человека из qnx training centre - кину сюда... давно это, правда, было.

Это было бы очень интересно!
[addsig]
Записан
olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #16 : Августа 02, 2003, 11:21:00 pm »


ed1k пишет:
Вообще, я не согласен с Olej, что маленький ClockPeriod не увеличивает существенно нагрузку на систему. Это имеет место при не нагруженной системе. Шедулировать особо нечего. Если система загружена, то размер тика существенно влияет. Если найду рассуждения на этот счет человека из qnx training centre - кину сюда... давно это, правда, было.

А я "совсем так" и не утверждал, конечно нагружает, природу не обманешь - вопрос в том, начиная с какого ClockPeriod и в какой степени нагружает... Было бы очень интересно.
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #17 : Августа 03, 2003, 01:52:00 am »

По просьбам трудящихся. С примером на сях, кому любопытно:

****ect: Re: Timer Interrupt
From: David Gibbs <dagibbs@qnx.com>
Newsgroups: comp.os.qnx

David Bacon <dbacon@qnx.com> wrote:
> Regarding the use of ClockPeriod(), David, I have often seen you warn
> ominously about the overhead associated with cranking up the resolution, but
> when I take it right up to 10 microseconds (really ~9219 nanoseconds because
> you can only put integers into that decrement counter in the timer chip) on
> a 333MHz Pentium II, the desktop shelf System Monitor's CPU display seems to
> be showing only around 5% overhead, if that.  Neutrino really does handle
> timer interrupts quite efficiently, even 100K of them per second!  

The issue isn't, so much, in an idle system -- it is when you start
doing things.

It now, means, that say you start a calculation that would take 1s to
complete.  If you had a ticksize of 1ms  -- that would get interrupted
1000 times, with 1000 switches into kernel space, and back out again.

If you take that ticksize down to 10 microseconds, you are now getting
interrupted 100,000 times -- this means 100x as many context switches
etc.  

For instance, I have a little s/r/r test program, it does a bunch
of 4K Send & 4K replies, then figures out how many clock cycles it
took to complete.

With a ticksize of 1ms -- I get a ipc cost of 4850 clock cycles
(850 Mhz Pentium 3).  If I take the ticksize down to 10 microseconds,
I get an ipc cost of 6140 clock cycles.  That's a little over 26%
worse.

If I do 0 length S/R/R, the numbers I get are 1950 and 2440 --
again about 25% cost.

I would consider 25% a significant overhead, which is why I warn
about the cost of doing this.

Of course, using some other interrupt at this frequency will
impose similar overhead -- but if it can be used more flexibly,
e.g. only set it to interrupt once, 50 microseconds after needed,
then disable; then re-enable next time -- that could significantly
reduce the interrupt overhead.

Still, choosing an interrupt where we don't do any work
(e.g. updating time, checking the timer chain) will also
reduce the overhead at each interrupt.

-David

P.S. My S/R/R test program:

/*
*  sendrec.c
*
*/

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <sched.h>
#include <ctype.h>
#include <stdint.h>
#include <sys/neutrino.h>
#include <sys/stat.h>
#include <sys/syspage.h>

void *worker( void * );

#define NUM_LOOP 100000

int     chid;           /* the channel id that the server will receive on */
char    *device;        /* the device that the worker thread will read from */
char    *progname = "sendrec";
char   buf[4096];

int
main( int argc, char **argv )
{
   message_t   msg;
   reply_t     reply;
   int         rcvid;
   
  // printf("setprio returned %d
", setprio(0,62));

   chid = ChannelCreate( 0 );
   if ( chid == -1 ) {
       printf( "%s: (server) couldn't create a channel: %s
",
               progname, strerror(errno) );
       exit( EXIT_FAILURE );
   }

   if (!fork()) worker(NULL);
   
   while (1) {
      rcvid = MsgReceive(chid, buf, 4096, NULL );

       MsgReply( rcvid, 0, buf, 4096 );
   }

   
   return 0;
}

void *
worker( void *unused )
{
   int         coid;
   int ret;
   int i;
   uint64_t before, after;
   uint64_t loop_delta, ipc_delta;
   uint64_t ipc_cost;

   coid = ConnectAttach( 0, getppid(), chid, _NTO_SIDE_CHANNEL, 0 );

   before = ClockCycles();
   for(i = 0; i<NUM_LOOP; i++);
   after = ClockCycles();
   loop_delta = after - before;

   before = ClockCycles();
   for(i = 0; i<NUM_LOOP; i++)
   {
       ret = MsgSend( coid, buf, 4096, buf, 4096 );
   }
   after = ClockCycles();
   ipc_delta = after - before;

   printf("loop_delta: %lld, ipc_delta: %lld
", loop_delta, ipc_delta );
   ipc_cost = (ipc_delta-loop_delta)/NUM_LOOP;
   printf("ipc overhead = %lld
", ipc_cost );
   printf("cycles/sec is %lld
", SYSPAGE_ENTRY( qtime )->cycles_per_sec );
   kill(getppid(), SIGTERM );
   exit(0);
   return( NULL );
}

--
QNX Training Services
http://www.qnx.com/support/training/
Please followup in this newsgroup if you have further questions.
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #18 : Августа 03, 2003, 02:16:00 am »


CaptHowdy пишет:
Надо, конечно же, 10 мкс...

Вам же ответили, nanospin(). Лучше, наверное, не в самой ISR (контексте ядра), а в потоке-обработчике, которому событие возвращается, после разрешения прерываний . Второй вариант - аппаратные таймеры всякого рода. И третье - пересмотреть идеологию всего аппаратно-программного комплекса, если плата АЦП вашей разработки, то это просто сделать, если нет, почитать внимательно еще раз документацию на плату - может есть лазейка не делать так.
Записан
CaptHowdy
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля WWW
« Ответ #19 : Августа 15, 2003, 12:37:00 pm »


ed1k пишет:
Вам же ответили, nanospin().

Ответить, то ответили... Но грузится система жутко!

ed1k пишет:
Второй вариант - аппаратные таймеры всякого рода.

Это вроде бы хорошо, но, как я уже говорил, система падает при повышенных нагрузках

ed1k пишет:
И третье - пересмотреть идеологию всего аппаратно-программного комплекса, если плата АЦП вашей разработки, то это просто сделать, если нет, почитать внимательно еще раз документацию на плату - может есть лазейка не делать так.

Плата не самодельная, это ADLINK NuDAQ ACL8216.
Был вариант запускать ее по прерываниям (все предыдущее описание - без использования прерывания самого железа), но там есть какой-то глюк... (или может у меня самого глюк?) я енту железяку так и не смог по прерыванию запустить
Вот последний вариант - использовать прерывания... Может кто сможет привести пример простенького обработчика прерывания? В моем случае это будет IRQ 10.
[addsig]
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #20 : Августа 15, 2003, 12:52:00 pm »


Плата не самодельная, это ADLINK NuDAQ ACL8216.

Вот последний вариант - использовать прерывания... Может кто сможет привести пример простенького обработчика прерывания? В моем случае это будет IRQ 10.

Это ISA или PCI ?
Записан

CaptHowdy
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля WWW
« Ответ #21 : Августа 15, 2003, 12:59:00 pm »


lestat пишет:
Это ISA или PCI ?

Это плата ISA.
[addsig]
Записан
CaptHowdy
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля WWW
« Ответ #22 : Августа 15, 2003, 01:14:00 pm »

Вообще вся система стоит на ISA Back Plane, т.е. это плата самого Prom PC - ADLINK NuPRO 595 (Intel Tillamuk 266 MMX + Chip&Tech video device + Ethernet (Intel какой-то, щас уже не помню) 100 Mbit + 256 ОЗУ + слоты под перефирию типа DiskOnChip), затем плата АЦП ADLINK NuDAQ ACL8216 (16-ти канальный АЦП с точностью до 100 мкВ - надо добавить, что принимаемые значения не фильтруются, поэтому точные (не прыгающие) значения без фильтрации можно получить в пределах 0,1 В) - нужна для приема данных с тензодатчиков, термодатчиков, датчиков давления. Далее плата ЦАП - управляет скоростью приводов (12-тиканальная) и две цифровых платы (ТТЛ-логики) - необходимы для включения/выключения механизмов. Все железки фирмы ADLINK.
Мною решены все вопросы, кроме АЦП.
Критична именно плата АЦП, т.к. скорость просыпания материала довольно высокая - сам процесс я описывал здесь http://qnx.org.ru/forum/viewtopic.php?topic=1730&forum=10&10
Вообщем такие вот дела...

_________________
**********************
С уважением, CaptHowdy
**********************

[ Это Сообщение было отредактировано: CaptHowdy в 2003-08-15 10:16 ]
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #23 : Августа 15, 2003, 02:16:00 pm »


Это плата ISA.

Но контроллер на мамке PCI ? Попробуй в BIOS выставить Legacy ISA для 10 прерывания. Это самая частая проблема неработы ISA IRQ на матерях с поддержкой PCI.
Записан

CaptHowdy
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля WWW
« Ответ #24 : Августа 15, 2003, 02:31:00 pm »


lestat пишет:
Но контроллер на мамке PCI ? Попробуй в BIOS выставить Legacy ISA для 10 прерывания. Это самая частая проблема неработы ISA IRQ на матерях с поддержкой PCI.

Как я уже говорил - все платы ISA, PCI там и в помине нет, соответственно и в BIOS-e такой опции нет. Мамка - это ISA плата PromPC, ее размер примерно такой же как и у ISA видеокарт, звуковых плат и т.п. Back Plane - это просто плата с разъемами типа ISA и гнездом для подключения питания. На ней больше ничего нет. А сам Prom PC ISA-ориентированный изначально. Т.е. поддержки PCI, повторюсь, нет.

Ситуация в том, что старая версия программы системы управления (писана под Windows NT4 программером, который давным-давно ушел с фирмы) работает с АЦП по прерыванию. Это непреложный факт, который был описан в документации на ПО и подтверждается малой загрузкой процессора, в сравнении с драйвером без прерывания под QNX.

P.S. Еще раз хочу попростить всех кто может привести код простейшего обработчика прерывания.
Спасибо.
[addsig]
Записан
Slugger
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #25 : Августа 15, 2003, 02:50:00 pm »


P.S. Еще раз хочу попростить всех кто может привести код простейшего обработчика прерывания.
Спасибо.


Вот такой, например, код - все по Кёртену

//Обработчик прерывания
const struct sigevent *IntHandler (void *arg, int id)
{
   sigevent *Event = static_cast<sigevent*>(arg);
   Pm = in16(0x282);
   wMessage=Pm;  
   if((Pm & 0x400) != 0)
   {
      in16(0x28E);
   }
   if((Pm & 0x800) != 0)
      out16(0x284,0x0F);
   in16(0x28C);

            //   return Event;
            return 0;

            
}
//Поток обработчика прерывания
void *IntThread (void *arg)
{
   sigevent Event;
   ThreadCtl(_NTO_TCTL_IO, NULL);
   int InterruptID = InterruptAttach(HW_PRV_IRQ, IntHandler, &Event, sizeof(Event), 0);
   SIGEV_INTR_INIT(&Event);
   if(InterruptID == -1)
   {
      cerr << "Unable to InterruptAttach" << endl;
      exit(EXIT_FAILURE);
   }
   
   out16(0x28A, 0x20);             //dej rej
   delay(5);
   while(true)
   {
      InterruptWait(NULL, NULL);
   }
   return EXIT_SUCCESS;
}

Записан
CaptHowdy
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля WWW
« Ответ #26 : Августа 15, 2003, 02:55:00 pm »


Slugger пишет:
Вот такой, например, код - все по Кёртену
...

Большое спасибо, буду пробовать!

P.S. У меня было нечто в таком роде, сейчас не помню - утерялось, но подвисание было именно на InterruptWait(NULL, NULL); - глухо висела программа.

[addsig]
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #27 : Августа 15, 2003, 03:22:00 pm »


Как я уже говорил - все платы ISA, PCI там и в помине нет,

Ага, щаззззз ... у тебя на матери стоит 82371EB (PIIX4E) наверное для красоты, правда ? А то PCI-to-ISA bridge / IDE Xcelerator ... так шо не надо ля-ля ... мы это уже проходили ...

соответственно и в BIOS-e такой опции нет. Мамка - это ISA плата PromPC,

Выведен только ISA bridge - все внутри работает на PCI.

А сам Prom PC ISA-ориентированный изначально. Т.е. поддержки PCI, повторюсь, нет.


Записан

CaptHowdy
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля WWW
« Ответ #28 : Августа 15, 2003, 03:41:00 pm »


lestat пишет:
Ага, щаззззз ... у тебя на матери стоит 82371EB (PIIX4E) наверное для красоты, правда ? А то PCI-to-ISA bridge / IDE Xcelerator ... так шо не надо ля-ля ... мы это уже проходили ...

Черт побери! Вот я остолопень! Майк, Вы были абсолютно правы. У меня В BIOS стоит (CMOS SETUP UTILITY AWARD SOFTWARE) --> PNP/PCI CONFIGURATION --> IRQ 10 assigned to : PCI/ISA PnP. Действительно ставится как Legacy ISA. Наверное в этом-то и была проблема...

Спасибо, буду ковыряться.

[addsig]
Записан
Страниц: 1 [2]
  Печать  
 
Перейти в: