嵌入式軟件開發工程師面試題目(嵌入式軟件工程師面試自(zì)我(wǒ)介紹)

軟件開發 2453
本篇文章(zhāng)給大家談談嵌入式軟件開發工程師面試題目,以及嵌入式軟件工程師面試自(zì)我(wǒ)介紹對應的(de)知識點,希望對各位有(yǒu)所幫助,不要忘了收藏本站喔。 本文目錄一(yī)覽: 1、學(xué)習嵌入式的(de)人員找工作的(de)時候,面試官一(yī)般會出什麽題目

本篇文章(zhāng)給大家談談嵌入式軟件開發工程師面試題目,以及嵌入式軟件工程師面試自(zì)我(wǒ)介紹對應的(de)知識點,希望對各位有(yǒu)所幫助,不要忘了收藏本站喔。

本文目錄一(yī)覽:

學(xué)習嵌入式的(de)人員找工作的(de)時候,面試官一(yī)般會出什麽題目

最好是能以某個産品舉一(yī)個詳細的(de)例子(zǐ)、驅動開發和(hé)應用層一(yī)般在公司裏面主要職責和(hé)任務是做(zuò)什麽的(de)?

3本人現在想轉到arm+linux上面

1、不知道(dào)移植。比如(rú)說用智能手環

2、還有(yǒu)這些都需要掌握那些技能知識要點

另外兩個肯定是不能簡單的(de)分出誰難誰易了。

純手打,主要用的(de)是C語言。應用工程師則是直接面對客戶的(de)、C++即可(kě)。而應用開發工程師則相對比較簡單,在手機(jī)行(xíng)業,如(rú)果是android的(de)話,應用工程師就是開發應用的(de)。硬件工程師就是設計電路闆1,學(xué)的(de)東西也比較多,另外還要移植一(yī)些boot之類的(de)東西、硬件難度是最大,驅動和(hé)應用難度都差不多,解決電路問題,驅動工程師主要就設計手機(jī)的(de)電路闆。如(rú)果是linux的(de)話肯定是驅動gt,有(yǒu)問題再問我(wǒ),是最難的(de)、硬件工程師需要掌握模電數電信号處理(lǐ)等知識,驅動工程師和(hé)應用工程師,根據客戶的(de)需求設計應用程序。

2,驅動工程師就是你說的(de)移植和(hé)驅動開發,然後提供接口給上層,最重要的(de)是比較懂得內(nèi)核的(de)知識和(hé)驅動設備開發的(de)知識。但是ANDROID的(de)應用開發工程的(de)應用開發相對較難,如(rú)果是用LINUX的(de)話則需要懂得C。國(guó)內(nèi)廠商(shāng)智能手環一(yī)般不會跑arm+linux的(de),而是跑ucos之類的(de)mini系統、這一(yī)塊在研發主要有(yǒu)三個大崗位,需要的(de)知識都很多就是了。驅動工程師主要就負責移植一(yī)些驅動或者開發一(yī)些驅動。而驅動工程師則是需要懂得基礎的(de)電路知識和(hé)應用知識,從底層到上層分别是硬件工程師;應用。比較代表性是的(de)手機(jī)吧(ba)。

3

另外兩個肯定是不能簡單的(de)分出誰難誰易了。

純手打,主要用的(de)是C語言。應用工程師則是直接面對客戶的(de)、C++即可(kě)。而應用開發工程師則相對比較簡單,在手機(jī)行(xíng)業,如(rú)果是android的(de)話,應用工程師就是開發應用的(de)。硬件工程師就是設計電路闆1,學(xué)的(de)東西也比較多,另外還要移植一(yī)些boot之類的(de)東西、硬件難度是最大,驅動和(hé)應用難度都差不多,解決電路問題,驅動工程師主要就設計手機(jī)的(de)電路闆。如(rú)果是linux的(de)話肯定是驅動gt,有(yǒu)問題再問我(wǒ),是最難的(de)、硬件工程師需要掌握模電數電信号處理(lǐ)等知識,驅動工程師和(hé)應用工程師,根據客戶的(de)需求設計應用程序。

2,驅動工程師就是你說的(de)移植和(hé)驅動開發,然後提供接口給上層,最重要的(de)是比較懂得內(nèi)核的(de)知識和(hé)驅動設備開發的(de)知識。但是ANDROID的(de)應用開發工程的(de)應用開發相對較難,如(rú)果是用LINUX的(de)話則需要懂得C。國(guó)內(nèi)廠商(shāng)智能手環一(yī)般不會跑arm+linux的(de),而是跑ucos之類的(de)mini系統、這一(yī)塊在研發主要有(yǒu)三個大崗位,需要的(de)知識都很多就是了。驅動工程師主要就負責移植一(yī)些驅動或者開發一(yī)些驅動。而驅動工程師則是需要懂得基礎的(de)電路知識和(hé)應用知識,從底層到上層分别是硬件工程師;應用。比較代表性是的(de)手機(jī)吧(ba)。

嵌入式工程師面試題

有(yǒu)一(yī)些網上能查到的(de)。不着急的(de)話,我(wǒ)可(kě)以幫你。

可(kě)以PM我(wǒ)。

嵌入式軟件開發工程師需要學(xué)習什麽,待遇如(rú)何

==================================

嵌入式軟件工程師需要學(xué)習內(nèi)容包括C語言,彙編,數據結構,linux高(gāo)級編程,ARM系統,嵌入式內(nèi)核,嵌入式驅動。權威部門統計,我(wǒ)國(guó)嵌入式人才缺口每年(nián)50萬人左右。根據前程無憂網發布的(de)調查報告,嵌入式軟件開發是未來幾年(nián)最熱門和(hé)最受歡迎的(de)職業之一(yī),具有(yǒu)10年(nián)工作經驗的(de)高(gāo)級嵌入式工程師年(nián)薪在30萬元左右。即使是初級的(de)嵌入式軟件開發人員,平均月薪也達到了3000—5000元,中高(gāo)級的(de)嵌入式工程師月薪平均超過10000元。高(gāo)級嵌入式工程師甚至高(gāo)達20000元以上。

看你問的(de)問題,應該是對嵌入式很感興趣,其實你可(kě)以自(zì)學(xué)嵌入式。關于如(rú)何學(xué)習嵌入式,我(wǒ)剛才看到一(yī)篇很不錯的(de)文章(zhāng),是一(yī)個專科(kē)生介紹自(zì)己如(rú)何自(zì)學(xué)嵌入式,并找到嵌入式的(de)工作,裏面介紹了他的(de)學(xué)習方法和(hé)學(xué)習過程,希望對你有(yǒu)幫助。

先做(zuò)個自(zì)我(wǒ)介紹,我(wǒ)07年(nián)考上一(yī)所很爛專科(kē)民辦的(de)學(xué)校,學(xué)的(de)是生物專業,具體的(de)學(xué)校名稱我(wǒ)就不說出來獻醜了。09年(nián)我(wǒ)就辍學(xué)了,我(wǒ)在那樣的(de)學(xué)校,一(yī)年(nián)學(xué)費要1萬多,但是根本沒有(yǒu)人學(xué)習,我(wǒ)實在看不到希望,我(wǒ)就退學(xué)了。

退學(xué)後我(wǒ)也迷茫,大專都沒有(yǒu)畢業,我(wǒ)真的(de)不知道(dào)我(wǒ)能幹什麽,我(wǒ)在糾結着我(wǒ)能做(zuò)什麽。所以辍學(xué)後我(wǒ)一(yī)段時間,我(wǒ)想去(qù)找工作,因為(wèi)我(wǒ)比較沉默寡言,不是很會說話,我(wǒ)不适合去(qù)應聘做(zuò)業務。我(wǒ)想應聘做(zuò)技術的(de),可(kě)是處處碰壁。

一(yī)次偶然的(de)機(jī)會,我(wǒ)才聽到嵌入式這個行(xíng)業。那天我(wǒ)去(qù)新華書店,在計算機(jī)分類那邊想找本書學(xué)習。後來有(yǒu)個女孩子(zǐ)走過來,問我(wǒ)是不是讀計算機(jī)的(de),有(yǒu)沒有(yǒu)興趣學(xué)習嵌入式,然後給我(wǒ)介紹了一(yī)下嵌入式現在的(de)火熱情況,告訴我(wǒ)學(xué)嵌入式多麽的(de)有(yǒu)前景,給我(wǒ)了一(yī)份傳單,嵌入式培訓的(de)廣告。聽了她的(de)介紹,我(wǒ)心裏癢癢的(de),确實我(wǒ)很想去(qù)學(xué)會一(yī)門自(zì)己的(de)技術,靠自(zì)己的(de)雙手吃飯。

回家後,我(wǒ)就上網查了下嵌入式,确實是當今比較熱門的(de)行(xíng)業,也是比較好找工作的(de),工資也是相對比較高(gāo)。我(wǒ)就下決心想學(xué)嵌入式了。于是我(wǒ)去(qù)找嵌入式培訓的(de)相關信息,說真的(de),我(wǒ)也很迷茫,我(wǒ)不知道(dào)培訓是否真的(de)能像他們(men)宣傳的(de)那樣好,所以我(wǒ)就想了解一(yī)段時間再做(zuò)打算。

後來,我(wǒ)在百度知道(dào)看到一(yī)篇讓我(wǒ)很鼓舞的(de)文章(zhāng),是一(yī)個嵌入式高(gāo)手介紹沒有(yǒu)基礎的(de)朋(péng)友怎麽自(zì)學(xué)入門學(xué)嵌入式,文章(zhāng)寫的(de)很好,包含了如(rú)何學(xué)習,該怎麽學(xué)習。他提到一(yī)個方法就是看視(shì)頻,因為(wèi)看書實在太枯燥和(hé)費解的(de),很多我(wǒ)們(men)也看不懂。這點我(wǒ)真的(de)很認同,我(wǒ)自(zì)己看書往往看不了幾頁。

我(wǒ)在想,為(wèi)什麽别人都能自(zì)學(xué)成才,我(wǒ)也可(kě)以的(de)!我(wǒ)要相信自(zì)己,所以我(wǒ)就想自(zì)學(xué),如(rú)果實在學(xué)不會我(wǒ)再去(qù)培訓。

主意一(yī)定,我(wǒ)就去(qù)搜索嵌入式的(de)視(shì)頻,雖然零星找到一(yī)些嵌入式的(de)視(shì)頻,但是都不系統,我(wǒ)是想找一(yī)個能夠告訴我(wǒ)該怎麽學(xué)的(de)視(shì)頻,一(yī)套從入門到精通的(de)視(shì)頻,一(yī)個比較完整的(de)資料,最好能有(yǒu)老師教,不懂可(kě)以請教的(de)。

後來我(wǒ)又找到一(yī)份很好的(de)視(shì)頻,是在IT學(xué)習聯盟網站推出的(de)一(yī)份視(shì)頻《零基礎嵌入式就業班》(喜歡《零基礎嵌入式就業班》的(de)可(kě)以複制 sina.lt/qKh 粘貼浏覽器地(dì)址欄按回車鍵即打開)。裏面的(de)教程還不錯,很完整,可(kě)以讓我(wǒ)從基礎的(de)開始學(xué)起。視(shì)頻比較便宜。

下面介紹下我(wǒ)的(de)學(xué)習流程,希望對和(hé)我(wǒ)一(yī)樣完全沒有(yǒu)基礎的(de)朋(péng)友有(yǒu)所幫助。

收到他們(men)寄過來的(de)光盤後,我(wǒ)就開始學(xué)習了,由于我(wǒ)沒有(yǒu)什麽基礎,我(wǒ)就從最簡單的(de)C語言視(shì)頻教程學(xué)起,話說簡單,其實我(wǒ)還是很多不懂的(de),我(wǒ)隻好請教他們(men),他們(men)還是很熱心的(de),都幫我(wǒ)解決了。C語言我(wǒ)差不多學(xué)了一(yī)個禮拜,接下來我(wǒ)就學(xué)了linux的(de)基本命令,我(wǒ)在他們(men)提供linux虛拟機(jī)上都有(yǒu)做(zuò)練習,敲linux的(de)基本命令,寫簡單的(de)C語言代碼,差不多也就三個禮拜。我(wǒ)每天都在不停的(de)寫一(yī)些簡單的(de)代碼,這樣一(yī)月後我(wǒ)基本掌握了C和(hé)linux的(de)基本操作。

接下來我(wǒ)就去(qù)學(xué)習了人家的(de)視(shì)頻的(de)培訓教程,是整套的(de),和(hé)去(qù)參加培訓沒有(yǒu)多大的(de)區别,這一(yī)看就是兩個月,學(xué)習了ARM的(de)基本原理(lǐ),學(xué)習嵌入式系統的(de)概念,也掌握了嵌入式的(de)環境的(de)一(yī)些搭建,對linux也有(yǒu)更深層次的(de)理(lǐ)解了,明白了嵌入式應用到底是怎麽做(zuò)的(de),但是驅動我(wǒ)隻是有(yǒu)一(yī)點點的(de)了解,這個相對難一(yī)點,我(wǒ)想以後再慢慢啃。

這兩個月,除了吃飯睡覺,我(wǒ)幾乎都在學(xué)習。因為(wèi)我(wǒ)知道(dào)幾乎沒有(yǒu)基礎,比别人差勁,我(wǒ)隻能堅持努力着,我(wǒ)不能放棄,我(wǒ)必要要靠自(zì)己來養活自(zì)己,必須學(xué)好這門技術,然後我(wǒ)就把不懂的(de)問題總結記下來,這樣慢慢積累了一(yī)段時間,我(wǒ)發現自(zì)己真的(de)有(yǒu)點入門了。

最後的(de)一(yī)個月,我(wǒ)就去(qù)看關于實踐部分的(de)內(nèi)容,了解嵌入式項目具體的(de)開發流程,需要什麽樣的(de)知識,我(wǒ)就開始準備這方面的(de)知識,也就是學(xué)習這方面的(de)視(shì)頻,同時他們(men)建議我(wǒ)去(qù)找了找一(yī)些嵌入式面試的(de)題目,為(wèi)自(zì)己以後找工作做(zuò)準備。我(wǒ)就到網上找了很多嵌入式的(de)題目,把他們(men)理(lǐ)解的(de)記下來,這樣差不多準備了20天左右

我(wǒ)覺得自(zì)己差不多入門了,會做(zuò)一(yī)些簡單的(de)東西了。我(wǒ)就想去(qù)找工作看看,于是我(wǒ)就到51job瘋狂的(de)投簡曆,因為(wèi)我(wǒ)學(xué)曆的(de)問題,專科(kē)沒有(yǒu)畢業,說真的(de),大公司沒有(yǒu)人會要我(wǒ),所以我(wǒ)投的(de)都是民營的(de)小公司,我(wǒ)希望自(zì)己的(de)努力有(yǒu)所回報。沒有(yǒu)想過幾天過後,就有(yǒu)面試了,但是第一(yī)次面試我(wǒ)失敗了,雖然我(wǒ)自(zì)認為(wèi)筆(bǐ)試很好,因為(wèi)我(wǒ)之前做(zuò)了準備,但是他們(men)的(de)要求比較嚴格,需要有(yǒu)一(yī)年(nián)的(de)項目經驗,所以我(wǒ)沒有(yǒu)被選中。

後來陸續面試了幾家公司,終于功夫不負有(yǒu)心人。我(wǒ)終于面試上的(de),是在闵行(xíng)的(de)一(yī)家民營的(de)企業,公司規模比較小,我(wǒ)的(de)職務是嵌入式linux應用開發,做(zuò)安防産品的(de)應用的(de)。我(wǒ)想我(wǒ)也比較幸運,經理(lǐ)很看重我(wǒ)的(de)努力,就決定錄用我(wǒ),開的(de)工資是3500一(yī)個月,雖然我(wǒ)知道(dào)在上海3500隻能過溫飽的(de)生活,但是我(wǒ)想我(wǒ)足夠了。我(wǒ)至少不用每天都要靠父母養,我(wǒ)自(zì)己也能養活自(zì)己的(de)。我(wǒ)想隻要我(wǒ)繼續努力,我(wǒ)工資一(yī)定會翻倍的(de)。

把本文寫出來,希望能讓和(hé)我(wǒ)一(yī)樣的(de)沒有(yǒu)基礎的(de)朋(péng)友有(yǒu)信心,其實我(wǒ)們(men)沒有(yǒu)必要自(zì)卑,我(wǒ)們(men)不比别人笨,隻要我(wǒ)們(men)肯努力,我(wǒ)們(men)一(yī)樣會成功。

==========================

===============

嵌入式軟件工程師筆(bǐ)試題誰有(yǒu)啊?

你這是要參加面試了嗎?我(wǒ)這也剛學(xué)習,也是從事嵌入式軟件工程師的(de)。我(wǒ)剛從我(wǒ)們(men)學(xué)校官網扒的(de)面試題:你參考一(yī)下:

這是華清遠見從某嵌入式軟件公司索取的(de)一(yī)套面試題,很顯然對于嵌入式軟件工程師來說這都是"小菜",那麽您可(kě)以測試一(yī)下,這樣會對公司出的(de)面試題不那麽恐懼,希望對你有(yǒu)所幫助。

一(yī)、選擇題

1.下述程序執行(xíng)後的(de)輸出結果是

#include

main()

{

int x='f';

printf("%c\n",'a'+(x-'a'+1));

}

A.g

B.h

C.i

D.j

2.下列程序代碼在Linux系統執行(xíng)後"*"會被輸出多少次()

void main()

{

int i;

for(i=0;i3;i++)

{

fork();

printf("*\n");

}

return;

}

A.14

B.16

C.30

D.32

3.下面有(yǒu)關孤兒進程和(hé)僵屍進程的(de)描述,說法錯誤的(de)是?

A.孤兒進程:一(yī)個父進程退出,而它的(de)一(yī)個或多個子(zǐ)進程還在運行(xíng),那麽那些子(zǐ)進程将成為(wèi)孤兒進程。

B.僵屍進程:一(yī)個進程使用fork創建子(zǐ)進程,如(rú)果子(zǐ)進程退出,而父進程并沒有(yǒu)調用wait或waitpid獲取子(zǐ)進程的(de)狀态信息,那麽子(zǐ)進程的(de)進程描述符仍然保存在系統中。這種進程稱之為(wèi)僵死進程。

C.孤兒進程将被init進程(進程号為(wèi)1)所收養,并由init進程對它們(men)完成狀态收集工作。

D.孤兒進程和(hé)僵屍進程都可(kě)能使系統不能産生新的(de)進程,都應該避免

參考答案:D

4.假如(rú)你需要找出/etc/my.conf文件屬于哪個包(package),你可(kě)以執行(xíng):()

A.rpm -requires/etc/my.conf

B.rpm -q/etc/my.conf

C.rpm -q|grep /etc/my.conf

D.rpm -qf /etc/my.conf

5.表達式 strcmp( " 3.14 "," 3.278 " ) 的(de)值是一(yī)個

A.非零整數

B.浮點數

C.0

D.字符

6.調用recv(int sockfd, void *buf, size_t len, int flags)的(de)過程中,一(yī)共進行(xíng)了幾次內(nèi)存複制操作?

A.1

B.2

C.3

D.4

7.打印一(yī)個N*N的(de)方陣,N為(wèi)每邊字符的(de)個數( 3〈N〈20 ),要求最外層為(wèi)"X",第二層為(wèi)"Y",從第三層起每層依次打印數字0,1,2,3,...

例子(zǐ):當N =5,打印出下面的(de)圖形:

A.X X X X X

B.X Y Y Y X

C.X Y 0 Y X

D.X Y Y Y X

8.設#define N 3

#define Y(n) ((N+1)*n)

則表達式2*(N+Y(5+1))的(de)值是

A.42

B.48

C.54

D.出錯

二、簡答題

1、關鍵字const有(yǒu)什麽含意?

2、.h頭文件中的(de)ifndef/define/endif?的(de)作用?

3、多态類中的(de)虛函數表是Compile-Time,還是Run-Time時建立的(de)?

你如(rú)果不知道(dào)答案的(de)話,可(kě)以去(qù) 華清的(de)嵌入式學(xué)院找。有(yǒu)原文的(de)。

嵌入式軟件工程師經典筆(bǐ)試題和(hé)面試題答案

1. 用預處理(lǐ)指令#define 聲明一(yī)個常數,用以表明1年(nián)中有(yǒu)多少秒(忽略閏年(nián)問題)

#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

我(wǒ)在這想看到幾件事情:

1). #define 語法的(de)基本知識(例如(rú):不能以分号結束,括号的(de)使用,等等)

2). 懂得預處理(lǐ)器将為(wèi)你計算常數表達式的(de)值,因此,直接寫出你是如(rú)何計算一(yī)年(nián)中有(yǒu)多少秒而不是計算出實際的(de)值,是更清晰而沒有(yǒu)代價的(de)。

3). 意識到這個表達式将使一(yī)個16位機(jī)的(de)整型數溢出-因此要用到長(cháng)整型符号L,告訴編譯器這個常數是的(de)長(cháng)整型數。

4). 如(rú)果你在你的(de)表達式中用到UL(表示無符号長(cháng)整型),那麽你有(yǒu)了一(yī)個好的(de)起點。

記住,第一(yī)印象很重要。

2. 寫一(yī)個“标準”宏MIN,這個宏輸入兩個參數并返回較小的(de)一(yī)個。

#define MIN(A,B) ((A) = (B) (A) : (B))

這個測試是為(wèi)下面的(de)目的(de)而設的(de):

1). 标識#define在宏中應用的(de)基本知識。這是很重要的(de),因為(wèi)直到嵌入(inline)操作符變為(wèi)标準C的(de)一(yī)部分,宏是方便産生嵌入代碼的(de)唯一(yī)方法,對于嵌入式系統來說,為(wèi)了能達到要求的(de)性能,嵌入代碼經常是必須的(de)方法。

2). 三重條件操作符的(de)知識。這個操作符存在C語言中的(de)原因是它使得編譯器能産生比if-then-else更優化的(de)代碼,了解這個用法是很重要的(de)。

3). 懂得在宏中小心地(dì)把參數用括号括起來

4). 我(wǒ)也用這個問題開始讨論宏的(de)副作用,例如(rú):當你寫下面的(de)代碼時會發生什麽事?

least = MIN(*p++, b);

3. 預處理(lǐ)器标識#error的(de)目的(de)是什麽?

4. 嵌入式系統中經常要用到無限循環,你怎麽樣用C編寫死循環呢(ne)?

這個問題用幾個解決方案。我(wǒ)首選的(de)方案是:

while(1)

{

}

一(yī)些程序員更喜歡如(rú)下方案:

for(;;)

{

}

這個實現方式讓我(wǒ)為(wèi)難,因為(wèi)這個語法沒有(yǒu)确切表達到底怎麽回事。如(rú)果一(yī)個應試者給出

這個作為(wèi)方案,我(wǒ)将用這個作為(wèi)一(yī)個機(jī)會去(qù)探究他們(men)這樣做(zuò)的(de)

基本原理(lǐ)。如(rú)果他們(men)的(de)基本答案是:“我(wǒ)被教着這樣做(zuò),但從沒有(yǒu)想到過為(wèi)什麽。”這會

給我(wǒ)留下一(yī)個壞印象。

第三個方案是用 goto

Loop:

...

goto Loop;

應試者如(rú)給出上面的(de)方案,這說明或者他是一(yī)個彙編語言程序員(這也許是好事)或者他

是一(yī)個想進入新領域的(de)BASIC/FORTRAN程序員。

數據聲明(Data declarations)

5. 用變量a給出下面的(de)定義

a) 一(yī)個整型數(An integer)

b) 一(yī)個指向整型數的(de)指針(A pointer to an integer)

c) 一(yī)個指向指針的(de)的(de)指針,它指向的(de)指針是指向一(yī)個整型數(A pointer to a pointer

to an integer)

d) 一(yī)個有(yǒu)10個整型數的(de)數組(An array of 10 integers)

e) 一(yī)個有(yǒu)10個指針的(de)數組,該指針是指向一(yī)個整型數的(de)(An array of 10 pointers to

integers)

f) 一(yī)個指向有(yǒu)10個整型數數組的(de)指針(A pointer to an array of 10 integers)

g) 一(yī)個指向函數的(de)指針,該函數有(yǒu)一(yī)個整型參數并返回一(yī)個整型數(A pointer to a fu

nction that takes an integer as an argument and returns an integer)

h) 一(yī)個有(yǒu)10個指針的(de)數組,該指針指向一(yī)個函數,該函數有(yǒu)一(yī)個整型參數并返回一(yī)個整型

數( An array of ten pointers to functions that take an integer argument and r

eturn an integer )

答案是:

a) int a; // An integer

b) int *a; // A pointer to an integer

c) int **a; // A pointer to a pointer to an integer

d) int a[10]; // An array of 10 integers

e) int *a[10]; // An array of 10 pointers to integers

f) int (*a)[10]; // A pointer to an array of 10 integers

g) int (*a)(int); // A pointer to a function a that takes an integer argument

and returns an integer

h) int (*a[10])(int); // An array of 10 pointers to functions that take an int

eger argument and return an integer

人們(men)經常聲稱這裏有(yǒu)幾個問題是那種要翻一(yī)下書才能回答的(de)問題,我(wǒ)同意這種說法。當我(wǒ)寫這篇文章(zhāng)時,為(wèi)了确定語法的(de)正确性,我(wǒ)的(de)确查了一(yī)下書。

但是當我(wǒ)被面試的(de)時候,我(wǒ)期望被問到這個問題(或者相近的(de)問題)。因為(wèi)在被面試的(de)這段時間裏,我(wǒ)确定我(wǒ)知道(dào)這個問題的(de)答案。應試者如(rú)果不知道(dào)所有(yǒu)的(de)答案(或至少大部分答案),那麽也就沒有(yǒu)為(wèi)這次面試做(zuò)準備,如(rú)果該面試者沒有(yǒu)為(wèi)這次面試做(zuò)準備,那麽他又能為(wèi)什麽出準備呢(ne)?

Static

6. 關鍵字static的(de)作用是什麽?

這個簡單的(de)問題很少有(yǒu)人能回答完全。在C語言中,關鍵字static有(yǒu)三個明顯的(de)作用:

1). 在函數體,一(yī)個被聲明為(wèi)靜态的(de)變量在這一(yī)函數被調用過程中維持其值不變。

2). 在模塊內(nèi)(但在函數體外),一(yī)個被聲明為(wèi)靜态的(de)變量可(kě)以被模塊內(nèi)所用函數訪問,但不能被模塊外其它函數訪問。它是一(yī)個本地(dì)的(de)全局變量。

3). 在模塊內(nèi),一(yī)個被聲明為(wèi)靜态的(de)函數隻可(kě)被這一(yī)模塊內(nèi)的(de)其它函數調用。那就是,這個函數被限制在聲明它的(de)模塊的(de)本地(dì)範圍內(nèi)使用。

大多數應試者能正确回答第一(yī)部分,一(yī)部分能正确回答第二部分,同是很少的(de)人能懂得第三部分。這是一(yī)個應試者的(de)嚴重的(de)缺點,因為(wèi)他顯然不懂得本地(dì)化數據和(hé)代碼範圍的(de)好處和(hé)重要性。

Const

7.關鍵字const是什麽含意?

我(wǒ)隻要一(yī)聽到被面試者說:“const意味着常數”,我(wǒ)就知道(dào)我(wǒ)正在和(hé)一(yī)個業餘者打交道(dào)。去(qù)年(nián)Dan Saks已經在他的(de)文章(zhāng)裏完全概括了const的(de)所有(yǒu)用法,因此ESP(譯者:Embedded Systems Programming)的(de)每一(yī)位讀者應該非常熟悉const能做(zuò)什麽和(hé)不能做(zuò)什麽.如(rú)果你從沒有(yǒu)讀到那篇文章(zhāng),隻要能說出const意味着“隻讀”就可(kě)以了。盡管這個答案不是完全的(de)

答案,但我(wǒ)接受它作為(wèi)一(yī)個正确的(de)答案。(如(rú)果你想知道(dào)更詳細的(de)答案,仔細讀一(yī)下Saks的(de)文章(zhāng)吧(ba)。)如(rú)果應試者能正确回答這個問題,我(wǒ)将問他一(yī)個附加的(de)問題:下面的(de)聲明都是什麽意思?

const int a;

int const a;

const int *a;

int * const a;

int const * a const;

前兩個的(de)作用是一(yī)樣,a是一(yī)個常整型數。第三個意味着a是一(yī)個指向常整型數的(de)指針(也就是,整型數是不可(kě)修改的(de),但指針可(kě)以)。第四個意思a是一(yī)個指向整型數的(de)常指針(也就是說,指針指向的(de)整型數是可(kě)以修改的(de),但指針是不可(kě)修改的(de))。最後一(yī)個意味着a是一(yī)個指向常整型數的(de)常指針(也就是說,指針指向的(de)整型數是不可(kě)修改的(de),同時指針也是不可(kě)修改的(de))。如(rú)果應試者能正确回答這些問題,那麽他就給我(wǒ)留下了一(yī)個好印象。順帶提一(yī)句,也許你可(kě)能會問,即使不用關鍵字const,也還是能很容易寫出功能正确的(de)程序,那麽我(wǒ)為(wèi)什麽還要如(rú)此看重關鍵字const呢(ne)?我(wǒ)也如(rú)下的(de)幾下理(lǐ)由:

1). 關鍵字const的(de)作用是為(wèi)給讀你代碼的(de)人傳達非常有(yǒu)用的(de)信息,實際上,聲明一(yī)個參數為(wèi)常量是為(wèi)了告訴了用戶這個參數的(de)應用目的(de)。如(rú)果你曾花很多時間清理(lǐ)其它人留下的(de)垃圾,你就會很快學(xué)會感謝這點多餘的(de)信息。(當然,懂得用const的(de)程序員很少會留下的(de)垃圾讓别人來清理(lǐ)的(de)。)

2). 通過給優化器一(yī)些附加的(de)信息,使用關鍵字const也許能産生更緊湊的(de)代碼。

3). 合理(lǐ)地(dì)使用關鍵字const可(kě)以使編譯器很自(zì)然地(dì)保護那些不希望被改變的(de)參數,防止其被無意的(de)代碼修改。簡而言之,這樣可(kě)以減少bug的(de)出現。

Volatile

8. 關鍵字volatile有(yǒu)什麽含意 并給出三個不同的(de)例子(zǐ)。

一(yī)個定義為(wèi)volatile的(de)變量是說這變量可(kě)能會被意想不到地(dì)改變,這樣,編譯器就不會去(qù)假設這個變量的(de)值了。精确地(dì)說就是,優化器在用到這個變量時必須每次都小心地(dì)重新讀取這個變量的(de)值,而不是使用保存在寄存器裏的(de)備份。下面是volatile變量的(de)幾個例子(zǐ):

1). 并行(xíng)設備的(de)硬件寄存器(如(rú):狀态寄存器)

2). 一(yī)個中斷服務子(zǐ)程序中會訪問到的(de)非自(zì)動變量(Non-automatic variables)

3). 多線程應用中被幾個任務共享的(de)變量

回答不出這個問題的(de)人是不會被雇傭的(de)。我(wǒ)認為(wèi)這是區分C程序員和(hé)嵌入式系統程序員的(de)最

基本的(de)問題。嵌入式系統程序員經常同硬件、中斷、RTOS等等打交道(dào),所用這些都要求vo

latile變量。不懂得volatile內(nèi)容将會帶來災難。

假設被面試者正确地(dì)回答了這是問題(嗯,懷疑這否會是這樣),我(wǒ)将稍微深究一(yī)下,看

一(yī)下這家夥是不是直正懂得volatile完全的(de)重要性。

1). 一(yī)個參數既可(kě)以是const還可(kě)以是volatile嗎?解釋為(wèi)什麽。

2). 一(yī)個指針可(kě)以是volatile 嗎?解釋為(wèi)什麽。

3). 下面的(de)函數有(yǒu)什麽錯誤:

int square(volatile int *ptr)

{

return *ptr * *ptr;

}

下面是答案:

1). 是的(de)。一(yī)個例子(zǐ)是隻讀的(de)狀态寄存器。它是volatile因為(wèi)它可(kě)能被意想不到地(dì)改變。

它是const因為(wèi)程序不應該試圖去(qù)修改它。

2). 是的(de)。盡管這并不很常見。一(yī)個例子(zǐ)是當一(yī)個中服務子(zǐ)程序修該一(yī)個指向一(yī)個buffer

的(de)指針時。

3). 這段代碼的(de)有(yǒu)個惡作劇。這段代碼的(de)目的(de)是用來返指針*ptr指向值的(de)平方,但是,由

于*ptr指向一(yī)個volatile型參數,編譯器将産生類似下面的(de)代碼:

int square(volatile int *ptr)

{

int a,b;

a = *ptr;

b = *ptr;

return a * b;

}

由于*ptr的(de)值可(kě)能被意想不到地(dì)該變,因此a和(hé)b可(kě)能是不同的(de)。結果,這段代碼可(kě)能返不

是你所期望的(de)平方值!正确的(de)代碼如(rú)下:

long square(volatile int *ptr)

{

int a;

a = *ptr;

return a * a;

}

位操作(Bit manipulation) 1 2

關于嵌入式軟件開發工程師面試題目和(hé)嵌入式軟件工程師面試自(zì)我(wǒ)介紹的(de)介紹到此就結束了,不知道(dào)你從中找到你需要的(de)信息了嗎 ?如(rú)果你還想了解更多這方面的(de)信息,記得收藏關注本站。

掃碼二維碼