中斷處理函數(shù)不能有返回值和形式參數(shù),因?yàn)橹袛嗵幚砗瘮?shù)是由硬件(或觸發(fā)器)調(diào)用的,沒有程序向其傳遞參數(shù),也沒有程序接收其返回值,其參數(shù)通過全局變量傳遞。
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括日喀則網(wǎng)站建設(shè)、日喀則網(wǎng)站制作、日喀則網(wǎng)頁(yè)制作以及日喀則網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,日喀則網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到日喀則省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!但是,請(qǐng)注意,如果要檢測(cè)的其他函數(shù)的全局變量值在中斷服務(wù)函數(shù)中發(fā)生更改,則volatile關(guān)鍵字將用于定義全局變量。因?yàn)橹鞒绦蚩赡軙?huì)將變量讀入寄存器,然后每次只使用寄存器中的變量副本。如果此時(shí)不使用volatile關(guān)鍵字,則在中斷服務(wù)函數(shù)中修改變量的操作將被短路。
2.浮點(diǎn)運(yùn)算是在中斷處理函數(shù)中執(zhí)行的
由于浮點(diǎn)運(yùn)算通常是由特殊的硬件執(zhí)行的,因此硬件設(shè)備會(huì)涉及類似全局變量的內(nèi)容(如硬件端口或存儲(chǔ)在硬件設(shè)備中的數(shù)據(jù))。如果浮點(diǎn)運(yùn)算過程中斷,其他函數(shù)也可能使用浮點(diǎn)運(yùn)算,這將破壞設(shè)備中當(dāng)前的硬件數(shù)據(jù)??梢岳斫?,浮點(diǎn)運(yùn)算通常是不可重入的,因此浮點(diǎn)運(yùn)算不能用于中斷服務(wù)函數(shù)。
在滿足精度要求的前提下,浮點(diǎn)運(yùn)算可以多次擴(kuò)展為整數(shù)運(yùn)算。
3.在中斷處理函數(shù)中使用printf函數(shù)
這個(gè)原理類似于在上面的中斷服務(wù)函數(shù)中使用浮點(diǎn)數(shù),因?yàn)閜rintf函數(shù)使用硬件資源,并且這些資源應(yīng)該是互斥的(在多線程和多處理中),這使得printf函數(shù)不可重入且不能被重入用于中斷。
此外,malloc和free等函數(shù)使用全局內(nèi)存分配表,因此它們也是不可重入的,不能在中斷中使用。
請(qǐng)注意,許多標(biāo)準(zhǔn)庫(kù)函數(shù)是不可重入的,在中斷服務(wù)函數(shù)中應(yīng)謹(jǐn)慎使用。
中斷服務(wù)功能應(yīng)簡(jiǎn)短有效。
為什么主函數(shù)和中斷函數(shù)不能調(diào)用同一函數(shù)?這涉及PICC編譯時(shí)臨時(shí)變量的空間分配算法。
一般來(lái)說,為了便于處理,中斷中使用的臨時(shí)變量的空間分配獨(dú)立于其他地方使用的臨時(shí)變量。這可以通過查看已編譯程序集列表中的中斷處理程序集代碼看到。如果中斷函數(shù)與其他函數(shù)同時(shí)調(diào)用函數(shù),則會(huì)發(fā)生錯(cuò)誤,除非函數(shù)不需要在內(nèi)部分配臨時(shí)變量。我認(rèn)為對(duì)于大多數(shù)應(yīng)用程序,我們可以使用其他方法來(lái)解決同時(shí)調(diào)用函數(shù)的問題,這最多會(huì)浪費(fèi)一點(diǎn)代碼空間。
單片機(jī),外部中斷程序,為什么不用寫在主程序中?為什么中斷函數(shù)不在主函數(shù)也可以運(yùn)行?以51單片機(jī)為例說明亞帆的觀點(diǎn):
中斷是指中斷正在進(jìn)行的任務(wù)以執(zhí)行更緊急的任務(wù)。顯然,至少需要兩套程序,一套主程序和一套中斷程序。
寫在主程序中只能一步一步地執(zhí)行,不能達(dá)到高優(yōu)先級(jí)的目的。所以這是行不通的。
0x0000地址是硬件重置后執(zhí)行程序的條目。0x0003是外部中斷項(xiàng),以此類推。
復(fù)位后,將從0x0000自動(dòng)執(zhí)行,當(dāng)外部中斷到來(lái)時(shí),將從0x0003自動(dòng)執(zhí)行。當(dāng)函數(shù)寫入中斷0時(shí),該函數(shù)將根據(jù)中斷號(hào)自動(dòng)放置在相應(yīng)的條目上。中斷編號(hào)0是將此函數(shù)放入0x0003(實(shí)際上是一條跳轉(zhuǎn)指令)。
如果主程序中未打開中斷和啟用中斷,則0x0003是正常的程序存儲(chǔ)空間。
詳見下圖:
如圖所示,中斷僅表示兩組程序(藍(lán)色和紅色)。