3.常見題型
今天來學習記錄下中斷服務函式(isr)。關於中斷,其實大家或多或少都會了解過,那麼,在筆試&面試中,關於中斷服務子函式,我們又需要知道那些知識點?
1. 中斷服務函式不能有返回值;
2. 中斷服務函式不能傳入引數;
3. 中斷服務函式要短小精悍;
4. 中斷服務函式中不能使用printf等glibc函式,會帶來重入性和效能問題;
解析:首先,中斷源連線到硬體,由硬體來觸發產生中斷,即:中斷源提出中斷申請,而中斷申請一般由硬體電路產生,申請提出時間是隨機的,因此中斷的產生是隨機的,也就是說,中斷服務函式的呼叫是硬體級別的。當中斷產生時,pc指標強制跳轉到相應的中斷服務函式入口執行中斷服務函式。
1)關於返回值,需要進行入棧出棧操作。由於中斷是隨機的,且由硬體告知,並不是由某段**呼叫,所以,如果有返回值那麼返回值將返回給誰?顯然,這是毫無意義的!也就是說,如果中斷服務函式有返回值,返回時將返回值壓入棧中後,那麼何時出棧、如何出棧?
2)關於傳入引數,這和返回值類似,也需要入棧出棧,那麼什麼時候入棧,誰給它傳遞引數?
3)至於isr要短小精悍就更好理解了。假設存在乙個中斷,其中斷產生的次數較為頻繁,而它對應isr耗時較長,那麼對於中斷的響應就會無限的延遲,從而會錯過很多中斷請求;
4)關於printf函式帶來的重入性和效能問題,需要了解像printf這樣的glibc函式,其採用的是緩衝機制,該緩衝區域是共享的,可以理解為全域性變數。當某個中斷發生時,向緩衝區中寫入某些內容,而恰巧此時來了乙個更高階的中斷,它同樣呼叫了printf函式,也向緩衝區中寫入某些內容,此時,緩衝區中的內容就混亂了。
中斷和子程式的呼叫有一定的相似性,但是這兩者的區別卻又很大,這裡就來掀開窗簾,看看這兩個到底在搞什麼破事!
正在執行的子程式再呼叫另乙個子程式、正在處理的中斷程式又被另乙個新的中斷請求所中斷說白了他們倆的相似性基本上是因為過程相似,從本質上講,他們倆完全不一樣。根本區別主要集中在服務時間和服務物件上。
呼叫子程式是程式設計者事先安排的,也就是說呼叫子程式過程發生的時間是已知和固定的,即在主程式中呼叫指令執行時發生子程式的呼叫,呼叫指令的位置是已知和固定的;而中斷如先前講述的,它是隨機的,由系統工作環境隨機決定。
子程式為主程式提供服務,兩者屬於從屬關係;而中斷服務程式與主程式一般無關,不存在誰為誰提供服務的說法,即兩者是平行的關係;
此外,還有一些其他的區別:
主程式呼叫子程式的過程完全屬於軟體處理過程,不需要專門的硬體電路;而中斷的過程軟硬結合,需要專門的硬體電路才能夠完成中斷處理的過程;
子程式巢狀可以實現若干級,巢狀的最多級數由計算機記憶體開闢的堆疊大小限制;而中斷巢狀的級數主要由中斷優先順序級數來限制,一般優先級數不會很大
__interrupt double compute_area (
double radius)
這段**基本上把上面提到的4大注意點全都無視了…>_<
第一行,傳入引數了;
第二行,在許多的處理器/編譯器中,浮點一般都是不可重入的。有些處理器/編譯器需要讓額處的暫存器入棧,有些處理器/編譯器就是不允許在isr中做浮點運算;
第三行,使用printf()函式帶來的重入性和效能問題;
第四行,isr中不能有返回值;
整體上,isr應該是短小精悍的,所以在isr中做浮點運算是不明智的;
《未完,持續更新中…>
嵌入式軟體工程師面試題
embedded software design engineer 1 讀程式段,回答問題 int main int argc,char argv a 寫出程式輸出 b 在乙個可移植的系統中這種表示式是否存在風險?why?include stdio.h int a 0 int b static ch...
嵌入式軟體工程師筆試題
一 選擇題 1 定義函式 時,預設函式的型別宣告,則函式型別取預設型別 a.void b.char c.float d.int 參 d 二 簡答 1 多型類中的虛函式表是compile time,還是run time時建立的?參 虛函式表是在編譯期就建立了,各個虛函式這時被組織成了乙個虛函式的入口位...
嵌入式軟體工程師面試題1
1 include 2 using namespace std 34 void getmemory char p,int num 78 int main void 問題出在void getmemory char p,int num 裡面,這裡面的 p其實是main 裡str的乙個副本,編譯器總要為函...