1

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

VxWorks Device Driver Developer's Guide 有点含糊。似乎工作任务的优先级是先验设置的。没有自动继承机制可以根据阻塞等待结果的任务(“A”和“B”)的优先级来增加工作任务的优先级。这类似于 PREEMPT_RT Linux 中线程中断优先级的工作方式。但是,QNX Neutrino 和 LynxOS 都会以被阻塞任务的最高优先级调度工作任务——例如。优先级(工人)= max_priority(A,B)。

谁能澄清一下?

4

1 回答 1

1

这完全取决于“ISR 调度的延迟工作”使用哪种机制。

如果使用信号量/消息队列/事件,则接收任务(A 或 B)将以创建任务时指定的优先级运行。在这种情况下,中断基本完成,任务(A 和/或 B)准备好运行。

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

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

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

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

于 2012-09-24T01:38:49.967 回答