接下来的两个声明是等效的:
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异常(当附加处理程序时)。
有人可以请你散布雾气吗?
答案 0 :(得分:2)
我终于理解了感谢: http://www.iuma.ulpgc.es/users/jmiranda/gnat-rts/node33.htm
在受保护的天花板优先级System.Priority'Last中定义的hadler被设置为连接到Interrupt的事实在我看来像编译器中的bug。
只有在Interrupt_Prioriy'Range中使用天花板优先级保护的hendler才能附加到中断。
另一个重要的事情 - 对于非静态保护(即用“受保护类型...”声明),附件是通过创建该类型的对象来实现的。必须分配动态对象。
Yony。
答案 1 :(得分:1)
这个问题是关于将中断(或信号)附加到受保护对象以充当中断处理程序。很棒,Ada为你提供了一种主要是语言标准的方法,但是标准中的内容是有限的,我认为你的问题就是一个。你真的需要阅读你的编译器的文档。
例如,如果您所附加的是一个诚实的上帝系统中断,那么很可能您的处理程序将直接从系统中断调用,这当然完全在(因此在上面) )你的操作系统的进程优先级和Ada的任务优先级系统。
通常在这种情况下,与任何ISR一样,您需要做到记录和处理中断所需的绝对最小值,尽可能少地与系统交互(没有I / O或任务交互),并将控制权返回给系统,以便它可以再次开始正常运行。在您的情况下,您可能希望增加变量或在标记类型内部设置标志,记下以后可能需要的有关中断的任何易失性信息,然后返回。