2012-09-22 60 views
1

假設我有兩個在SMP支持的VxWorks上執行的具有不同優先級的'A'和'B'任務。 「A」和「B」都向I/O設備(如磁盤或NIC)發出命令,並且都阻止等待結果。也就是說,'A'和'B'同時被阻塞。一段時間後,I/O設備引發中斷並調用ISR。 ISR然後將延期工作(又名「下半部分」)發送給工作任務。問題:工作任務的優先級是什麼?VxWorks如何優先處理中斷下半部分?

VxWorks設備驅動程序開發人員指南有點含糊。看起來,工作任務的優先級是先驗設置的。沒有自動繼承機制會根據阻止等待結果的任務('A'和'B')的優先級來提高工作任務的優先級。這與線程中斷優先級在PREEMPT_RT Linux中的工作方式類似。但是,QNX Neutrino和LynxOS都會將工作任務安排在阻塞任務的最高優先級 - 例如。優先級(worker)= max_priority(A,B)。

任何人都可以澄清?

回答

1

它完全取決於「ISR派遣延期工作」使用的機制。

如果使用semaphore/messageQueue/Event,則接收任務(A或B)將以創建任務時指定的優先級運行。在這種情況下,中斷基本完成,並且任務(A和/或B)已準備好運行。

無論哪個任務是具有最高優先級將得到運行並執行它的工作。請注意,該任務無法訪問來自中斷上下文的任何信息。如果您使用全局結構(yuk)或通過消息隊列傳遞數據,則任務可以訪問這些元素。

網絡堆棧任務(tNetTask)使用這種方法,並且一個信號量在收到數據包時發信號通知tNetTask。當tNetTask處理了數據包(數據包重組等)時,它將被轉發給相應套接字上等待的任何任務。

可以將工作從ISR推遲到tExcTask(通過調用excJobAdd)。請注意,通過這種方法,excJobAdd將指向一個函數,並在tExcTask(系統中具有最高優先級)的上下文中執行該函數。它不是一個獨立的任務。

請注意,文件系統,SCSI驅動程序,USB等等一些東西不僅僅是一個帶有中斷的簡單驅動程序。它們包括許多不同的組件,不幸的是這也增加了複雜性。

+0

「當tNetTask處理完數據包(數據包重組等)後,它會被轉發到相應套接字上正在等待的任何任務。」 tNetTask的優先順序是什麼? tNetTask是否按照自己指定的優先級運行,還是繼承了等待套接字的任務之一的優先級?這是我真正想弄明白的。 – Glenn