傳統的中斷向量表跳接中斷服務常式機制GNU C 官方中斷服務函式的標準型態為 ISR(xxx_vect)。其中做提供固定週期中斷的中斷源,我們選擇週期長度調整靈活性比較高的比較吻合(Compare Match)事件中斷。四個計時器分別為 ISR(TIMER0_COMP_vect), ISR(TIMER1_COMPA_vect),ISR(TIMER2_COMP_vect), ISR(TIMER3_COMPA_vect)對於中斷促成的工作建議分割成前段的軟即時及後續的硬即時。 並且只將軟即時安排在中斷服務常式中執行。接續的硬即時工作需在軟即時後接續執行,並只需要在下次發生前完成即可(硬即時,Hard Real Time)。
若用輪詢方式來串接執行硬即時工作方塊,可於主程式工作方塊佈局後,以等式連接執行計數值輸出入指標,連接前後級工作方塊。然後在輪詢迴路內呼叫所有硬即時工作方塊的執行函式即可。
C4M-OS 中斷服務常式分享登錄及禁致能機制TIMER 中斷服務可以分享給多個功能方塊,在正式啟動分享前,先呼叫TIMHWINT_LAY()完成 TIMER 中斷服務常式分享器佈局。 然後功能方塊就可以用函式 HWInt_reg()登錄進 TIMER 中斷服務的分享名單並取得分享工作編號。之後 C4M-OS 便會在中斷事件發生後自動執行分享名單中己致能的工作編號。使用者可以依據需求在適當的時機,呼叫禁致能函式 HWInt_en()來禁致能中斷服務分享工作。
TIMER 中斷服務常式分享器佈局巨集 TIMHWINT_LAY () :
TIMHWINT_LAY(INTSTR,ININUM,TASKNUM)
說明:呼叫本巨集會建立一個中斷服務分享器管理結構體 HWIntStr_t 以及搭配的空白分享工作名單。並且將執行中斷分享的函式指標掛進特定類型硬體中斷查詢表單 TIMIntList_p[n],中等待對應的 INTERNAL_ISR 於中斷事件發生時呼叫執行。 parameter: INTSTR:中斷服務分享器的結構體。可選值有 Tim0Int_str,Tim1Int_str,Tim2Int_str,Tim3Int_str 4 種。 ININUM:本中斷服務分享器的結構體欲佔用 TIMER 編序,Tim0Int_str 為 0,Tim1Int_str 為 1,Tim2Int_str 為 2,Tim3Int_str 為 3。 TASKNUM:允許被登錄至本中斷服務分享器中執行的工作最高數目。 Constrain:TIMINTSTRLIST_p[ININUM]: Hardware interrupt service structure pointer list is Defined Beforehand. 範例:假如要用 TIMER1 中斷,由平行埠 B b0 控制送出一個旗標,同時讀回一 個平行輸入埠 D。中斷為例,假設開放最多 2 個功能方塊登錄分享,參數INTSTR 為 TIM1Int_str。參數 ININUM 為 1,參數 TASKNUM。為 2。 /* Define RealTime Flag Out from Port B b0 and initial it */
RealTimeFLAGIOStr_t RTFlagOB_str={0};
RT_FLAG_IO_LAY(&RTFlagOB_str,0,&PIND,0x01,0);
/* Define RealTime Port In from Port D and initial it */
RealTimeREGIOStr_t RTPortID_str={0};
RT_REG_IO_LAY(&RTPortID_str,0,&PIND, 1);
/* Define TIM1Int_str and initial it */
TIMHWINT_LAY(TIM1Int_str,1,2);
/*Register PB b0 Output and PORTD Input as tasks of TIM1 ISR*/
RTFlagOB_str.TaskId=HWInt_reg(&TIM1Int_str,RTREGFPT_step, (void*) &RTFlagOB_str); RTPortID_str.TaskId=HWInt_reg(&TIM1Int_str,RTREGGET_step, (void*) &RTPortID_str);