返回網站
返回網站
如何準備中斷服務常(駐函)式?
·
程式編輯的基本知識,
機器人程式教學
中斷中執行的軟體程式被稱為中斷服務常(駐函)式。通常都被拿來執行中斷事件後應該即刻(軟即時 Soft Real Time)執行短期工作,後續限時完成的長期工作則應該避免在中斷服務中執行。在中斷常式中執行的軟即時工作可 使用C4M-OS通用軟即時讀寫工作方塊 或則使用者自行撰寫。以下我們先介紹C4M-OS提供的現成工作方塊。再提供使用者自行撰寫工作方塊的原則指引。
C4M-OS通用軟即時讀寫工作方塊
配合前述軟硬即時分析,C4M-OS函式庫提供了一些現成通用工作方塊可安置在ISR中執行,包括硬體暫存器讀寫工作方塊,硬體旗標群讀寫工作方塊,以及計數工作執行次數方塊。這些工作方塊功能單純,可確保ISR內執行的碼不致於太長。而且它們的結構體提供了所需欄位做為通知後續工作方塊接力執行,以及交換資料的記憶空間。
硬體暫存器讀寫工作方塊(Hardware Register R/W RFB)
C4M-OS函式庫中大量使用工作方塊的觀念。每一個工作方塊會包含一個結構體以及一個執行函式。其中結構體存放的是工作方塊的內部永久參數及變數,而執行函式在每次執行時,都會參考結構體內的參數欄位,執行變數欄位的疊代運算及更新。 以通用硬體暫存器讀寫結構體形態 RealTimeRegIOStr_t 配合硬體暫存器讀取執行函式RealTimeRegGet_step() 可組成輸入埠暫存器讀取工作方塊。而 配合硬體暫存器輸出執行函式RealTimeRegPut_step() 可組成輸出埠暫存器寫入工作方塊。
通用硬體暫存器讀寫結構體形態:提供結構體型態以便定義即時硬體暫存器讀寫管理結構體。
typedef struct {
volatile uint8* Reg_p; //pointer of Hardware Registor
uint8_t Bytes;//Bytes of the Register;
volatile uint8_t* Data_p; //Data to be Read/Write to REG
volatile uint8_t TrigCount; //Triggered Counter
uint8_t TaskId;//The TaskId got from HWInt_reg
uint8_t NextTaskNum;//Number of Next Task
uint8_* NextTask_p;//pointer to the List of NextTask
}RealTimeREGIOStr_t;
暫存器輸出入工作方塊佈局巨集: 定義並初始化即時讀寫硬體暫存器管理結構體及接續工作陣列並完成其間鏈結
RTREGIO_LAY(RTRIOSTR,NextTaskNum,HWRegAdd,Bytes,DataAdd)
簡介: 定義並初始化即時輸出入旗標並完成鏈結,
參數:
RTRIOSTR:需要布局之輸出入暫存器工作方塊結構體。
NextTaskNum:輸出入暫存器工作方塊後續工作方塊的最高容量。
HWRegAdd:欲讀寫暫存器的住址指標。
Bytes:欲讀寫暫存器的總位元組數。
DataAdd: 讀寫暫存器供應記憶體或資料的變數住址指標。
定義出的結構體及矩陣:
RealTimeRegIOStr_t RTRIOSTR
uint8_t RTRIOSTR_NextTaskList[NextTaskNum]
範例:定義並初始化由PORTA輸出的結構體RTPAOut_str;
uint8_t DataSource;
RTREGIO_LAY(RTPAOut_str,1,&PORTA,1,&DataSource);
硬體暫存器讀取執行函式
uint8_t RealTimeRegGet_step(void* VoidStr_p);
簡介:讀取硬體暫存器內容後轉存資料緩衝欄並將執行次數計數值加1。
傳址變數:
void* VoidStr_p:無型化結構體指標。
硬體暫存器寫入執行函式
uint8_t RealTimeRegPut_step(void* VoidStr_p);
簡介:讀取資料緩衝欄內容後轉存硬體實體暫存器並將執行次數計數值加1。
傳址變數:
void* VoidStr_p:無型化結構體指標。
硬體旗標群讀寫工作方塊
硬體暫存器內旗標群,也可由硬體旗標群讀寫工作方塊在即時中斷中執行。以通用硬體旗標讀寫結構體形態RealTimeFlagIOStr_t 定義的結構體,配合硬體旗標讀取執行函式 RealTimeFlagGet_step() 可組成旗標讀取工作方塊。配合硬體旗標寫入執行函式RealTimeFlagPut_step() 可組成旗標寫入工作方塊。
硬體旗標群讀寫通用結構體形態
typedef struct {
volatile uint8* Reg_p; //pointer of Hardware Registor
uint8 Mask; //flag Mask for the Register;
uint8 Shift; //LSB number of flags In the Register;
volatile uint8* Data_p;//flag Value variable pointer
volatile uint8_t TrigCount; //Triggered Counter
uint8_t TaskId;//The TaskId get from HWInt_reg
unit8_t NextTaskNum; //Capacity of the next task list
unit8_t* NextTask_p;//points to next task list
} RealTimeFlagIOStr_t;
即時旗標群讀寫工作方塊佈局巨集: 定義並初始化即時讀寫硬體旗標群管理結構體及接續工作陣列並完成其間鏈結
RTFLAGIO_LAY(RTFIOSTR,NextTaskNum,HWRegAdd,Mask,Shift,DataAdd)
簡介: 定義並初始化即時讀寫硬體旗標群管理結構體及接續工作陣列並完成其間鏈結
參數:
RTFIOSTR:即時讀寫旗標群工作方塊結構體。
NextTaskNum:讀寫旗標群工作方塊接續工作方塊陣列的最高容量。
HWRegAdd:欲讀寫旗標群所在暫存器住址指標。
Mask:欲讀寫旗標群的遮罩。
Shift:欲讀寫旗標群的在暫存器中的平移。
DataAdd: 讀寫暫存器供應記憶體或資料的變數住址指標。
定義出的結構體及矩陣:
RealTimeFlagIOStr_t RTFIOSTR
uint8_t RTFIOSTR_NextTaskList[NextTaskNum]
範例:定義出即時由PORTA bit3讀取輸入旗標的結構體RTPAb3In_str。
uint8_t InFlag;
RTFLAGIO_LAY(RTPAb3In_str,1,&PINA,0x08,3,&InFlag);
硬體旗標讀取執行函式
uint8_t RealTimeFlagGet_step(void* VoidStr_p);
簡介:讀取硬體實體暫存器上旗標群內容後轉存結構體內資料欄,並將執行次數值加1。
傳址變數:
void* VoidStr_p:無型化結構體指標。
硬體旗標寫入執行函式
uint8_t RealTimeFlagPut_step(void* VoidStr_p);
簡介:讀取結構體內資料欄內容後轉存硬體實體暫存器上旗標群,並將執行次數值加1。
傳址變數:
void* VoidStr_p:無型化結構體指標。
執行次數計數工作方塊
有些中斷時機只需計數中斷次數讓接續的輪詢迴路得以判斷是否該執行,此計數可安置本工作方塊在ISR內無需讀寫硬體暫存器。
執行次數計數結構體形態
typedef struct {
volatile uint8_t TrigCount; //Triggered Counter
uint8_t TaskId;//The TaskId get from HWInt_reg
unit8_t NextTaskNum;//Capacity of the next task list
unit8_t* NextTask_p;//points to next task list
} RealTimeISRCountStr_t;
即時執行次數計數佈局巨集:定義並初始化即時執行次數計數計數器。
RTISRCOUNT_LAY(RTCSTR,NextTaskNum)
簡介: 定義並初始化即時中斷次數計數器,
參數:
RTCSTR:需要布局之中斷計數工作方塊管理結構體。
NextTaskNum:本布局之中斷計數工作方塊後續工作方塊最高容量。
定義出的結構體及矩陣:
RealTimeISRCountStr_t RTCSTR
uint8_t RTCSTR_NextTaskList[NextTaskNum]
範例:定義一個即時外部中斷EXT計數器管理結構體。
RTISRCOUNT_LAY(RTEXT1C_str,1);
執行次數計數函式
uint8_t RealTimeISRCount_step(void* VoidStr_p);
簡介:將執行次數值加1。
傳址變數:
void* VoidStr_p:輸出入埠資料結構指標。
Cookie的使用
我們使用cookie來改善瀏覽體驗、保證安全性和資料收集。一旦點擊接受,就表示你接受這些用於廣告和分析的cookie。你可以隨時更改你的cookie設定。
了解更多
Cookie 設定
必要的Cookies
這些cookies支援安全性、網路管理和可訪問性等核心功能。這些cookies無法關閉。
分析性Cookies
這些cookies幫助我們更了解訪客與我們網站的互動情況,並幫助我們發現錯誤。
偏好的Cookies
這些cookies允許網站記住你的選擇,以提升功能性與個人化。