Ada - do pragma Attach_Handler()可以附加System.Priority'Last优先级的处理程序吗?

时间:2010-12-21 08:25:06

标签: interrupt ada protected

接下来的两个声明是等效的:

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 个答案:

答案 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或任务交互),并将控制权返回给系统,以便它可以再次开始正常运行。在您的情况下,您可能希望增加变量或在标记类型内部设置标志,记下以后可能需要的有关中断的任何易失性信息,然后返回。