1. 概述
中斷是指MCU在運行過程中,出現(xiàn)某些意外情況需處理時,MCU能自動停止正在運行的程序并轉(zhuǎn)入處理新情況的程序,處理完畢后又返回原被暫停的程序繼續(xù)運行。中斷提供了應(yīng)用程序與現(xiàn)實世界中發(fā)生的事情之間的接口。例如,我們可以使用中斷來捕獲觸發(fā)的按鈕、看門狗喂狗操作或計算發(fā)生的時間等。
當中斷發(fā)生時,處理器通常查看內(nèi)存中的一個預(yù)先定義好的位置,稱為中斷向量。向量通常包含相關(guān)中斷處理程序的地址,而包含應(yīng)用程序中所有向量的內(nèi)存塊稱為中斷向量表。
2. 基本概念
2.1 中斷的分類
中斷可按優(yōu)先級劃分為單級中斷與多級中斷,也可按OS是否參與處理將中斷分為一類與二類中斷:

2.1.1 單級與多級中斷
單級:即所有的中斷處于同一優(yōu)先級,這也就意味著當一個中斷正在執(zhí)行時,其他中斷必須排隊等待直到當前中斷處理完成。
多級:類似于Task中斷也區(qū)分不同的優(yōu)先級,低優(yōu)先級的中斷可以被高優(yōu)先級的中斷搶占。
2.1.2 一類與二類中斷
一類中斷:不與OS進行交互,是優(yōu)先級最高的中斷,需要用戶正確的配置硬件、編寫處理程序并從中斷中返回,用不好的話出錯概率高,一般應(yīng)用較少。
二類中斷:一般項目中使用的都是此類中斷,中斷發(fā)生時,RTA-OS執(zhí)行內(nèi)部代碼,然后調(diào)用用戶提供的ISR。中斷執(zhí)行從ISR的指定入口點開始,一直持續(xù)到入口函數(shù)返回。

2.2 中斷優(yōu)先級
在中斷的一般應(yīng)用中,中斷以多級中斷應(yīng)用為主,按中斷優(yōu)先級(IPL-Interrupt Priority Level)執(zhí)行,RTA-OS對IPL進行了標準化,其中IPL 0表示用戶級別,其中所有任務(wù)都執(zhí)行,IPL為1或更多表示中斷級別。
在單級平臺上有兩個IPL,0和1。IPL 0表示目標不被中斷,任務(wù)按優(yōu)先級順序運行。IPL 1表示目標正在為中斷提供服務(wù)。由于只有一個非零IPL,所有中斷(類別1和類別2)都以相同的優(yōu)先級運行。這意味著所有中斷都是序列化的,如下圖(a)。
在多級平臺上,高優(yōu)先級中斷可以搶占低優(yōu)先級中斷,因此ISRs處理程序可以嵌套,但ISR不能被低優(yōu)先級任務(wù)搶占,如下圖(b)。

根據(jù)優(yōu)先級順序,一類中斷優(yōu)先級更高,其不能被二類中斷搶占,所有的2類中斷都比最低級的一類中斷低。
也可進一步對中斷的優(yōu)先級按Task及OS級別繼續(xù)劃分為User Level和OS Level,此兩種中斷劃分也是宏觀級別的劃分,具體如下:
2.2.1 User Level
所謂User level,即是用戶可以控制的級別,即Task級別,用戶級別是允許處理所有中斷的最低中斷優(yōu)先級。所有任務(wù)都從其入口點開始在用戶級別執(zhí)行。
任務(wù)有時需要在用戶級別以上運行,例如,它可能需要訪問與ISR共享的數(shù)據(jù)。當數(shù)據(jù)被訪問時,必須防止中斷被調(diào)用。實現(xiàn)這一點的最簡單方法是,可以在任務(wù)在訪問數(shù)據(jù)時禁用中斷。另一種方法是使用Resource機制,即當Task或2類中斷已經(jīng)獲得資源后,其他任務(wù)或ISR無法獲得該資源,防止任何其他任務(wù)或ISR同時進入同一關(guān)鍵部分,如修改同一處變量導(dǎo)致程序出錯。
2.2.2 OS Level
由于二類中斷是需要OS參與,這樣2類ISR的最高優(yōu)先級定義了OS級別。如果執(zhí)行發(fā)生在OS級別或更高級別(一類中斷),則不會發(fā)生其他類別2中斷。RTA-OS使用OS Level來防止并發(fā)訪問內(nèi)部操作系統(tǒng)數(shù)據(jù)結(jié)構(gòu)。
3. 中斷的應(yīng)用
3.1 中斷常用API
對于RTA-OS,在StartOS()后默認所有中斷都打開,實際使用中,一般常用API為使能或禁用中斷,掛起、恢復(fù)中斷,可以調(diào)用如下API來啟用或禁用中斷:
DisableAllInterrupts():禁用所有中斷
EnableAllInterrupts():使能所有中斷
SuspendAllInterrupts() :掛起所有中斷
ResumeAllInterrupts():恢復(fù)所有中斷
SuspendOSInterrupts() :掛起OS級別中斷
ResumeOSInterrupts():恢復(fù)OS級別中斷
以上API在實際使用中,需注意:
1) DisableAllInterrupts() and EnableAllInterrupts()在硬件層面啟用或禁用中斷,這兩個API不能嵌套;
在DisableAllInterrupts()后必須再調(diào)用EnableAllInterrupts();
2) SuspendAllInterrupts() and ResumeAllInterrupts(),掛起及恢復(fù)所有中斷,可以被嵌套;
3) SuspendOSInterrupts() and ResumeOSInterrupts(),可以嵌套使用;
4)Suspend與Resume需要成對出現(xiàn),Resume不要比Suspend多;
5) 一類中斷在關(guān)閉期間,不可以調(diào)用OS的API;
6) 如果2類ISR將中斷級別提高到OS級別以上,并調(diào)用DisableAllInterrupts( ),則它可能不會進行任何其他RTA-OS API調(diào)用,但用于恢復(fù)中斷優(yōu)先級的EnableAllInterrupts( )調(diào)用除外。執(zhí)行ISR時,不允許將中斷優(yōu)先級降低到初始級別以下。
3.2 一/二類中斷的處理
3.2.1一類中斷的處理
用戶必須確保一類ISR輸入功能的名稱與用戶在配置期間為ISR指定的名稱相同。
對于一類ISR,在定義輸入函數(shù)時,通常必須使用編譯器特定的關(guān)鍵字,RTA-OS提供了一個名為CAT1_ISR的宏,該宏可擴展為編譯器工具鏈的正確指令,用戶應(yīng)使用該指令將函數(shù)標記為一類ISR。
3.2.2 二類中斷的處理
二類中斷在RTA-OS控制下執(zhí)行,但不得在2類ISR中放置“中斷返回”命令,中斷返回由RTA-OS處理。當二類中斷需要執(zhí)行時,由RTA-OS調(diào)用中斷的入口函數(shù),二類中斷的入口函數(shù)如下:
#includeISR(isr_identifier){ /* Handler body. */ }
3.3 中斷解除
當硬件檢測到中斷時,它通常會設(shè)置一個掛起位,告訴中斷控制器中斷已經(jīng)發(fā)生。然后,中斷控制器將通過中斷向量表跳轉(zhuǎn)到處理程序,掛起位的處理取決于目標,但有兩個基本方式:
1)中斷處理后(即中斷處理程序的分支發(fā)生時),掛起位自動清除。當處理程序退出時,如果在處理當前中斷時中斷變?yōu)閽炱馉顟B(tài),它將自動重新觸發(fā)。
2)掛起位必須由中斷處理程序中的用戶代碼手動清除。中斷處理程序的主體,無論是一類還是二類都需要包含清除掛起位的代碼,并向硬件發(fā)送中斷已被處理的信號。
3.4 中斷實際配置
RTA-OS使用的是靜態(tài)配置,項目實際開發(fā)中,需要OS開發(fā)人員在OS模塊開始配置前對各模塊(Adc、Pwm、Gpt等)的中斷需求進行分析,如一類/二類中斷?中斷優(yōu)先級?回調(diào)函數(shù)名稱?等,OS開發(fā)人員還需要對中斷優(yōu)先級進行評估,是否會影響系統(tǒng)中其他模塊工作。
此外,RTA-OS使用指定的向量為中斷生成向量表條目。與中斷優(yōu)先級一樣,中斷向量配置也是MCU特有(不同MCU,對應(yīng)的向量表不同)的,因此在配置中斷向量之前需要特別注意MCU選擇。
3.5 更高效的中斷處理方式
每個中斷處理程序?qū)⒃诖a執(zhí)行期間阻止所有優(yōu)先級相同或較低的中斷。在編寫中斷處理程序時,最好將處理程序盡可能短。長時間運行的處理程序會為低優(yōu)先級中斷的服務(wù)增加額外的延遲。
使用中如果需要在中斷中處理較多的代碼,可以采用:將代碼寫到Task中,再通過中斷來激活Task,這樣低優(yōu)先級的任務(wù)可以打斷該Task從而減少延遲,示例代碼如下:
#includeISR(EfficientHandler){ ActivateTask(Task1); } TASK(Task1){ /*Longhandlercode.*/ TerminateTask(); }
審核編輯:湯梓紅
-
處理器
+關(guān)注
關(guān)注
68文章
20255瀏覽量
252273 -
mcu
+關(guān)注
關(guān)注
147文章
18925瀏覽量
398153 -
看門狗
+關(guān)注
關(guān)注
10文章
610瀏覽量
72946 -
中斷
+關(guān)注
關(guān)注
5文章
917瀏覽量
43757
原文標題:RTA OS系列介紹02-中斷
文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
放大電路中反饋的基本概念及判斷方法
中斷的概念及51單片機的中斷系統(tǒng)
USB基本概念及從機編程方法介紹
STM32的中斷系統(tǒng)基本概念
電路的基本概念及定律 英語中文對照表
天線的基本概念及制作
STM32的基本概念及中斷應(yīng)用
單片機中斷的基本概念及中斷系統(tǒng)有什么優(yōu)點
慕課嵌入式開發(fā)及應(yīng)用(第四章.USB基本概念及從機編程方法)
數(shù)字地、模擬地、信號地、交流地、直流地、屏蔽地、浮地基本概念及PCB地線分割的方法
11-中斷的概念及外部IO口輸入中斷INT0的測試
中斷的基本概念及應(yīng)用
評論