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

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

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 Last? (Насколько мне известно, юридический приоритет находится в диапазоне Priority'Last + 1 .. Any_Priority'Last).

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

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


person Yony    schedule 21.12.2010    source источник
comment
Если вы не получили здесь ответа, я бы предложил разместить этот вопрос на comp.lang.ada, там тоже есть неплохие специалисты, в том числе некоторые юристы по языку и разработчики компиляторов.   -  person Marc C    schedule 21.12.2010


Ответы (2)


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

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

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

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

Йони.

person Yony    schedule 23.12.2010
comment
С FSF GCC 7 вы получите предупреждение - pragma Interrupt_Priority is preferred in presence of handlers - person Simon Wright; 25.12.2017

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

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

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

person T.E.D.    schedule 22.12.2010