對於中斷促成的工作建議分割成,前段的軟即時及後續的硬即時。 並且只將軟即時安排在中斷服務常式中執行。接續的硬即時工作需在軟即時後接續執行,並只需要在下次發生前完成即可(硬即時,Hard Real Time)。
軟即時工作接續硬即時工作,有兩件事情必需要交接
• 讀寫資料交接:
◦ 中斷服務常式中讀取的硬體輸入資料,要交接給資料後處理的硬即時工作進行處理。
◦ 中斷服務常式中要輸出以控制週邊硬體的訊號,要由控制訊號計算硬即時工作預先算好,以備交接給中斷服務常式於下一輪的中斷中輸出。 • 執行工作接力:
◦ 軟即時與硬即時握手訊號:當中斷服務常式完成一次運算,後續應該要有一次而且唯一一次,資料後處理或控制訊號的產生。利用一個可而由兩者分別讀寫的標記或計數值。由中斷服務常式在每次執行時加一,而在後續硬即時工作每次運算時減一。後處理工作即可知道,前面的中斷服務常式,是否曾經執行,是否執行超過一次以上。
◦ 後續工作的執行:有輪詢或排程兩種方式,可以讓中斷服務常式促成後續工作執行。
▪ 輪詢:在程式的永久迴路中,後續工作,讀取軟即時與硬即時握手訊號,判斷中斷服務常式曾執行過一次,且只有一次時才執行後續工作。若超過一次則代表,中斷頻率過高,後續工作來不及處理。這時可以檢討如何降低頻率或則精簡程式運算。
▪ 排程:C4M-OS有生產線排程器Pipeline Service Provider 可以由前級工作方塊主動將後級工作方塊排入排程,再由排程執行器在適當時機執行。未來有機會再介紹其詳細用法。 中斷服務常式及主程式輪詢分工觸發訊號傳遞圖參考上圖,中斷服務常式內,會執行即時輸入埠PortIn讀取,然後觸發 PortIn後處理程式。或則是執行即時輸出埠PortOut輸出,然後觸發下一步驟的輸出控制PortOut輸出前處理。
即時PortIn 接力 輪詢此次PortIn後處理
即時PortIn 中斷服務常式與PortIn 後處理程式交接• 中斷服務常式 中軟即時PortIn: ◦ 輸入埠PortIn:讀取輸入埠硬體暫存器值,存入輸入值暫存變數。
◦ 觸發次數計數: 觸發次數變數 進1。
• 輪詢迴路(PortIn 後處理)
◦ 檢查 觸發次數變數 決定是否執行後處理。
▪ 若 (觸發次數變數==0) 沒有新輸入值,不執行即離開函式
▪ 若 (觸發次數變數==1) 表示有新輸入值,
• 讀取輸入值暫存變數 並對它執行後處理
• 觸發次數變數 =0,表示己完成後處理。
▪ 若 (觸發次數變數 > 1) 表示中斷太快,來不及處理。
• 回應中斷太快錯誤訊息。以供主程式回報人機。
即時PortOut 接力 輪詢下輪PortOut前處理
中斷服務常式軟即時PortOut 與輪詢內PortOut 前處理程式交接。
• 即時PortOut 中斷常式:
◦ 輸出埠PortOut:讀取待輸出值暫存變數 ,寫入輸出埠硬體暫存器值,
◦ 觸發: 觸發次數變數 進1。
• 輪詢內下一筆PortOut 前處理
◦ 檢查 觸發次數變數 決定是否執行後處理。
▪ 若 (觸發次數變數==0) 前值尚未輸出,不執行即離開函式
▪ 若 (觸發次數變數==1) 表示己輸出前值。
• 執行下一週期的輸出值前處理將結果寫入待輸出值暫存變數。
• 觸發次數變數 =0,表示己完成待輸出值暫存變數 前處理準備。
▪ 若 (觸發次數變數 > 1) 表示中斷太快,來不及處理。
• 回應中斷太快錯誤訊息。以供主程式回報人機。