В результате получаем сведения о диапазонах приоритетов для очереди с приоритетами круговой диспетчеризации, спорадической диспетчеризации.
# 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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.