中斷服務程式需要滿足如下要求:
(1)不能返回值;
(2)不能向isr傳遞引數;
(3) isr應該盡可能的短小精悍;
(4) printf(char * lpformatstring,…)函式會帶來重入和效能問題,不能在isr中採用。
中斷服務函式的呼叫是硬體級別的,當中斷產生,pc指標強制跳轉到對應的中斷服務函式入口,進入中斷具有隨機性,並不是某段**對其進行呼叫,那麼如果有返回值它的返回值返回給誰?顯然這個返回值毫無意義,如果有返回值,它必定需要進行壓棧操作,這樣一來何時出棧怎麼出棧將變得無法解決。
同理,也是由於這樣會破壞棧的原因,因為函式傳遞引數必定會要求壓棧出棧操作,由於進入中斷服務函式的隨機行,誰給它傳遞引數都成問題
如果某個中斷頻繁產生,而它對應的isr相當的耗時,那麼對中斷的響應就會無限的延遲,會丟掉很多的中斷請求
這就涉及到乙個中斷巢狀問題,由於printf之類的glibc函式採用的是緩衝機制,這個緩衝區是共享的,相當於乙個全域性變數,第一層中斷來時,它向緩衝裡面寫入一些部分內容,恰好這時來了個優先順序更高的中斷,它同樣呼叫了printf,也向緩衝裡面寫入一些內容,這樣緩衝區的內容就錯亂了。
一些C函式 嵌入式Linux
1.exit 電腦函式 函式名 exit 所在標頭檔案 stdlib.h 如果是 vc6.0 的話標頭檔案為 windows.h 功 能 關閉所有檔案,終止正在執行的程序。exit 1 表示異常退出.這個1是返回給作業系統的。exit x x不為0 都表示異常退出 exit 0 表示正常退出 exi...
嵌入式中斷服務函式的編寫要求
中斷是嵌入式系統中重要的組成部分,但是在標準c中不包含中斷。許多編譯開發商在標準c上增加了對中斷的支援,提供新的關鍵字用於標示中斷服務程式 isr 類似於 interrupt program interrupt等。當乙個函式被定義為isr的時候,編譯器會自動為該函式增加中斷服務程式所需要的中斷現場入...
嵌入式的中斷服務程式
cortex m0處理器最多支援32個外部中斷 通常稱作irq 還有乙個被稱作不可遮蔽中斷的特殊中斷。中斷事件的異常處理通常被稱作中斷服務程式 isr 除此之外,m0處理器還支援許多系統異常,他們主要用於作業系統和錯誤處理。中斷是嵌入式系統中重要的組成部分,但是在標準 c 中不包含中斷。許多編譯開發...