中斷是嵌入式系統中重要的組成部分,可是在標準C中不包含中斷。許多編譯開發商在標準C上增長了對中斷的支持,提供新的關鍵字用於標示中斷服務程序 (ISR),相似於__interrupt、#program interrupt等。當一個函數被定義爲ISR的時候,編譯器會自動爲該函數增長中斷服務程序所須要的中斷現場入棧和出棧代碼。
中斷服務程序須要知足以下要求:
(1)不能返回值;
(2)不能向ISR傳遞參數;
(3) ISR應該儘量的短小精悍;
(4) printf(char * lpFormatString,…)函數會帶來重入和性能問題,不能在ISR中採用。函數
參閱網上資料和我的的一些理解性能
a.爲何不能有返回值?spa
中斷服務函數的調用是硬件級別的,當中斷產生,pc指針強制跳轉到對應的中斷服務函數入口,進入中斷具備隨機性,並非某段代碼對其進行調用,那麼若是有返回值它的返回值返回給誰?顯然這個返回值毫無心義,若是有返回值,它一定須要進行壓棧操做,這樣一來什麼時候出棧怎麼出棧將變得沒法解決。指針
b.不能向ISR傳遞參數?orm
同理,也是因爲這樣會破壞棧的緣由,由於函數傳遞參數一定會要求壓棧出棧操做,因爲進入中斷服務函數的隨機行,誰給它傳遞參數都成問題開發
c.ISR應儘量的短小精悍?編譯器
若是某個中斷頻繁產生,而它對應的ISR至關的耗時,那麼對中斷的響應就會無限的延遲,會丟掉不少的中斷請求編譯
d.printf(char * lpFormatString,…)函數會帶來重入和性能問題,不能在ISR中採用。變量
這就涉及到一箇中斷嵌套問題,因爲printf之類的glibc函數採用的是緩衝機制,這個緩衝區是共享的,至關於一個全局變量,第一層中斷來時,它向緩衝裏面寫入一些部份內容,剛好這時來了個優先級更高的中斷,它一樣調用了printf,也向緩衝裏面寫入一些內容,這樣緩衝區的內容就錯亂了。硬件