嵌入式軟體工程師筆試面試題分類彙總 中斷服務函式

2021-10-08 03:39:58 字數 1853 閱讀 9601

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的乙個副本,編譯器總要為函...