VxWorks如何区分中断下半部分的优先级



假设我有两个优先级不同的任务"A"one_answers"B"在SMP支持的VxWorks上执行。"A"one_answers"B"都向I/O设备(如磁盘或NIC)发出命令,并且都阻止等待结果。也就是说,"A"one_answers"B"同时被阻塞。一段时间后,I/O设备引发中断,ISR被调用。ISR然后将延迟的工作(也称为"下半部分")分派给工人任务。问题:工人任务的优先级是什么?

《VxWorks设备驱动程序开发人员指南》有点含糊。工人任务的优先级似乎是先验设置的。没有自动继承机制可以根据被阻止等待结果的任务("A"one_answers"B")的优先级来增加辅助任务的优先级。这类似于PREEMPT_RT Linux中线程中断优先级的工作方式。然而,QNX Neutrino和LynxOS都将使用阻塞任务的最大优先级来调度工作任务——例如优先级(worker)=最大优先级(A,B)。

有人能澄清吗?

这完全取决于"ISR调度的延迟工作"使用的机制。

如果使用信号量/messageQueue/Event,则接收方任务(a或B)将以创建任务时指定的优先级运行。在这个场景中,中断基本上已经完成,任务(A和/或B)已经准备好运行了。

无论哪个任务具有最高优先级,都将运行并执行其工作。请注意,该任务无法访问中断上下文中的任何信息。如果使用全局结构(yuk)或通过消息队列传递数据,则任务可以访问这些元素。

网络堆栈任务(tNetTask)使用这种方法,并且信号量在已经接收到分组时向tNetTask发出信号。tNetTask处理完数据包(数据包重新组装等)后,将其转发到相应套接字上等待的任务。

可以将ISR的工作推迟到tExcTask(通过调用excJobAdd)。请注意,使用这种方法,excJobAdd将指针指向一个函数,并在tExcTask(系统中优先级最高)的上下文中执行该函数。它并不是一项独立的任务。

请注意,有些东西,如文件系统、SCSI驱动程序、USB等,远不止是一个带有中断的简单驱动程序。它们包括许多不同的组件,不幸的是,这些组件也增加了复杂性。

最新更新