版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、預(yù)處理程序1.用預(yù)處理指令#define聲明一個(gè)常數(shù),指示一年有多少秒(忽略閏年問題)#定義秒_每_年(60 * 60 * 24 * 365)UL我想在這里看幾樣?xùn)|西:1)基本的# define語(yǔ)法知識(shí)(例如,不能以分號(hào)結(jié)尾,使用括號(hào)等)。)2)知道預(yù)處理器將為您計(jì)算常量表達(dá)式的值,直接寫下您如何計(jì)算一年中的秒數(shù)而不是實(shí)際值會(huì)更清楚,成本也更低。3)意識(shí)到這個(gè)表達(dá)式將溢出一個(gè)16位機(jī)器的整數(shù),所以使用長(zhǎng)整數(shù)符號(hào)L告訴編譯器這個(gè)常數(shù)是一個(gè)長(zhǎng)整數(shù)。4)如果你在表達(dá)中使用UL,那么你就有了一個(gè)好的起點(diǎn)。記住,第一印象很重要。2.寫一個(gè)“標(biāo)準(zhǔn)”宏MIN。這個(gè)宏輸入兩個(gè)參數(shù),并返回較小的一個(gè)。#定義最小
2、(A,B) (A)=(B)?(一):(二)該測(cè)試旨在實(shí)現(xiàn)以下目的:1)確定宏中#define應(yīng)用程序的基本知識(shí)。這非常重要。因?yàn)樵趦?nèi)聯(lián)操作符成為標(biāo)準(zhǔn)C的一部分之前,宏是容易生成嵌入式代碼的唯一方法,所以嵌入式代碼通常是嵌入式系統(tǒng)實(shí)現(xiàn)所需性能的必要方法。2)三條件算子的知識(shí)。這個(gè)運(yùn)算符存在于C語(yǔ)言中的原因是,它使編譯器能夠產(chǎn)生比if-then-else更優(yōu)化的代碼。理解這個(gè)用法很重要。3)知道如何在宏中小心地將參數(shù)括在括號(hào)中4)我也用這個(gè)問題開始討論宏的副作用,比如:當(dāng)你寫下面的代碼時(shí)會(huì)發(fā)生什么?最小值=最小值(*p,b);3.預(yù)處理器標(biāo)識(shí)#error的目的是什么?如果你不知道答案,請(qǐng)參考參考資
3、料1。這個(gè)問題對(duì)于區(qū)分正常人和書呆子非常有用。只有書呆子才能閱讀C語(yǔ)言課本的附錄,找到這些問題的答案。當(dāng)然,如果你不是在找一個(gè)書呆子,那么候選人最好希望不知道答案。無(wú)限循環(huán)4.無(wú)限循環(huán)經(jīng)常在嵌入式系統(tǒng)中使用。你如何用C寫死循環(huán)?這個(gè)問題有幾種解決方法。我的第一選擇是:而(1)一些程序員更喜歡下面的方案:用于(;)這種實(shí)現(xiàn)讓我很尷尬,因?yàn)檫@種語(yǔ)法不能準(zhǔn)確表達(dá)正在發(fā)生的事情。如果一個(gè)候選人把這個(gè)作為一個(gè)計(jì)劃,我將利用這個(gè)機(jī)會(huì)來(lái)探索他們所做事情的基本原則。如果他們的基本答案是:“我被教導(dǎo)這樣做,但我從未想過為什么?!边@會(huì)給我留下不好的印象。第三種選擇是使用gotoLoop:.轉(zhuǎn)到循環(huán);如果候選人給出
4、了上述建議,這表明他要么是一個(gè)匯編語(yǔ)言程序員(這可能是一件好事),要么是一個(gè)想進(jìn)入新領(lǐng)域的BASIC/FORTRAN程序員。數(shù)據(jù)聲明5.使用變量A給出以下定義一個(gè)整數(shù)指向整數(shù)的指針指向整數(shù)的指針(指向整數(shù)的指針)10個(gè)整數(shù)的數(shù)組e)指向一個(gè)整數(shù)的10個(gè)指針的數(shù)組。(10個(gè)整數(shù)指針的數(shù)組)一個(gè)指向10個(gè)整數(shù)數(shù)組的指針g)指向一個(gè)函數(shù)的指針,該函數(shù)有一個(gè)整數(shù)參數(shù)并返回一個(gè)整數(shù)。h)一個(gè)由10個(gè)指針組成的數(shù)組,指向一個(gè)具有整數(shù)參數(shù)并返回整數(shù)的函數(shù)。答案是:a)整數(shù)a;/整數(shù)b)int * a;/指向整數(shù)的指針c)國(guó)際* * a;/指向整數(shù)指針的指針d)int a10;/10個(gè)整數(shù)的數(shù)組e)int *
5、 a10;/10個(gè)整數(shù)指針的數(shù)組f)int(* a)10;/指向10個(gè)整數(shù)數(shù)組的指針g)int(* a)(int);/指向函數(shù)A的指針,該函數(shù)接受整數(shù)參數(shù)并返回整數(shù)h)int(* a10)(int);/由10個(gè)指針組成的數(shù)組,指向接受整數(shù)參數(shù)并返回整數(shù)的函數(shù)人們經(jīng)常聲稱有幾個(gè)問題需要翻過來(lái)回答。我同意這種說法。當(dāng)我寫這篇文章的時(shí)候,我確實(shí)查了這本書,以確保語(yǔ)法正確。但是當(dāng)我被采訪時(shí),我希望被問到這個(gè)問題(或者類似的問題)。因?yàn)樵诿嬖囍校掖_信我知道這個(gè)問題的答案。如果候選人不知道所有的答案(或者至少大部分答案),那么他就沒有為面試做好準(zhǔn)備。如果候選人沒有為面試做好準(zhǔn)備,那他為什么要準(zhǔn)備呢?靜態(tài)
6、的關(guān)鍵字static的功能是什么?很少有人能完全回答這個(gè)簡(jiǎn)單的問題。在C語(yǔ)言中,關(guān)鍵字static有三個(gè)明顯的功能:1)在函數(shù)體中,聲明為靜態(tài)的變量在調(diào)用該函數(shù)期間保持其值。2)在模塊中(但是在函數(shù)之外),聲明為靜態(tài)的變量可以被模塊中使用的函數(shù)訪問,但是不能被模塊之外的其他函數(shù)訪問。它是一個(gè)局部全局變量。3)在模塊中,聲明為靜態(tài)的函數(shù)只能由模塊中的其他函數(shù)調(diào)用。也就是說,這個(gè)函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)。大多數(shù)考生能正確回答第一部分,有些人能正確回答第二部分,很少有人能理解第三部分。這是一個(gè)候選人的嚴(yán)重缺點(diǎn),因?yàn)樗@然不理解本地化數(shù)據(jù)和代碼范圍的好處和重要性。常數(shù)關(guān)鍵字const是什么
7、意思?我一聽到受訪者說,“常數(shù)意味著常數(shù)”,我就知道我在和一個(gè)業(yè)余愛好者打交道。丹薩克斯在去年的文章中全面總結(jié)了const的所有用途,所以每個(gè)專門用途英語(yǔ)的讀者都應(yīng)該非常熟悉const能做什么和不能做什么。如果你從未讀過那篇文章,就說const的意思是只讀。雖然這個(gè)答案不完整,但我認(rèn)為是正確的。(如果你想要更詳細(xì)的答案,請(qǐng)仔細(xì)閱讀薩克斯。)如果候選人能正確回答這個(gè)問題,我會(huì)再問他一個(gè)問題:以下陳述是什么意思?常量int a;int常量a;常量int *a。int * const a;int常量* a常量;/* * * * */前兩個(gè)函數(shù)是相同的。a是一個(gè)常數(shù)。第三個(gè)意味著A是一個(gè)指向一個(gè)常數(shù)整
8、數(shù)的指針(也就是說,一個(gè)整數(shù)不能被修改,但是指針可以)。第四個(gè)意思是A是一個(gè)指向整數(shù)的常量指針(也就是說,指針指向的整數(shù)可以被修改,但是指針不能被修改)。最后一個(gè)意味著A是指向一個(gè)常數(shù)整數(shù)的常數(shù)指針(也就是說,指針指向的整數(shù)是不可修改的,指針也是不可修改的)。如果候選人能正確回答這些問題,他會(huì)給我留下好印象。順便說一句,你可能會(huì)問,即使你不用關(guān)鍵字const,用正確的函數(shù)編寫程序還是很容易的,那么為什么我如此重視關(guān)鍵字const呢?我還有以下原因:1)關(guān)鍵字const的功能是向代碼的讀者傳達(dá)非常有用的信息。事實(shí)上,聲明一個(gè)參數(shù)常量就是告訴用戶這個(gè)參數(shù)的應(yīng)用目的。如果你花了很多時(shí)間清理別人留下的
9、垃圾,你會(huì)很快學(xué)會(huì)感謝這些額外的信息。(當(dāng)然,知道如何使用常量的程序員很少留下垃圾給別人清理。)2)通過給優(yōu)化器一些額外的信息,使用關(guān)鍵字常量可能會(huì)產(chǎn)生更緊湊的代碼。3)關(guān)鍵字const的合理使用使得編譯器能夠自然地保護(hù)那些不想被無(wú)意的代碼修改所改變的參數(shù)。簡(jiǎn)而言之,這可以減少錯(cuò)誤的發(fā)生。不穩(wěn)定的關(guān)鍵字volatile是什么意思?給出了三個(gè)不同的例子。定義為易變的變量意味著變量可能會(huì)被意外更改,因此編譯器不會(huì)假定變量的值。具體來(lái)說,優(yōu)化器必須在每次使用該變量時(shí)仔細(xì)地重新讀取該變量的值,而不是使用存儲(chǔ)在寄存器中的備份。以下是一些易變變量的例子:1)并行設(shè)備的硬件寄存器(例如狀態(tài)寄存器)2)將在中
10、斷服務(wù)子程序中訪問的非自動(dòng)變量3)多線程應(yīng)用程序中幾個(gè)任務(wù)共享的變量那些不能回答這個(gè)問題的人將不會(huì)被雇用。我認(rèn)為這是區(qū)分C程序員和嵌入式系統(tǒng)程序員的最基本的問題。嵌入式人員經(jīng)常處理硬件、中斷、RTOS等等,所有這些都需要可變的變量。不理解易變的內(nèi)容會(huì)帶來(lái)災(zāi)難。假設(shè)受訪者正確回答了這個(gè)問題(嗯,我懷疑是否會(huì)是這樣),我會(huì)深入一點(diǎn),看看這個(gè)人是否完全意識(shí)到了不穩(wěn)定的重要性。1)參數(shù)可以是常量還是變量?解釋原因。2);指針會(huì)波動(dòng)嗎?解釋原因。3);以下功能有什么問題:int square(volatile int *ptr)返回*ptr * *ptr。答案如下:1)是的。一個(gè)例子是只讀狀態(tài)寄存器。它
11、是不穩(wěn)定的,因?yàn)樗梢员灰馔獾馗淖儭K浅A?,因?yàn)槌绦虿粦?yīng)該試圖修改它。2);是的,雖然這不是很常見。一個(gè)例子是當(dāng)服務(wù)子程序修復(fù)一個(gè)指向緩沖區(qū)的指針時(shí)。3)該代碼有點(diǎn)異常。這段代碼的目的是將指針*ptr返回到值的平方,但是由于*ptr指向一個(gè)易失性參數(shù),編譯器將生成如下代碼:int square(volatile int *ptr)int a,b;a=*ptr。b=*ptr。返回a * b。由于*ptr的值可能會(huì)意外更改,因此A和B可能會(huì)有所不同。因此,該代碼可能不是您期望的平方值!正確的代碼如下:長(zhǎng)平方(可變整數(shù)*ptr)int a;a=*ptr。返回a * a位操作9.嵌入式系統(tǒng)總是要求用
12、戶對(duì)變量或寄存器執(zhí)行位操作。給定一個(gè)整數(shù)變量a,寫兩個(gè)代碼,a的第一個(gè)設(shè)置位3和a的第二個(gè)清零位3。在上述兩個(gè)操作中,保持其他位不變。對(duì)這個(gè)問題有三種基本的反應(yīng)。1)我不知道怎么做。被套從未作為嵌入式系統(tǒng)使用過。2)使用位字段。位域是被扔進(jìn)C語(yǔ)言死角的東西。它確保您的代碼在不同的編譯器之間不可移植,也確保您的代碼不可重用。不幸的是,我最近看到英飛凌為它更復(fù)雜的通信芯片寫了一個(gè)驅(qū)動(dòng)程序。它使用位字段,所以對(duì)我來(lái)說完全沒有用,因?yàn)槲业木幾g器以其他方式實(shí)現(xiàn)位字段。從道德上講,永遠(yuǎn)不要讓一個(gè)非嵌入式的家伙停留在實(shí)際硬件的邊緣。3)使用#定義和位掩碼操作。這是一種高度可移植的方法,應(yīng)該使用。最佳解決方案
13、如下:#定義BIT3 (0x1 3)靜態(tài)int a;void set_bit3(void)a |=BIT3。void clear_bit3(void)a=BIT3。有些人喜歡定義一個(gè)掩碼來(lái)設(shè)置和清除值,同時(shí)定義一些描述常量,這也是可以接受的。我想看到幾個(gè)要點(diǎn):解釋常量,|=和=運(yùn)算。訪問固定的內(nèi)存位置10.嵌入式系統(tǒng)通常要求程序員訪問特定的內(nèi)存位置。在項(xiàng)目中,需要將絕對(duì)地址為0x67a9的整數(shù)變量的值設(shè)置為0xaa66。編譯器是一個(gè)純ANSI編譯器。編寫代碼來(lái)完成這項(xiàng)任務(wù)。這個(gè)問題測(cè)試你是否知道將一個(gè)整數(shù)轉(zhuǎn)換成一個(gè)指針來(lái)訪問一個(gè)絕對(duì)地址是合法的。這個(gè)問題的實(shí)現(xiàn)因個(gè)人風(fēng)格而異。典型的類似代碼如下:int * ptrptr=(int *)0x 67 a9;*ptr=0xaa55。一個(gè)更模糊
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年蚌埠經(jīng)濟(jì)技術(shù)職業(yè)學(xué)院輔導(dǎo)員招聘?jìng)淇碱}庫(kù)附答案
- 雷管制造工崗前生產(chǎn)安全培訓(xùn)考核試卷含答案
- 網(wǎng)球制作工創(chuàng)新方法測(cè)試考核試卷含答案
- 木門窗工安全知識(shí)考核試卷含答案
- 藏藥材種植員安全宣貫水平考核試卷含答案
- 精制鹽工安全風(fēng)險(xiǎn)能力考核試卷含答案
- 汽車發(fā)動(dòng)機(jī)再制造裝調(diào)工操作規(guī)程考核試卷含答案
- 2024年淮南師范學(xué)院馬克思主義基本原理概論期末考試題附答案
- 2025年上海電子信息職業(yè)技術(shù)學(xué)院輔導(dǎo)員招聘考試真題匯編附答案
- 2025年云南農(nóng)業(yè)大學(xué)輔導(dǎo)員招聘?jìng)淇碱}庫(kù)附答案
- 二保焊培訓(xùn)課件
- 工程變更通知(ECN)流程及管理規(guī)范
- 2025至2030中國(guó)助聽器行業(yè)調(diào)研及市場(chǎng)前景預(yù)測(cè)評(píng)估報(bào)告
- 2025-2030碳纖維復(fù)合材料成型設(shè)備技術(shù)發(fā)展與市場(chǎng)前景
- 安全帶質(zhì)檢報(bào)告
- 2025時(shí)事政治試題庫(kù)(附含參考答案)
- 宮腔鏡手術(shù)的護(hù)理常規(guī)
- JJG 1211-2025 自動(dòng)氣象站風(fēng)向傳感器檢定規(guī)程
- 機(jī)械標(biāo)準(zhǔn)-G類-管件
- 醫(yī)療器械培訓(xùn)計(jì)劃和記錄
- 森林質(zhì)量精準(zhǔn)提升的背景與現(xiàn)實(shí)需求分析
評(píng)論
0/150
提交評(píng)論