Страниц: [1]
  Печать  
Автор Тема: Маскирование прерывания от таймера, выход по timeout (qnx 6.5)  (Прочитано 523 раз)
talruns
Участник
*
Offline Offline

Сообщений: 38


Просмотр профиля
« : Апреля 04, 2017, 09:26:39 am »

Добрый день.
Надо было протестировать маскирование прерывания. Использовала таймер. Все работает - ставишь маску - прерывание перестает срабатывать. Хотелось бы в этой ситуации выходить по TimeOut-у, а как раз это не получается.
Код:

int id, i, status;

int errvalue;
uint64_t timeout = 100000;
struct sigevent event;

ThreadCtl(_NTO_TCTL_IO, 0);

// Initialize event structure
event.sigev_notify = SIGEV_INTR;

// Attach ISR vector
id = InterruptAttach( SYSPAGE_ENTRY(qtime)->intr, &handler, NULL, 0, 0 );

for( i = 0; i < 10; ++i )
{
// Wait for ISR to wake us up
InterruptWait( 0, NULL );
printf( "прерывание сработало 100 раз \n" );

}

InterruptMask(0, 2);// маскирование прерывания от таймера




TimerTimeout( CLOCK_REALTIME,_NTO_TIMEOUT_INTR ,&event, &timeout, NULL );
//TimerTimeout( CLOCK_REALTIME,_NTO_TIMEOUT_INTR, NULL, &timeout, NULL );
status=InterruptWait (0, NULL);
if (status < 0 )
{   errvalue = errno;
    switch(errvalue)
    {
           case(EINTR): puts("The call was interrupted by a signal. \n");
              break;
           case(ENOTSUP):puts("The reserved arguments aren't NULL. \n");
              break;
           case(ETIMEDOUT):puts("TIMEOUT !!!. A kernel timeout unblocked the call. \n");
              break;
     }
}
 else
{//  normal interrupt
     puts("Interrupt !!!\n");
       
}


InterruptUnmask(0, 1);// снятие маски прерывания от таймера

// Disconnect the ISR handler
InterruptDetach(id);
printf("... !!!Ura\n");




Код:
const struct sigevent *handler( void *area, int id ) {
    // Wake up the thread every 100th interrupt

    if ( ++counter == 100 ) {
        counter = 0;
        return( &event );
        }
    else
        return( NULL );
    }


Записан
da-nie
Full Member
***
Offline Offline

Сообщений: 163



Просмотр профиля
« Ответ #1 : Апреля 04, 2017, 09:59:47 pm »

Я делал так.

Код:
   
while(1)
{
 sigevent event_timeout;//событие "время вышло"
 uint64_t timeout=100;
 SIGEV_UNBLOCK_INIT(&event_timeout);
 TimerTimeout(CLOCK_REALTIME,_NTO_TIMEOUT_INTR,&event_timeout,&timeout,NULL);//тайм-аут ядра на ожидание прерывания
 if (InterruptWait(0,NULL)<0) continue;//прерывание не пришло
}

Но я не проверяю коды ошибок, так что не могу сказать, что будет в коде ошибки.
Записан

И день и ночь в пути
Dark
Sr. Member
****
Offline Offline

Сообщений: 343


Просмотр профиля
« Ответ #2 : Апреля 05, 2017, 01:34:28 am »

Я так пониаю никого особо не парит, что таймерные прерывания как бэ генерироваться не могут, если они замаскированы? Но это конечно же мелочи.
Записан
da-nie
Full Member
***
Offline Offline

Сообщений: 163



Просмотр профиля
« Ответ #3 : Апреля 05, 2017, 06:31:04 am »

А... Я как-то упустил, что это же таймер. Smiley Я-то привык к прерываниям от аппаратуры. Smiley
Записан

И день и ночь в пути
talruns
Участник
*
Offline Offline

Сообщений: 38


Просмотр профиля
« Ответ #4 : Апреля 05, 2017, 08:46:29 am »

Спасибо - это как раз пример "замыливания сознания". Ты думаешь, что неправильно работаешь с масками прерывания или таймаутом - и перестаешь мыслить глобально. Спасибо за помощь!
Записан
Страниц: [1]
  Печать  
 
Перейти в: