Ада - может ли прагма Attach_Handler () прикрепить обработчик с приоритетом System.Priority'Last? - PullRequest
2 голосов
/ 21 декабря 2010

Следующие два объявления эквивалентны:

protected type prot_Type is
    ....
    pragma Priority(System.Priority'Last);
end;


protected type prot_Type is
    ....
end;

Один из способов подключения обработчика прерываний:

 protected type prot_Type is
     procedure Handler;
     pragma Attach_Handler(Handler, ...);
 end;

 --//Attach is made at the creation of the next object:
 Object : prot_Type;

это легальное вложение (работает).

Как возможно, что обработчик имеет приоритет потолка System.Priority Последний? (Насколько я знаю, юридический приоритет находится в диапазоне Priority'Last + 1 .. Any_Priority'Last).

Другое дело: если я добавлю pragma Priority(System.Priority'Last); к защищенному объявлению, то при разработке возникает исключение program_error (при подключении обработчика).

Кто-нибудь может, пожалуйста, распространить туман?

Ответы [ 2 ]

2 голосов
/ 23 декабря 2010

Мне наконец-то удалось понять благодаря: http://www.iuma.ulpgc.es/users/jmiranda/gnat-rts/node33.htm

Тот факт, что хэдлер, который был определен в System.Priority'Last с защищенным приоритетом потолка, удалось подключить к прерыванию, мне кажется, как ошибка в компиляторе.

К прерыванию могут быть прикреплены только те хендлеры, которые определены в приоритетах защищенных с потолком в Interrupt_Prioriy'Range.

Еще одна важная вещь - для не статических защищенных (т. Е. Объявляемых как «защищенный тип ...») вложение создается созданием объекта этого типа. Объект должен быть выделен динамически .

Yony.

1 голос
/ 22 декабря 2010

Этот вопрос касается присоединения прерываний (или сигналов) к защищенному объекту, чтобы он функционировал как обработчики прерываний.Замечательно, что Ада предоставляет вам в основном стандартный для языка способ сделать это, но есть пределы тому, что в стандарте, и я думаю, что ваш вопрос достигает одного.Вы действительно должны прочитать документацию вашего компилятора для этого.

Например, если то, к чему вы присоединяетесь, является честным системным прерыванием, то вполне возможно, что ваш обработчик будет вызываться напрямую изсистемное прерывание, которое, конечно, полностью вне (и, следовательно, выше) как приоритета процесса вашей ОС, так и системы приоритета задач Ады.

Как правило, в таком случае, как и в случае с любым ISR, вы захотитеабсолютный минимум, необходимый для записи и обработки прерывания, минимального взаимодействия с системой (без операций ввода-вывода или управления задачами) и возврата управления обратно в систему, чтобы она снова могла нормально работать.В вашем случае вы можете увеличить значение переменной или установить внутренний флаг для вашего тегового типа, удалить любую изменчивую информацию о прерывании, которое вам может понадобиться позже, а затем вернуть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...