1. 程式人生 > 其它 >vxworks中斷服務

vxworks中斷服務

今天看到關於是否能在中斷中semTake的表述,感覺很不錯。不過如果semtake不用等待的訊號,應該也是可以的,不會導致呼叫者切換到blocking態

VxWorks的中斷服務程式(ISR)執行在特定的空間。不同於一般的任務,中斷服務程式沒有任務上下文,不包含任務控制塊,所有的中斷服務程式使用同一中斷堆疊。

ISR中不能呼叫可能導致blocking的函式,例如:
(a)不能以semTake獲取訊號量,因如果該訊號量不可利用,核心會試圖讓呼叫者切換到blocking態;
(b)malloc和free可能導致blocking,因此也不能使用;
(c)應避免進行VxWorks I/O系統操作(除管道外);

引伸 :
1,在Vxworks裡,任務排程器的呼叫一般有兩種情況。一種是從中斷或系統呼叫返回的時候,另一種就是程式碼本身去呼叫了會引起排程的系統函式,比如taskDelay一類。

2,在某些作業系統中,是可以在一些特定的低優先順序ISR裡面進行pend操作的。這要求作業系統的中斷,有執行緒上下文(執行緒(任務)上下文是任務排程的基礎,注意任務上下文不等同於中斷上下文)。稱為“中斷執行緒化”。 Vxworks的任務排程是依賴於中斷的,同時,為了實時性考慮,Vxworks不支援中斷執行緒化,ISR是沒有任務(執行緒)上下文(TCB)的。如果支援中斷執行緒化,那麼將導致中斷響應時間不確定,實時性難以得到保證。 如果在vxworks裡面,使用了可能blocking的程式碼,那麼有2種情況:

(a)一種是關中斷執行。那麼,在blocking的地方,將永遠等待。因為這時候任務排程依賴的時鐘中斷都不能響應,也就是說任務排程器都不能運行了,系統就死在中斷裡了。
(b)另一種是開中斷進行。那麼,在blocking的地方,任務排程器仍然可能執行。此時,任務排程器會企圖把ISR的TCB屬性改為pend。但是ISR沒有TCB,必然也出錯。

在Vxworks裡,通常是這樣處理的:在ISR裡,除了對中斷暫存器進行必要的操作之外,儘量簡單的就是隻釋放一個訊號量,通知一個高優先順序的任務來完成可能引起blocking的工作。