uCOS III 15 中斷管理

2021-10-04 10:44:29 字數 4270 閱讀 7789

異常是指任何打斷處理器正常執行,並迫使處理器進入乙個由有特權的特殊指令執行的事件。異常通常可以分為兩類:同步異常和非同步異常。內部引起的叫同步異常,外部異常源引起的叫非同步異常。同步異常與非同步異常的區別還在於,同步異常觸發後,系統必須立刻進行處理而不能夠依然執行原有的程式指令步驟;而非同步異常則可以延緩處理甚至是忽略

中斷,中斷屬於非同步異常。中斷一般用於處理比 較緊急的事件。系統中是存在臨界段的,在執行臨界段時,中斷就會被掛起直到中斷重新開啟。

中斷延遲是指從硬體中斷發生到開始執行中斷處理程式第一條指令之間的這段時間。

中斷的處理過程是:外界硬體發生了中斷後,cpu 到中斷處理器讀取中斷向量,並且 查詢中斷向量表,找到對應的中斷服務子程式(isr)的首位址,然後跳轉到對應的 isr 去做相應處理。這部分時間,火哥稱之為:識別中斷時間。 處理完當前的中斷之後,才會處理後來的中斷。此部分時間,火哥稱其為:等待中斷開啟 時間。在臨界區發生的中斷會被掛起,直到退出臨界段時候開啟中斷。此部分時間,火哥稱其為:關閉中斷時間。

中斷延遲 = 識別中斷時間 + [等待中斷開啟時間] + [關閉中斷時間]。

使能中斷延時發布,可以將中斷級發布轉換成任務級發布,而且在進入臨界段時也可以使用鎖排程器代替關中斷,這就大大減小了關中斷時間

在使能中斷延時發布後, 如果在中斷中呼叫這些函式,系統就會將這些 post 提交函式必要的資訊儲存到中斷延遲提 交的變數中去,使用優先順序最高(優先順序為 0)的任務中斷發布函式 os_intqtask,退出中斷後根據之前儲存的引數,在任務中再次進行 post 相關操作。這個過程其實就是把中斷中的臨界段放到任務中來實現,這個時候進入臨界段 就可以用鎖住排程器的方式代替了關中斷。

void  os_intqtaskinit (os_err  *p_err)

#endif

osintqovfctr =

(os_qty)0u;

/* clear the isr queue overflow counter */

if(oscfg_intqbaseptr ==

(os_int_q *)0

)if(oscfg_intqsize <

(os_obj_qty)2u)

osintqtasktimemax =

(cpu_ts)0;

p_int_q = oscfg_intqbaseptr;

/* initialize the circular isr queue */

p_int_q_next = p_int_q;

p_int_q_next++

;for

(i =

0u; i < oscfg_intqsize; i++

) p_int_q--

; p_int_q_next = oscfg_intqbaseptr;

p_int_q->nextptr = p_int_q_next;

osintqinptr = p_int_q_next;

osintqoutptr = p_int_q_next;

osintqnbrentries =

(os_obj_qty)0u;

osintqnbrentriesmax =

(os_obj_qty)0u;

/* -------------- create the isr queue task ------------- */

if(oscfg_intqtaskstkbaseptr ==

(cpu_stk *)0

)if(oscfg_intqtaskstksize < oscfg_stksizemin)

ostaskcreate

((os_tcb *

)&osintqtasktcb,

(cpu_char *)(

(void*)

"uc/os-iii isr queue task"),

(os_task_ptr )os_intqtask,

(void*)

0,(os_prio )0u,

/* this task is always at priority '0' (i.e. highest) */

(cpu_stk *

)oscfg_intqtaskstkbaseptr,

(cpu_stk_size)oscfg_intqtaskstklimit,

(cpu_stk_size)oscfg_intqtaskstksize,

(os_msg_qty )0u,

(os_tick )0u,

(void*)

0,(os_opt )

(os_opt_task_stk_chk | os_opt_task_stk_clr)

,(os_err *

)p_err)

;}

void  os_intqpost (os_obj_type   type,

//核心物件型別

void

*p_obj,

//被發布的核心物件

void

*p_void,

//訊息佇列或任務訊息

os_msg_size msg_size,

//訊息的數目

os_flags flags,

//事件標誌組

os_opt opt,

//發布核心物件時的選項

cpu_ts ts,

//發布核心物件時的時間戳

os_err *p_err)

//返回錯誤型別

#endif

cpu_critical_enter()

;//關中斷

if(osintqnbrentries < oscfg_intqsize)

/* 將要重新提交的核心物件的資訊放入到中斷佇列入口的資訊記錄塊 */

osintqinptr->type = type;

//儲存核心物件型別

osintqinptr->objptr = p_obj;

//儲存被發布的核心物件

osintqinptr->msgptr = p_void;

//儲存訊息內容指標

osintqinptr->msgsize = msg_size;

//儲存訊息大小

osintqinptr->flags = flags;

//儲存事件標誌組

osintqinptr->opt = opt;

//儲存選項

osintqinptr->ts = ts;

//儲存物件被發布的時間錯

osintqinptr = osintqinptr->nextptr;

//指向下乙個帶處理成員

/* 讓中斷佇列管理任務 osintqtask 就緒 */

osrdylist[0]

.nbrentries =

(os_obj_qty)1;

//更新就緒列表上的優先順序0的任務數為1個

osrdylist[0]

.headptr =

&osintqtasktcb;

//該就緒列表的頭指標指向 osintqtask 任務

osrdylist[0]

.tailptr =

&osintqtasktcb;

//該就緒列表的尾指標指向 osintqtask 任務

os_prioinsert(0u

);//在優先順序列表中增加優先順序0

if(ospriocur !=0)

*p_err = os_err_none;

//返回錯誤型別為「無錯誤」

}else

cpu_critical_exit()

;//開中斷

}

如果中斷隊 列 裡 還 存 在 未 發 布 的 內 核 對 象 , 就呼叫os_intqrepost數發布中斷佇列裡的核心物件

void  os_intqrepost (

void

)#endif

break

;//跳出

default

://如果核心物件型別超出預期

break

;//直接跳出

}}

uc os iii學習筆記 中斷管理

中斷 應內部或外部非同步事件的請求中止當前任務,而去處理非同步事件所要求的任務的過程叫做中斷 void usart1 irqhandler void 進入中斷服務函式以後使用函式osintenter void osintenter void if osintnestingctr os nesting...

ucos iii學習之中斷管理

1.關於中斷管理 中斷響應時間定義為 接收到中斷到開始處理 isr 中 的這段時間。通常,中斷時使用者 的上文 cpu 暫存器 會被放入堆疊。中斷恢復時間定義為 執行完 isr 中最後一句 後到恢復到任務級 的這段時間。任務延遲時間定義為 中斷發生到恢復到任務級 的這段時間。2.cpu的中斷處理 在...

ARM9 中斷管理

s3c2410的中斷異常處理模組總共由以下暫存器構成 srcpnd source pending register intmod interrupt mode register intmsk interrupt mask register priority priority register int...