vxworks中斷服務
阿新 • • 發佈:2021-12-21
今天看到關於是否能在中斷中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的工作。 |