假设我有两个不同优先级的任务'A‘和'B’在支持SMP的VxWorks上执行。“A”和“B”都向I/O设备(如磁盘或NIC)发出命令,并且两个数据块都在等待结果。也就是说,同时阻止'A‘和'B’。一段时间后,I/O设备发出中断并调用ISR。然后,ISR将延迟的工作(也称为“下半部分”)分派给工作任务。问:工作任务的优先级是什么?
VxWorks设备驱动程序开发人员指南有点含糊。看起来工作任务的优先级是先验设置的。没有自动继承机制可以根据等待结果被阻塞的任务('A‘和'B')的优先级来增加工作任务的优先级。这类似于线程中断优先级在PREEMPT_RT Linux中的工作方式。然而,QNX中微子和LynxOS都将调度具有阻塞任务的最高优先级的工作任务--例如。优先级(Worker)= max_priority(A,B)。
有谁能澄清一下吗?
发布于 2012-09-24 09:38:50
这完全取决于"ISR调度的延迟工作“使用的机制。
如果使用信号量/messageQueue/事件,则接收方任务(A或B)将以创建任务时指定的优先级运行。在这种情况下,中断基本上完成,任务(A和/或B)准备运行。
无论哪个任务具有最高优先级,都可以运行并执行它的工作。请注意,该任务无法访问来自中断上下文的任何信息。如果使用全局结构(yuk)或通过消息队列传递数据,则任务可以访问这些元素。
网络堆栈任务( tNetTask )使用这种方法,当接收到数据包时,信号量向tNetTask发出信号。当tNetTask处理完数据包(数据包重组等)后,它将被转发到在相应套接字上等待的任何任务。
可以(通过调用excJobAdd)将工作从ISR推迟到tExcTask。请注意,使用这种方法时,excJobAdd获取指向函数的指针,并在tExcTask (在系统中处于最高优先级)的上下文中执行函数。它并不是一个独立的任务。
请注意,有些东西,如文件系统、SCSI驱动程序、USB等...远不止是一个带有中断的简单驱动程序。它们包括许多不同的组件,不幸的是,这些组件也增加了复杂性。
https://stackoverflow.com/questions/12539687
复制相似问题