剛?cè)腴T做嵌入式開發(fā)時(shí),很多人經(jīng)常糾結(jié):
- 用定時(shí)器采集傳感器數(shù)據(jù),是直接 while 循環(huán)里輪詢標(biāo)志位,還是寫個(gè)中斷函數(shù)?
- 串口收發(fā)數(shù)據(jù)時(shí),是用while(!(USART_SR&RXNE))這種老老實(shí)實(shí)輪詢,還是開個(gè)中斷來接收?
- 項(xiàng)目調(diào)試時(shí)發(fā)現(xiàn),輪詢方式代碼好像更直觀,但 CPU 占用高得嚇人;而中斷看起來更“智能”,但又怕響應(yīng)不及時(shí)。
這種困惑可以說是嵌入式開發(fā)的經(jīng)典問題。今天,我們就來系統(tǒng)梳理一下中斷 vs 輪詢的區(qū)別、優(yōu)缺點(diǎn)和應(yīng)用場(chǎng)景,讓你寫項(xiàng)目時(shí)不再糾結(jié)。
一、輪詢的本質(zhì):CPU 一直在問“好了沒?”
所謂輪詢,就是 CPU 主動(dòng)不斷查詢外設(shè)狀態(tài)寄存器。
例子:
如果我們要檢測(cè)一個(gè)按鍵輸入,代碼可能是:
- while(1){
- if(GPIOx->IDR&PIN_MASK){
- // 按鍵按下,執(zhí)行操作
- }
- }
特點(diǎn):
- 簡(jiǎn)單、直觀,好寫好調(diào)試;
- 但 CPU 一直在跑循環(huán),占用率極高;
- 一旦有多個(gè)任務(wù),就容易顧此失彼。
二、中斷的本質(zhì):外設(shè)主動(dòng)“通知 CPU”
中斷的思路是,CPU 不再傻傻問“好了沒”,而是外設(shè)自己準(zhǔn)備好數(shù)據(jù)時(shí),主動(dòng)打斷 CPU 的當(dāng)前任務(wù),讓 CPU 去執(zhí)行中斷服務(wù)程序。
例子:
- voidEXTI0_IRQHandler(void){
- if(EXTI->PR&(1<<0)){
- EXTI->PR|=(1<<0);// 清中斷標(biāo)志
- // 按鍵按下,執(zhí)行操作
- }
- }
特點(diǎn):
- CPU 不用浪費(fèi)時(shí)間等待;
- 響應(yīng)更實(shí)時(shí);
- 但中斷嵌套過多時(shí),容易造成優(yōu)先級(jí)沖突和響應(yīng)延遲。
三、效率對(duì)比:什么時(shí)候輪詢更好,什么時(shí)候中斷更好?
1. 輪詢的優(yōu)勢(shì)場(chǎng)景
- 任務(wù)非常簡(jiǎn)單:比如檢測(cè)一個(gè) LED 狀態(tài),CPU 沒有別的事干。
- 高頻率、低延遲需求:有些場(chǎng)合下,輪詢比中斷更快,因?yàn)椴恍枰4?恢復(fù)上下文。比如極簡(jiǎn) bit-banging 通信。
- 調(diào)試階段:初學(xué)時(shí),輪詢邏輯更直觀,不容易出錯(cuò)。
2. 中斷的優(yōu)勢(shì)場(chǎng)景
- 多任務(wù)并行:比如 ADC 連續(xù)采樣、UART 通信、外部輸入信號(hào),這些外設(shè)無法預(yù)知何時(shí)到來,中斷能讓 CPU 高效切換。
- 低功耗應(yīng)用:MCU 可以進(jìn)入休眠狀態(tài),等中斷喚醒,而不是一直空跑。
- 實(shí)時(shí)響應(yīng)需求:外設(shè)狀態(tài)一旦變化,立刻觸發(fā) ISR,避免輪詢的延遲。
四、實(shí)戰(zhàn)案例
案例 1:串口接收
- 輪詢方式:CPU 在循環(huán)中不斷檢測(cè)RXNE標(biāo)志,CPU 占用率高,接收速率高時(shí)容易漏數(shù)據(jù)。
- 中斷方式:每來一個(gè)字節(jié)觸發(fā)一次中斷,CPU 只在需要時(shí)處理,效率更高。
【配圖建議:串口數(shù)據(jù)流對(duì)比圖,輪詢方式 CPU 一直忙,中斷方式 CPU 空閑→數(shù)據(jù)來才處理】
案例 2:按鍵輸入
- 輪詢方式:需要在主循環(huán)不斷檢測(cè) GPIO 狀態(tài),不適合低功耗。
- 中斷方式:用外部中斷(EXTI)檢測(cè)電平變化,CPU 平時(shí)休眠,按鍵按下時(shí)自動(dòng)喚醒,非常適合電池供電設(shè)備。
案例 3:高速采樣任務(wù)
- 有時(shí)候輪詢反而比中斷更穩(wěn),比如 1MHz 的采樣時(shí)鐘,如果用中斷,每秒中斷 100 萬次,CPU 可能直接崩潰;
- 此時(shí)更合適的方案是DMA + 定時(shí)器觸發(fā) ADC,比單純中斷/輪詢都高效。
五、開發(fā)者常見誤區(qū)
誤區(qū) 3:中斷一定比輪詢好錯(cuò)。中斷也有開銷,尤其是上下文保存和恢復(fù)。低延遲場(chǎng)景下,簡(jiǎn)單輪詢反而更快。
誤區(qū) 2:輪詢就是“落后”的方式錯(cuò)。對(duì)于某些短小的邏輯,輪詢更容易實(shí)現(xiàn),也不會(huì)帶來復(fù)雜的中斷優(yōu)先級(jí)問題。
誤區(qū) 3:所有任務(wù)都用中斷處理錯(cuò)。中斷太多會(huì)導(dǎo)致優(yōu)先級(jí)沖突,難以維護(hù)。復(fù)雜系統(tǒng)一般會(huì)用中斷 + RTOS 任務(wù)配合,而不是全靠 ISR。
六、總結(jié):怎么選?
- 項(xiàng)目小、邏輯簡(jiǎn)單→ 用輪詢就行,別折騰太復(fù)雜;
- 多任務(wù)并行、功耗敏感→ 中斷更合適;
- 高頻采樣、大數(shù)據(jù)吞吐→ DMA + 定時(shí)器觸發(fā),才是終極方案;
- 調(diào)試階段→ 可以先用輪詢,邏輯清楚后再改成中斷。
一句話總結(jié):中斷不是萬能的,輪詢也不是落后的,兩者都有存在價(jià)值。關(guān)鍵是根據(jù)項(xiàng)目場(chǎng)景來選。
-
嵌入式
+關(guān)注
關(guān)注
5210文章
20680瀏覽量
337383 -
外設(shè)驅(qū)動(dòng)器
+關(guān)注
關(guān)注
0文章
5瀏覽量
3549
發(fā)布評(píng)論請(qǐng)先 登錄
什么叫嵌入式軟件
嵌入式系統(tǒng)的軟件部分
嵌入式系統(tǒng)外設(shè)的使用
Linux嵌入式驅(qū)動(dòng)開發(fā)
嵌入式系統(tǒng)軟件驅(qū)動(dòng)篇
Altera FPGA全國嵌入式創(chuàng)新開發(fā)實(shí)踐
嵌入式系統(tǒng)開發(fā)之中斷控制的實(shí)現(xiàn)
嵌入式實(shí)時(shí)操作系統(tǒng)原理與最佳實(shí)踐
淺談嵌入式MCU的中斷處理
安全基礎(chǔ)--19--嵌入式基礎(chǔ)之系統(tǒng)軟件
中斷還是輪詢?嵌入式外設(shè)驅(qū)動(dòng)的最佳實(shí)踐!
評(píng)論