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

Interrupt VxWorks如何区分中断下半部分的优先级?,interrupt,vxworks,rtos,preempt-rt,Interrupt,Vxworks,Rtos,Preempt Rt,假设我有两个不同优先级的任务“A”和“B”,在SMP支持的VxWorks上执行。“A”和“B”都会向I/O设备(如磁盘或NIC)发出命令,并且都会阻塞等待结果。也就是说,“A”和“B”同时被阻塞。一段时间后,I/O设备引发中断并调用ISR。然后,ISR将延迟工作(也称为“下半部分”)分派给工人任务。问题:工人任务的优先级是什么 VxWorks设备驱动程序开发人员指南有点模糊。工作任务的优先级似乎是预先设置的。没有自动继承机制可以根据被阻止等待结果的任务(“A”和“B”)的优先级来增加辅助任务的优

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

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


有人能澄清一下吗?

这完全取决于“ISR分派的延期工作”使用的机制

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

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


网络堆栈任务(tNetTask)使用这种方法,当接收到数据包时,信号量向tNetTask发出信号。当tNetTask处理完数据包(数据包重组等)后,它将被转发到相应套接字上等待的任务

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


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

这完全取决于“ISR分派的延迟工作”使用的机制

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

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


网络堆栈任务(tNetTask)使用这种方法,当接收到数据包时,信号量向tNetTask发出信号。当tNetTask处理完数据包(数据包重组等)后,它将被转发到相应套接字上等待的任务

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


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

“当tNetTask处理了数据包(数据包重新组装等)后,它会被转发到相应套接字上等待的任务。”tNetTask计划的优先级是多少?tNetTask是以自己分配的优先级运行,还是从等待套接字的任务之一继承优先级?这就是我真正想弄明白的。“当tNetTask处理完数据包(数据包重组等)后,它会被转发到相应套接字上等待的任务。”tNetTask的优先级是多少?tNetTask是以自己分配的优先级运行,还是从等待套接字的任务之一继承优先级?这就是我真正想弄明白的。