單片機編程入門基礎(chǔ)知識 中斷函數(shù)注意點?
中斷函數(shù)注意點?1. 中斷處理函數(shù)的返回值和形式參數(shù)中斷處理函數(shù)不能有返回值和形式參數(shù),因為中斷處理函數(shù)是由硬件(或觸發(fā)器)調(diào)用的,沒有程序向其傳遞參數(shù),也沒有程序接收其返回值,其參數(shù)通過全局變量傳遞
中斷函數(shù)注意點?
1. 中斷處理函數(shù)的返回值和形式參數(shù)
中斷處理函數(shù)不能有返回值和形式參數(shù),因為中斷處理函數(shù)是由硬件(或觸發(fā)器)調(diào)用的,沒有程序向其傳遞參數(shù),也沒有程序接收其返回值,其參數(shù)通過全局變量傳遞。
但是,請注意,如果要檢測的其他函數(shù)的全局變量值在中斷服務(wù)函數(shù)中發(fā)生更改,則volatile關(guān)鍵字將用于定義全局變量。因為主程序可能會將變量讀入寄存器,然后每次只使用寄存器中的變量副本。如果此時不使用volatile關(guān)鍵字,則在中斷服務(wù)函數(shù)中修改變量的操作將被短路。
2. 浮點運算是在中斷處理函數(shù)中執(zhí)行的
由于浮點運算通常是由特殊的硬件執(zhí)行的,因此硬件設(shè)備會涉及類似全局變量的內(nèi)容(如硬件端口或存儲在硬件設(shè)備中的數(shù)據(jù))。如果浮點運算過程中斷,其他函數(shù)也可能使用浮點運算,這將破壞設(shè)備中當(dāng)前的硬件數(shù)據(jù)。可以理解,浮點運算通常是不可重入的,因此浮點運算不能用于中斷服務(wù)函數(shù)。
在滿足精度要求的前提下,浮點運算可以多次擴展為整數(shù)運算。
3. 在中斷處理函數(shù)中使用printf函數(shù)
這個原理類似于在上面的中斷服務(wù)函數(shù)中使用浮點數(shù),因為printf函數(shù)使用硬件資源,并且這些資源應(yīng)該是互斥的(在多線程和多處理中),這使得printf函數(shù)不可重入且不能被重入用于中斷。
此外,malloc和free等函數(shù)使用全局內(nèi)存分配表,因此它們也是不可重入的,不能在中斷中使用。
請注意,許多標(biāo)準(zhǔn)庫函數(shù)是不可重入的,在中斷服務(wù)函數(shù)中應(yīng)謹慎使用。
中斷服務(wù)功能應(yīng)簡短有效。
為什么主函數(shù)和中斷函數(shù)不能調(diào)用同一函數(shù)?
這涉及PICC編譯時臨時變量的空間分配算法。
一般來說,為了便于處理,中斷中使用的臨時變量的空間分配獨立于其他地方使用的臨時變量。這可以通過查看已編譯程序集列表中的中斷處理程序集代碼看到。如果中斷函數(shù)與其他函數(shù)同時調(diào)用函數(shù),則會發(fā)生錯誤,除非函數(shù)不需要在內(nèi)部分配臨時變量。我認為對于大多數(shù)應(yīng)用程序,我們可以使用其他方法來解決同時調(diào)用函數(shù)的問題,這最多會浪費一點代碼空間。
單片機,外部中斷程序,為什么不用寫在主程序中?為什么中斷函數(shù)不在主函數(shù)也可以運行?
以51單片機為例說明亞帆的觀點:
中斷是指中斷正在進行的任務(wù)以執(zhí)行更緊急的任務(wù)。顯然,至少需要兩套程序,一套主程序和一套中斷程序。
寫在主程序中只能一步一步地執(zhí)行,不能達到高優(yōu)先級的目的。所以這是行不通的。
0x0000地址是硬件重置后執(zhí)行程序的條目。0x0003是外部中斷項,以此類推。
復(fù)位后,將從0x0000自動執(zhí)行,當(dāng)外部中斷到來時,將從0x0003自動執(zhí)行。當(dāng)函數(shù)寫入中斷0時,該函數(shù)將根據(jù)中斷號自動放置在相應(yīng)的條目上。中斷編號0是將此函數(shù)放入0x0003(實際上是一條跳轉(zhuǎn)指令)。
如果主程序中未打開中斷和啟用中斷,則0x0003是正常的程序存儲空間。
詳見下圖:
如圖所示,中斷僅表示兩組程序(藍色和紅色)。