學(xué)習啦 > 創(chuàng)業(yè)指南 > 職場 > 面試題 > 嵌入式軟件工程師面試題:中斷

嵌入式軟件工程師面試題:中斷

時間: 敏敏644 分享

嵌入式軟件工程師面試題:中斷

  中斷(Interrupts)

  1、 中斷是嵌入式系統(tǒng)中重要的組成部分,這導(dǎo)致了很多編譯開發(fā)商提供一種擴展—讓標準C支持中斷。具代表事實是,產(chǎn)生了一個新的關(guān)鍵字__interrupt。下面的代碼就使用了__interrupt關(guān)鍵字去定義了一個中斷服務(wù)子程序(ISR),請評論一下這段代碼的。

  __interrupt double compute_area (double radius)

  {

  double area = PI * radius * radius;

  printf(" Area = %f", area);

  return area;

  }

  這個函數(shù)有太多的錯誤了,以至讓人不知從何說起了:

  1). ISR 不能返回一個值。如果你不懂這個,那么你不會被雇用的。

  2). ISR 不能傳遞參數(shù)。如果你沒有看到這一點,你被雇用的機會等同第一項。

  3). 在許多的處理器/編譯器中,浮點一般都是不可重入的。有些處理器/編譯器需要讓額處的寄存器入棧,有些處理器/編譯器就是不允許在ISR中做浮點運算。此外,ISR應(yīng)該是短而有效率的,在ISR中做浮點運算是不明智的。

  4). 與第三點一脈相承,printf()經(jīng)常有重入和性能上的問題。如果你丟掉了第三和第四點,我不會太為難你的。不用說,如果你能得到后兩點,那么你的被雇用前景越來越光明了。

  代碼例子(Code examples)

  2、下面的代碼輸出是什么,為什么?

  Void foo(void)

  {

  unsigned int a = 6;

  int b = -20;

  (a+b > 6) puts("> 6") : puts("<= 6");

  }

  這個問題測試你是否懂得C語言中的整數(shù)自動轉(zhuǎn)換原則,我發(fā)現(xiàn)有些開發(fā)者懂得極少這些東西。不管如何,這無符號整型問題的答案是輸出是“>6”。原因是當表達式中存在有符號類型和無符號類型時所有的操作數(shù)都自動轉(zhuǎn)換為無符號類型。 因此-20變成了一個非常大的正整數(shù),所以該表達式計算出的結(jié)果大于6。這一點對于應(yīng)當頻繁用到無符號數(shù)據(jù)類型的嵌入式系統(tǒng)來說是豐常重要的。如果你答錯了這個問題,你也就到了得不到這份工作的邊緣。

  3、 評價下面的代碼片斷:

  unsigned int zero = 0;

  unsigned int compzero = 0xFFFF;

  /*1's complement of zero */

  對于一個int型不是16位的處理器為說,上面的代碼是不正確的。應(yīng)編寫如下:

  unsigned int compzero = ~0;

  這一問題真正能揭露出應(yīng)試者是否懂得處理器字長的重要性。在我的經(jīng)驗里,好的嵌入式程序員非常準確地明白硬件的細節(jié)和它的局限,然而PC機程序往往把硬件作為一個無法避免的煩惱。

  到了這個階段,應(yīng)試者或者完全垂頭喪氣了或者信心滿滿志在必得。如果顯然應(yīng)試者不是很好,那么這個測試就在這里結(jié)束了。但如果顯然應(yīng)試者做得不錯,那么我就扔出下面的追加問題,這些問題是比較難的,我想僅僅非常優(yōu)秀的應(yīng)試者能做得不錯。提出這些問題,我希望更多看到應(yīng)試者應(yīng)付問題的方法,而不是答案。不管如何,你就當是這個娛樂吧…

204019