Управление процессами и нитями, страница 4

В результате получаем сведения о диапазонах приоритетов для очереди с приоритетами круговой диспетчеризации, спорадической диспетчеризации.

# gcc getp3.c -o getp3

# ./getp3

Policies     MinPrio     MaxPrio

FIFO               1         255

RR                 1         255

OTHER              1         255

SPORADIC           1         255

3.Обработка прерываний

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

int InterruptAttach(    int intr,

      const struct sigevent * (*handler) (void*, int),

      const void* area,

      int size,

      unsigned flags);

Используется для постановки в соответствие обработчика источнику прерывания.

intr                  номер прерываний, которое требуется перехватить

handler            указатель на функцию - обработчик прерывания

area                 указатель на пространство связи, которое выделяется для обработчика

size                  размер пространства связи

flags                флаги, которые указывают на специфику перехвата прерывания

Номер прерывания от таймера равен 0. От клавиатуры – 1. Рассмотрим функцию маскирования аппаратных прерываний.

#include <sys/neutrino.h>

Int InterruptMask(      int intr,

                        Int id);

intr                  номер маскируемого прерывания

id                    идентификационный номер маскируемого обработчика

А так же функцию демаскирования.

#include <sys/neutrino.h>

int InterruptUnmask(    int intr,

                        int id);

Значение аргументов аналогично InterruptMask().

Функция ожидания произвольного аппаратного прерывания:

#include <sys/neutrino.h>

int InterruptWait(0, NULL);

Рассмотрим теперь примеры работы с аппаратными прерываниями в QNX.

1.Транзитная программа вывода текущего времени:

Int1.c

#include <stdio.h>

#include <sys/neutrino.h>

#include <time.h>

int cnt;

struct sigevent secpas;

time_t clck;

char clockstr[10];

const struct sigevent *handler( void* area, int id){

      cnt++;

      if (cnt == 1000){

            cnt = 0;

            return(&secpas);

      }

      else

            return(NULL);

}          

int main(){

      int i = 0, id;

      ThreadCtl( _NTO_TCTL_IO, 0 );

      secpas.sigev_notify = SIGEV_INTR;

      id = InterruptAttach( 0, &handler, NULL, NULL, 0);

      while(1)    {

            InterruptWait(0, NULL);

            clck = time(NULL);

            strftime( clockstr,10,"%H:%M:%S",localtime(&clck));

            printf( "%s\n", clockstr );

      }

      InterruptDetach( id );

      return 0;

}    

Так как таймер считает в миллисекундах, соответственно нужно в программе это учитывать, чтобы получать время с точностью до секунды.

ThreadCtl( _NTO_TCTL_IO, 0 ) - для работы с аппаратными прерываниям нить должна получить специальные права. .

secpas.sigev_notify = SIGEV_INTR – установка типа оповещения по прерыванию.

Результат работы:

# gcc int1.c -o int1

# ./int1

14:09:16

14:09:17

14:09:18

14:09:19

14:09:20

14:09:21

14:09:22

14:09:23

14:09:24

14:09:25

14:09:26

14:09:27

14:09:28

14:09:29

14:09:30