假设我有两个任务,'A'和'B',在SMP支持的VxWorks上执行不同的优先级。 'A'和'B'都向I / O设备(例如磁盘或NIC)发出命令,并且都阻止等待结果。也就是说,'A'和'B'同时被阻止。一段时间后,I / O设备引发中断并调用ISR。然后,ISR将延期工作(也称为“下半部分”)分派给工人任务。问题:工人任务的优先级是什么?
VxWorks设备驱动程序开发人员指南有点模糊。工作任务的优先级似乎是先验地设置的。没有自动继承机制可以根据等待结果的任务(“A”和“B”)的优先级来增加工作者任务的优先级。这类似于线程中断优先级在PREEMPT_RT Linux中的工作方式。但是,QNX Neutrino和LynxOS都会将工作任务安排在被阻止任务的最高优先级 - 例如。 priority(worker)= max_priority(A,B)。
任何人都可以澄清吗?
答案 0 :(得分:1)
这完全取决于“ISR派遣延期工作”使用的机制。
如果使用信号量/ messageQueue / Event,则收件人任务(A或B)将以创建任务时指定的优先级运行。在这种情况下,中断基本上已完成,任务(A和/或B)已准备好运行。
无论哪个任务具有最高优先级,都将运行并执行它的工作。请注意,该任务无权访问中断上下文中的任何信息。如果使用全局结构(yuk)或通过消息队列传递数据,则任务可以访问这些元素。
网络堆栈任务(tNetTask)使用这种方法,信号量在收到数据包时发出tNetTask信号。当tNetTask处理完数据包(数据包重组等)后,它会被转发到相应套接字上等待的任务。
可以将工作从ISR推迟到tExcTask(通过调用excJobAdd)。请注意,使用此方法,excJobAdd将指针指向函数,并在tExcTask(系统中处于最高优先级)的上下文中执行该函数。它不是一个独立的任务。
请注意,文件系统,SCSI驱动程序,USB等等一些东西不仅仅是带有中断的简单驱动程序。它们包括许多不同的组件,遗憾的是它们也增加了复杂性。