日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

嵌入式程序员面试时应该知道的16个问题

發(fā)布時間:2025/6/15 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 嵌入式程序员面试时应该知道的16个问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、預(yù)處理器(Preprocessor)

2、如何定義宏

3、預(yù)處理器標(biāo)識#error的目的是什么?

4、死循環(huán)(Infinite loops)

5、數(shù)據(jù)聲明(Data declarations)

6、關(guān)鍵字static的作用是什么?

7、關(guān)鍵字const有什么含意?

8、Volatile的使用

9、位操作(Bit manipulation)

10、訪問固定的內(nèi)存位置(Accessing fixed memory locations)

11、中斷(Interrupts)

12、符號擴展的代碼例子(Code examples)

13、處理器字長導(dǎo)致的數(shù)據(jù)擴展問題

14、動態(tài)內(nèi)存分配(Dynamic memory allocation)

15、用Typedef構(gòu)造復(fù)合類型

16、晦澀的語法及代碼風(fēng)格

?

?

?

C語言測試是招聘嵌入式系統(tǒng)程序員過程中必須而且有效的方法。這些年,我既參加也組織了許多這種測試,在這過程中我意識到這些測試能為面試者和被面試者提供許多有用信息,此外,撇開面試的壓力不談,這種測試也是相當(dāng)有趣的。

從被面試者的角度來講,你能了解許多關(guān)于出題者或監(jiān)考者的情況。這個測試只是出題者為顯示其對ANSI標(biāo)準(zhǔn)細(xì)節(jié)的知識而不是技術(shù)技巧而設(shè)計嗎?這是個愚蠢的問題嗎?如要你答出某個字符的ASCII值。這些問題著重考察你的系統(tǒng)調(diào)用和內(nèi)存分配策略方面的能力嗎?這標(biāo)志著出題者也許花時間在微機上而不是在嵌入式系統(tǒng)上。如果上述任何問題的答案是"是"的話,那么我知道我得認(rèn)真考慮我是否應(yīng)該去做這份工作。

從面試者的角度來講,一個測試也許能從多方面揭示應(yīng)試者的素質(zhì):最基本的,你能了解應(yīng)試者C語言的水平。不管怎么樣,看一下這人如何回答他不會的問題也是滿有趣。應(yīng)試者是以好的直覺做出明智的選擇,還是只是瞎蒙呢?當(dāng)應(yīng)試者在某個問題上卡住時是找借口呢,還是表現(xiàn)出對問題的真正的好奇心,把這看成學(xué)習(xí)的機會呢?我發(fā)現(xiàn)這些信息與他們的測試成績一樣有用。

有了這些想法,我決定出一些真正針對嵌入式系統(tǒng)的考題,希望這些令人頭痛的考題能給正在找工作的人一點幫助。這些問題都是我這些年實際碰到的。其中有些題很難,但它們應(yīng)該都能給你一點啟迪。

這個測試適于不同水平的應(yīng)試者,大多數(shù)初級水平的應(yīng)試者的成績會很差,經(jīng)驗豐富的程序員應(yīng)該有很好的成績。為了讓你能自己決定某些問題的偏好,每個問題沒有分配分?jǐn)?shù),如果選擇這些考題為你所用,請自行按你的意思分配分?jǐn)?shù)。

?

1、預(yù)處理器(Preprocessor)
用預(yù)處理指令#define 聲明一個常數(shù),用以表明1年中有多少秒(忽略閏年問題)

#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL?錯#define SECONDS_PER_YEAR (60 * 60 * 24 * 365UL)對

因為UL寫在了括號外面,無法與數(shù)據(jù)進行匹配

(大小寫都行,常量后面可以加此標(biāo)志,宏的命名風(fēng)格要大寫,多個之間用下劃線)

我在這想看到幾件事情:

1) #define 語法的基本知識(例如:不能以分號結(jié)束,括號的使用(表達式、參數(shù)等要括起來),等等)

2)懂得預(yù)處理器將為你計算常數(shù)表達式的值(難道不是替換么,先算再替?會將常數(shù)合并),因此,直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是更清晰而沒有代價的。

3) 意識到這個表達式將使一個16位機的整型數(shù)溢出-因此要用到長整型符號L,告訴編譯器這個常數(shù)是的長整型數(shù)。

4) 如果你在你的表達式中用到UL(表示無符號長整型),那么你有了一個好的起點。記住,第一印象很重要。

?

2、如何定義宏
寫一個"標(biāo)準(zhǔn)"宏MIN ,這個宏輸入兩個參數(shù)并返回較小的一個。

考點:(表達式、參數(shù)等要括起來)

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

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

1) 標(biāo)識#define在宏中應(yīng)用的基本知識。這是很重要的。因為在嵌入(inline)操作符變?yōu)闃?biāo)準(zhǔn)C的一部分之前,宏是方便產(chǎn)生嵌入代碼的唯一方法,對于嵌入式系統(tǒng)來說,為了能達到要求的性能(當(dāng)然主要是實時性哦,犧牲代碼空間換取時間效率),嵌入代碼經(jīng)常是必須的方法。

2)三重條件操作符的知識。這個操作符存在C語言中的原因是它使得編譯器能產(chǎn)生比if-then-else(存在條件轉(zhuǎn)移會中斷指令流水線)更優(yōu)化的代碼,了解這個用法是很重要的。

3) 懂得在宏中小心地把參數(shù)用括號括起來

4) 我也用這個問題開始討論宏的副作用,例如:當(dāng)你寫下面的代碼時會發(fā)生什么事?

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

?

此處考點:inline函數(shù)和宏的區(qū)別

宏只是將參數(shù)完全替換,即MIN(*p++, b)進行宏展開后為((*p++) <= (b) ? (*p++) : (b)),如果(*p++) <= (b)成立,則表達式的值為(*p++),但由于在(*p++)<= (b)判斷過程中改變了p的值,使得此時的? (*p++)非(*p++)<= (b)中的值了,違背了?號表達式的原意。

但是內(nèi)聯(lián)inline函數(shù)將進行參數(shù)檢查,求出參數(shù)的值后再將此值帶入函數(shù)中,因此((A) <= (B) ? (A) : (B))中的A是一致的。

?

第一部分:宏
為什么要使用宏呢?
因為函數(shù)的調(diào)用必須要將程序執(zhí)行的順序轉(zhuǎn)移到函數(shù)所存放在內(nèi)存中的某個地址,將函數(shù)的程序內(nèi)容執(zhí)行完后,再返回到轉(zhuǎn)去執(zhí)行該函數(shù)前的地方。這種轉(zhuǎn)移操作要求在轉(zhuǎn)去執(zhí)行前要保存現(xiàn)場并記憶執(zhí)行的地址,轉(zhuǎn)回后要恢復(fù)現(xiàn)場,并按原來保存地址繼續(xù)執(zhí)行。因此,函數(shù)調(diào)用要有一定的時間和空間方面的開銷,于是將影響其效率。
而宏只是在預(yù)處理的地方把代碼展開,不需要額外的空間和時間方面的開銷,所以調(diào)用一個宏比調(diào)用一個函數(shù)更有效率。
但是宏也有很多的不盡人意的地方。
1、宏不能訪問對象的私有成員。
2、宏的定義很容易產(chǎn)生二意性。

3、宏定義的常量在代碼區(qū),很多調(diào)試器不能夠?qū)ζ湔{(diào)試
我們舉個例子:
#define square(x) (x*x)

避免這些錯誤的方法,一是給宏的參數(shù)都加上括號。
#define square(x) ((x)*(x))

第二部分:內(nèi)聯(lián)函數(shù)
從上面的闡述,可以看到宏有一些難以避免的問題,怎么解決呢?
內(nèi)聯(lián)函數(shù)是代碼被插入到調(diào)用者代碼處的函數(shù)。如同 #define 宏,內(nèi)聯(lián)函數(shù)通過避免被調(diào)用的開銷來提高執(zhí)行效率,尤其是它能夠通過調(diào)用(“過程化集成”)被編譯器優(yōu)化。


內(nèi)聯(lián)函數(shù)和宏很類似,而本質(zhì)區(qū)別在于,宏是由預(yù)處理器對宏進行替代,而內(nèi)聯(lián)函數(shù)是通過編譯器控制來實現(xiàn)的。而且內(nèi)聯(lián)函數(shù)是真正的函數(shù),只是在需要用到的時候,內(nèi)聯(lián)函數(shù)像宏一樣的展開,所以取消了函數(shù)的參數(shù)壓棧,減少了調(diào)用的開銷。你可以象調(diào)用函數(shù)一樣來調(diào)用內(nèi)聯(lián)函數(shù),而不必?fù)?dān)心會產(chǎn)生于處理宏的一些問題。
聲明內(nèi)聯(lián)函數(shù)看上去和普通函數(shù)非常相似:
void f(int i, char c);
當(dāng)你定義一個內(nèi)聯(lián)函數(shù)時,在函數(shù)定義前加上 inline 關(guān)鍵字,并且將定義放入頭文件:
inline void f(int i, char c)
{
// ...
}
內(nèi)聯(lián)函數(shù)必須是和函數(shù)體的定義申明在一起,才有效。
像這樣的申明inline function(int i)是沒有效果的,編譯器只是把函數(shù)作為普通的函數(shù)申明,我們必須定義函數(shù)體。
inline int function(int i) {return i*i;}
這樣我們才算定義了一個內(nèi)聯(lián)函數(shù)。我們可以把它作為一般的函數(shù)一樣調(diào)用。但是執(zhí)行速度確比一般函數(shù)的執(zhí)行速度要快。


當(dāng)然,內(nèi)聯(lián)函數(shù)也有一定的局限性。就是函數(shù)中的執(zhí)行代碼不能太多了,如果,內(nèi)聯(lián)函數(shù)的函數(shù)體過大,一般的編譯器會放棄內(nèi)聯(lián)方式,而采用普通的方式調(diào)用函數(shù)。這樣,內(nèi)聯(lián)函數(shù)就和普通函數(shù)執(zhí)行效率一樣了。
有上面的兩者的特性,我們可以用內(nèi)聯(lián)函數(shù)完全取代預(yù)處理宏。

?

3、預(yù)處理器標(biāo)識#error的目的是什么?
如果你不知道答案,請看參考文獻1。這問題對區(qū)分一個正常的伙計和一個書呆子是很有用的。只有書呆子才會讀C語言課本的附錄去找出象這種問題的答案。當(dāng)然如果你不是在找一個書呆子,那么應(yīng)試者最好希望自己不要知道答案。

?

4、死循環(huán)(Infinite loops)
嵌入式系統(tǒng)中經(jīng)常要用到無限循環(huán),你怎么樣用C編寫死循環(huán)呢? 這個問題用幾個解決方案。?

我首選的方案是:

while(1)

{

?

}

一些程序員更喜歡如下方案:

for(;;) (此處的判斷效率要低的多,在匯編代碼中看看???)

{

?

}

這個實現(xiàn)方式讓我為難,因為這個語法沒有確切表達到底怎么回事。如果一個應(yīng)試者給出這個作為方案,我將用這個作為一個機會去探究他們這樣做的基本原理。如果他們的基本答案是:"我被教著這樣做,但從沒有想到過為什么。"這會給我留下一個壞印象。 (很多時候面試官關(guān)注你思考問題的方式,是否留意某些東西善于思考,可能并沒有對錯,只是偏好而已,比如memset和memcopy以及strcpy都能拷貝字符串,到底有什么區(qū)別呢?看你是否善于比較是否關(guān)注細(xì)節(jié))

?

第三個方案是用 goto (goto語句在C中是應(yīng)該盡量避免的,只在處理錯誤代碼時用)

Loop:

...

goto Loop;

應(yīng)試者如給出上面的方案,這說明或者他是一個匯編語言程序員(這也許是好事)或者他是一個想進入新領(lǐng)域的BASIC/FORTRAN程序員。

?

5、數(shù)據(jù)聲明(Data declarations)?
用變量a給出下面的定義

a) 一個整型數(shù)(An integer)?

b)一個指向整型數(shù)的指針( A pointer to an integer)?

c)一個指向指針的的指針,它指向的指針是指向一個整型數(shù)( A pointer to a pointer to an integers)?

d)一個有10個整型數(shù)的數(shù)組( An array of 10 integers)?

e) 一個有10個指針的數(shù)組,該指針是指向一個整型數(shù)的。(An array of 10 pointers to ?integers)?

f) 一個指向有10個整型數(shù)數(shù)組的指針( A pointer to an array of 10 integers)?

g) 一個指向函數(shù)的指針,該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)(A pointer to a function ?that takes an integer as an argument and returns an integer)?

h) 一個有10個指針的數(shù)組,該指針指向一個函數(shù),該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)( An array of ten pointers to functions that take an integer argument and return 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 ?// 不是(int x),不需要具體的參數(shù)

h) int (*a[10])(int)(可以從e、g類比得到); // An array of 10 pointers to ?functions that take an integer argument and return an integer?

人們經(jīng)常聲稱這里有幾個問題是那種要翻一下書才能回答的問題,我同意這種說法。當(dāng)我寫這篇文章時,為了確定語法的正確性,我的確查了一下書。但是當(dāng)我被面試的時候,我期望被問到這個問題(或者相近的問題)。因為在被面試的這段時間里,我確定我知道這個問題的答案。應(yīng)試者如果不知道所有的答案(或至少大部分答案),那么也就沒有為這次面試做準(zhǔn)備,如果該面試者沒有為這次面試做準(zhǔn)備,那么他又能為什么做準(zhǔn)備呢?

?

6、關(guān)鍵字static的作用是什么?
這個簡單的問題很少有人能回答完全。在C語言中,關(guān)鍵字static有三個明顯的作用:

1)在函數(shù)體內(nèi),一個被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過程中維持其值不變(該變量存放在靜態(tài)變量區(qū))。

2) 在模塊內(nèi)(但在函數(shù)體外),一個被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問。它是一個本地的全局變量。

3) 在模塊內(nèi),一個被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用。那就是,這個函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。

大多數(shù)應(yīng)試者能正確回答第一部分,一部分能正確回答第二部分,但是很少的人能懂得第三部分。這是一個應(yīng)試者的嚴(yán)重的缺點,因為他顯然不懂得本地化數(shù)據(jù)和代碼范圍的好處和重要性。

?

考點:在嵌入式系統(tǒng)中,要時刻懂得移植的重要性,程序可能是很多程序員共同協(xié)作同時完成,在定義變量及函數(shù)的過程,可能會重名,這給系統(tǒng)的集成帶來麻煩,因此保證不沖突的辦法是顯示的表示此變量或者函數(shù)是本地的,static即可。

在Linux的模塊編程中,這一條很明顯,所有的函數(shù)和全局變量都要用static關(guān)鍵字聲明,將其作用域限制在本模塊內(nèi)部,與其他模塊共享的函數(shù)或者變量要EXPORT到內(nèi)核中。

?

static關(guān)鍵字至少有下列n個作用:
(1)設(shè)置變量的存儲域,函數(shù)體內(nèi)static變量的作用范圍為該函數(shù)體,不同于auto變量,該變量的內(nèi)存只被分配一次,因此其值在下次調(diào)用時仍維持上次的值;

(2)限制變量的作用域,在模塊內(nèi)的static全局變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問;

(3)限制函數(shù)的作用域,在模塊內(nèi)的static函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用,這個函數(shù)的使用范圍被限制在聲明它的模塊內(nèi);
(4)在類中的static成員變量意味著它為該類的所有實例所共享,也就是說當(dāng)某個類的實例修改了該靜態(tài)成員變量,其修改值為該類的其它所有實例所見;
(5)在類中的static成員函數(shù)屬于整個類所擁有,這個函數(shù)不接收this指針,因而只能訪問類的static成員變量。

?

7、關(guān)鍵字const有什么含意?
我只要一聽到被面試者說:"const意味著常數(shù)"(不是常數(shù),可以是變量,只是你不能修改它),我就知道我正在和一個業(yè)余者打交道。去年Dan Saks已經(jīng)在他的文章里完全概括了const的所有用法,因此ESP(譯者:Embedded Systems ?Programming)的每一位讀者應(yīng)該非常熟悉const能做什么和不能做什么.如果你從沒有讀到那篇文章,只要能說出const意味著"只讀"就可以了。盡管這個答案不是完全的答案,但我接受它作為一個正確的答案。(如果你想知道更詳細(xì)的答案,仔細(xì)讀一下Saks的文章吧。)

如果應(yīng)試者能正確回答這個問題,我將問他一個附加的問題:下面的聲明都是什么意思?

Const只是一個修飾符,不管怎么樣a仍然是一個int型的變量

const int a;

int const a;

const int *a;

int * const a;

int const * a const;

本質(zhì):const在誰后面誰就不可修改,const在最前面則將其后移一位即可,二者等效

?

前兩個的作用是一樣,a是一個常整型數(shù)。第三個意味著a是一個指向常整型數(shù)的指針(也就是,指向的整型數(shù)是不可修改的,但指針可以,此最常見于函數(shù)的參數(shù),當(dāng)你只引用傳進來指針?biāo)赶虻闹禃r應(yīng)該加上const修飾符,程序中修改編譯就不通過,可以減少程序的bug)。

?

第四個意思a是一個指向整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。最后一個意味著a是一個指向常整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是不可修改的,同時指針也是不可修改的)。

?

如果應(yīng)試者能正確回答這些問題,那么他就給我留下了一個好印象。順帶提一句,也許你可能會問,即使不用關(guān)鍵字 ,也還是能很容易寫出功能正確的程序,那么我為什么還要如此看重關(guān)鍵字const呢?我也如下的幾下理由:

1) 關(guān)鍵字const的作用是為給讀你代碼的人傳達非常有用的信息,實際上,聲明一個參數(shù)為常量是為了告訴了用戶這個參數(shù)的應(yīng)用目的。如果你曾花很多時間清理其它人留下的垃圾,你就會很快學(xué)會感謝這點多余的信息。(當(dāng)然,懂得用const的程序員很少會留下的垃圾讓別人來清理的。)

2) 通過給優(yōu)化器一些附加的信息,使用關(guān)鍵字const也許能產(chǎn)生更緊湊的代碼。

3) 合理地使用關(guān)鍵字const可以使編譯器很自然地保護那些不希望被改變的參數(shù),防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現(xiàn)。

?

const關(guān)鍵字至少有下列n個作用:

(1)欲阻止一個變量被改變,可以使用const關(guān)鍵字。在定義該const變量時,通常需要對它進行初始化,因為以后就沒有機會再去改變它了;
(2)對指針來說,可以指定指針本身為const,也可以指定指針?biāo)傅臄?shù)據(jù)為const,或二者同時指定為const;
(3)在一個函數(shù)聲明中,const可以修飾形參,表明它是一個輸入?yún)?shù),在函數(shù)內(nèi)部不能改變其值;
(4)對于類的成員函數(shù),若指定其為const類型,則表明其是一個常函數(shù),不能修改類的成員變量;
(5)對于類的成員函數(shù),有時候必須指定其返回值為const類型,以使得其返回值不為“左值”。例如:
const classA operator*(const classA& a1,const classA& a2);
  operator*的返回結(jié)果必須是一個const對象。如果不是,這樣的變態(tài)代碼也不會編譯出錯:
classA a, b, c;
(a * b) = c; // 對a*b的結(jié)果賦值?
  操作(a * b) = c顯然不符合編程者的初衷,也沒有任何意義。

?

8、Volatile的使用
關(guān)鍵字volatile有什么含意?并給出三個不同的例子。

一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設(shè)這個變量的值了。精確地說就是,優(yōu)化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份(由于訪問寄存器的速度要快過RAM,所以編譯器一般都會作減少存取外部RAM的優(yōu)化)。下面是volatile變量的幾個例子:

1) 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器,通常在頭文件中將硬件寄存器地址define為某個意義明確的表達式)

2) 一個中斷服務(wù)子程序中會訪問到的非自動變量(Non-automatic variables,即static變量) ;在中斷服務(wù)程序中修改的供其他程序檢測用的變量需要加volatile聲明;否則編譯器可能對變量更新一次后每次都使用緩存值不再立即更新;

3) 多線程應(yīng)用中被幾個任務(wù)共享的變量(可能被多個線程隨時修改)

?

回答不出這個問題的人是不會被雇傭的。我認(rèn)為這是區(qū)分C程序員和嵌入式系統(tǒng)程序員的最基本的問題。搞嵌入式的家伙們經(jīng)常同硬件、中斷、RTOS等等打交道,所有這些都要求用到volatile變量。不懂得volatile的內(nèi)容將會帶來災(zāi)難。假設(shè)被面試者正確地回答了這是問題(嗯,懷疑是否會是這樣),我將稍微深究一下,看一下這家伙是不是直正懂得volatile完全的重要性。

1)一個參數(shù)既可以是const還可以是volatile嗎?解釋為什么。

2); 一個指針可以是volatile 嗎?解釋為什么。

3); 下面的函數(shù)有什么錯誤:

int square(volatile int *ptr)

{

return *ptr * *ptr;

}

下面是答案:

1)是的。一個例子是只讀的狀態(tài)寄存器。它是volatile因為它可能被意想不到地改變。它是const因為程序不應(yīng)該試圖去修改它。

2); 是的。盡管這并不很常見。一個例子是當(dāng)一個中斷服務(wù)子程序修改一個指向一個buffer的指針時。

3) 這段代碼有點變態(tài)。這段代碼的目的是用來返回指針*ptr指向值的平方,但是,由于*ptr指向一個volatile型參數(shù),編譯器將產(chǎn)生類似下面的代碼:

int square(volatile int *ptr)?

{

int a,b;

a = *ptr;

b = *ptr;

return a * b;

}

由于*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結(jié)果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:

long square(volatile int *ptr)?

{

int a;

a = *ptr;

return a * a;

}

?

關(guān)于volatile關(guān)鍵字在中斷函數(shù)中的影響實例

?

串口發(fā)送數(shù)據(jù),中斷中對其檢測,當(dāng)中斷產(chǎn)生后,置接收標(biāo)志,主循環(huán)中檢測此主標(biāo)志,未用valotile修飾時,編譯結(jié)果如下:

?

? ?[0xe59f41bc] ? ldr ? ? ?r4,0x30203378 ; = #0x302096f0

0x302031b8 [0xe5d40000] ? ldrb ? ? r0,[r4,#0]

while(!uart1_rxFlag); ?//uart1_rxFlag為全局變量,在串口接收中斷中置1

0x302031bc [0xe3500000] ? cmp ? ? ?r0,#0

0x302031c0 [0x0afffffd] ? beq ? ? ?0x302031bc; (Can_Int_Test + 0x17c)

即編譯器對其進行了優(yōu)化,讀取一次uart1_rxFlag的值之后,將其存放在寄存器r0中,比較后,條件不滿足,繼續(xù)等待,但未重新取存儲器中uart1_rxFlag的值,此時即使中斷服務(wù)函數(shù)中修改了uart1_rxFlag的值,比較處仍然不能發(fā)現(xiàn),就出現(xiàn)了無論如何程序就停在此處的問題。

?

// 加了volatile關(guān)鍵字后,編譯的結(jié)果

?302031b4 ?ldr ? ? ?r4,0x30203378 ; = #0x302096f0

? ? while(uart1_rxFlag == 0);

302031b8 [0xe5d40000] ? ldrb ? ? r0,[r4,#0]

302031bc [0xe3500000] ? cmp ? ? ?r0,#0

302031c0 [0x0afffffc] ? beq ? ? ?0x302031b8 ?; (Can_Int_Test + 0x288)

添加了關(guān)鍵字后,比較不等,跳轉(zhuǎn)到重新取存儲器中的uart1_rxFlag,因此任何時候uart1_rxFlag的值都是最新的。

一定程度的優(yōu)化,去掉了讀取uart1_rxFlag地址的語句。

?

? ? ?定義一個易失性變量,編譯器有一種技術(shù)叫數(shù)據(jù)流分析,分析程序中的變量在哪里被賦值、在哪里使用、在哪里失效,分析結(jié)果可以用于常量合并,常量傳播等優(yōu)化。當(dāng)編譯器檢查到代碼沒有修改字段的值,就有可能在你訪問字段時提供上次訪問的緩存值,這能夠提高程序的效率,但有時這些優(yōu)化會帶來問題,不是我們程序所需要的,特點是對硬件寄存器操作的程序,這時可以用volatile關(guān)鍵字禁止做這些優(yōu)化。

?

多任務(wù)環(huán)境下各任務(wù)間共享的標(biāo)志應(yīng)該加voatile關(guān)鍵字:在多線程訪問某字段時,代碼希望這些訪問能夠操作(讀取)到字段的最新值,同時寫到變量的操作能立即更新;對字段加上volatile關(guān)鍵字,那么對該字段的任何請求(讀/寫)都會立刻得到執(zhí)行。
9、位操作(Bit manipulation)?
嵌入式系統(tǒng)總是要用戶對變量或寄存器進行位操作。給定一個整型變量a,寫兩段代碼,第一個設(shè)置a的bit 3,第二個清除a 的bit 3。在以上兩個操作中,要保持其它位不變。 對這個問題有三種基本的反應(yīng)

1)不知道如何下手。該被面者從沒做過任何嵌入式系統(tǒng)的工作。

2) 用bit fields。Bit fields是被扔到C語言死角的東西,它保證你的代碼在不同編譯器之間是不可移植的,同時也保證了的你的代碼是不可重用的。

3) 用 #defines 和 bit masks 操作。這是一個有極高可移植性的方法,是應(yīng)該被用到的方法。最佳的解決方案如下:

#define BIT3 (0x1 << 3) (采用宏將數(shù)字定義為有意義的BIT3,明確,不易出錯,改起來方便)

static int a;

void set_bit3(void)?

{

a |= BIT3;

}

void clear_bit3(void)?

{

a &= ~BIT3;

}

?

一些人喜歡為設(shè)置和清除值而定義一個掩碼(待操作位全1,其余位全0的數(shù),對于某個意義靠多位同時表示的最好帶上掩碼,隔離其他位的影響)同時定義一些說明常數(shù),這也是可以接受的。我希望看到幾個要點:說明常數(shù)、|=和&=~操作,先取反再&是對某位清0的最好操作。

?

考點:

在嵌入式系統(tǒng)中,時刻要關(guān)注移植性,具體的程序中不要出現(xiàn)具體的數(shù)字,這些數(shù)字都應(yīng)該define成某個有意義的符號,可讀性可移植性都很強,比如

#define BIT(x) (0x1 << (x))

X作為參數(shù)可以很方便的對任意位進行操作,意義明確,更改替換方便

?

10、訪問固定的內(nèi)存位置(Accessing fixed memory locations)?
嵌入式系統(tǒng)經(jīng)常具有要求程序員去訪問某特定的內(nèi)存位置的特點。

在某工程中,要求設(shè)置一絕對地址為0x67a9的整型變量的值為0xaa66。編譯器是一個純粹的ANSI編譯器。寫代碼去完成這一任務(wù)。這一問題測試你是否知道為了訪問一絕對地址把一個整型數(shù)強制轉(zhuǎn)換(typecast)為一指針是合法的。這一問題的實現(xiàn)方式隨著個人風(fēng)格不同而不同。典型的類似代碼如下:

int *ptr;

ptr = (int *)0x67a9;

*ptr = 0xaa55;

A more obscure approach is: ( 一個較晦澀的方法是):

*(int * const)(0x67a9) = 0xaa55;

即使你的品味更接近第二種方案,但我建議你在面試時使用第一種方案。

?

在嵌入式系統(tǒng)中,對于大量此類型數(shù)據(jù)如硬件寄存器應(yīng)該采用如下方式

typedef volatile unsigned int HARD_REG;

#define REG_NAME ?(*(HARD_REG *)ADDR)

即將ADDR強制轉(zhuǎn)換為一個指向HARD_REG類型數(shù)據(jù)的指針,*HARD_REG為volatile的無符號整型數(shù)

?

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

__interrupt double compute_area (double radius)?

{

double area = PI * radius * radius;

printf("/nArea = %f", area);

return area;

}

這個函數(shù)有太多的錯誤了,以至讓人不知從何說起了(前提是非操作系統(tǒng)下的中斷服務(wù)函數(shù)):

1)ISR 不能返回一個值(都應(yīng)該為void類型)。如果你不懂這個,那么你不會被雇用的。

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

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

///

另外中斷服務(wù)程序是運行在內(nèi)核態(tài)的(linux),內(nèi)核通常是不支持浮點運算的。

http://access911.net/n/doc1.asp?mode=a&aid=4750647

內(nèi)核中的printk和標(biāo)準(zhǔn)庫的printf不一樣,前者因為由內(nèi)核直接實現(xiàn),不能支持浮點。

在<linux內(nèi)核設(shè)計與實現(xiàn)>的第一章中內(nèi)核開發(fā)的特點一小節(jié)里就有比較了內(nèi)核開發(fā)與應(yīng)用開發(fā)的差異。其中一點就是內(nèi)核編程時浮點數(shù)的問題,書中有一句話是:內(nèi)核編程時浮點數(shù)很難使用

因為沒有浮點單元,內(nèi)核要支持浮點必須把內(nèi)核以soft-float 方式重新編譯,其連接所有的庫也都要用soft-float 方式編譯.

否則另外一種方式使用整數(shù)定義浮點類型加浮點預(yù)算庫完成你的工作,

?

http://topic.csdn.net/u/20070417/16/a4b56569-228c-4b70-b5ab-30ee61c99a3d.html

如果你的內(nèi)核里編譯進了浮點支持,那么是可以的。要不內(nèi)核或是模塊不能用float或是double內(nèi)型的變量或函數(shù)

?

在配置內(nèi)核的時候把浮點模擬器選上,應(yīng)該是可以支持的,但是速度非常慢。?
我曾經(jīng)遇到過,硬件明明支持浮點運算的FPU,但是編譯內(nèi)核的時候選上了浮點模擬器,結(jié)果所有的應(yīng)用程序的浮點運算速度都非常慢。所以我懷疑要支持浮點只要編譯內(nèi)核的時候選上,對于應(yīng)用程序不需要怎么關(guān)心。

///

?

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

?

12、符號擴展的代碼例子(Code examples)
下面的代碼輸出是什么,為什么?

void foo(void)

{

unsigned int a = 6;

int b = -20;

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

}

Vc6.0測試情況

void main(void)

{

? ? ? ?unsigned int a = 6;

? ? ? ?int b = -20;

? ? ? ?printf("unsigned int a + int b = %x/n", (a + b));

?

}

?

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

?

13、處理器字長導(dǎo)致的數(shù)據(jù)擴展問題
評價下面的代碼片斷:

unsigned int zero = 0;

unsigned int compzero = 0xFFFF; ?

0的補碼為全1的數(shù)

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

unsigned int compzero = ~0;

這一問題真正能揭露出應(yīng)試者是否懂得處理器字長的重要性(嵌入式平臺可能是8、16、32的,移植的角度來說寫出固定的0xFFFF是不對的)。在我的經(jīng)驗里,好的嵌入式程序員非常準(zhǔn)確地明白硬件的細(xì)節(jié)和它的局限,然而PC機程序往往把硬件作為一個無法避免的煩惱。

?

到了這個階段,應(yīng)試者或者完全垂頭喪氣了或者信心滿滿志在必得。如果顯然應(yīng)試者不是很好,那么這個測試就在這里結(jié)束了。但如果顯然應(yīng)試者做得不錯,那么我就扔出下面的追加問題,這些問題是比較難的,我想僅僅非常優(yōu)秀的應(yīng)試者能做得不錯。提出這些問題,我希望更多看到應(yīng)試者應(yīng)付問題的方法(很重要哦,面試者關(guān)注的是你思考問題解決問題的過程,當(dāng)你不知道答案時千萬千萬不要猜一個答案給他,因為現(xiàn)在不是選擇題,面試官要的是過程,你只需要將你考慮問題的過程說明白就OK了),而不是答案。不管如何,你就當(dāng)是這個娛樂吧...

?

14、動態(tài)內(nèi)存分配(Dynamic memory allocation)?
盡管不像非嵌入式計算機那么常見,嵌入式系統(tǒng)還是有從堆(heap)中動態(tài)分配內(nèi)存的過程的。那么嵌入式系統(tǒng)中,動態(tài)分配內(nèi)存可能發(fā)生的問題是什么?這里,我期望應(yīng)試者能提到內(nèi)存碎片,碎片收集的問題,變量的持行時間等等。這個主題已經(jīng)在ESP雜志中被廣泛地討論過了(主要是 P.J. Plauger, 他的解釋遠遠超過我這里能提到的任何解釋),所有回過頭看一下這些雜志吧!讓應(yīng)試者進入一種虛假的安全感覺后,我拿出這么一個小節(jié)目:下面的代碼片段的輸出是什么,為什么?

char *ptr;

if ((ptr = (char *)malloc(0)) == NULL)?

puts("Got a null pointer");

else

puts("Got a valid pointer");

這是一個有趣的問題。最近在我的一個同事不經(jīng)意把0值傳給了函數(shù)malloc,得到了一個合法的指針之后,我才想到這個問題。這就是上面的代碼,該代碼的輸出是"Got a valid pointer"。我用這個來開始討論這樣的一問題,看看被面試者是否想到庫例程這樣做是正確(因為如果申請失敗,則程序處理認(rèn)為內(nèi)存不足了,一般會終止程序,是很嚴(yán)重的問題?)。得到正確的答案固然重要,但解決問題的方法和你做決定的基本原理更重要些。

返回一個控指針還是指向 0 字節(jié)的指針甚至指向一個可以操作的指針?

(取決于系統(tǒng)平臺的實現(xiàn),C99及其他標(biāo)準(zhǔn)規(guī)定可以不同的)

malloc(0) in glibc returns a valid pointer to something(!?!?) while in uClibc calling malloc(0) returns a NULL. The behavior of malloc(0) is listed as implementation-defined by SuSv3, so both libraries are equally correct. This difference also applies to realloc(NULL, 0). I personally feel glibc's behavior is not particularly safe. To enable glibc behavior, one has to explicitly enable the MALLOC_GLIBC_COMPAT option.

?

15、用Typedef構(gòu)造復(fù)合類型?
在C語言中頻繁用以聲明一個已經(jīng)存在的數(shù)據(jù)類型的同義字。也可以用預(yù)處理器做類似的事。例如,思考一下下面的例子:

#define dPS struct s *

typedef struct s * tPS;

以上兩種情況的意圖都是要定義dPS 和 tPS 作為一個指向結(jié)構(gòu)s指針。哪種方法更好呢?(如果有的話)為什么?

這是一個非常微妙的問題,任何人答對這個問題(正當(dāng)?shù)脑蚺?#xff0c;而不是猜,如果你沒有原因,說不會比猜一個答案要好的多,記住啊,說話是要講根據(jù)的)是應(yīng)當(dāng)被恭喜的。答案是:typedef更好。思考下面的例子:

dPS p1,p2;

tPS p3,p4;

第一個擴展為

struct s * p1, p2;

上面的代碼定義p1為一個指向結(jié)構(gòu)的指,p2為一個實際的結(jié)構(gòu),這也許不是你想要的。第二個例子正確地定義了p3 和p4 兩個指針。

?

16、晦澀的語法及代碼風(fēng)格
C語言同意一些令人震驚的結(jié)構(gòu),下面的結(jié)構(gòu)是合法的嗎,如果是它做些什么?

int a = 5, b = 7, c;

c = a+++b;

這個問題將做為這個測驗的一個愉快的結(jié)尾。不管你相不相信,上面的例子是完全合乎語法的。問題是編譯器如何處理它?水平不高的編譯作者實際上會爭論這個問題,編譯器應(yīng)盡可能多的從左至右將若干個字符組成一個運算符。因此,上面的代碼被處理成:c = a++ + b;

逗號表達式依次對每個表達式計算,最后的結(jié)果為最后一個表達式的值

因此, 這段代碼執(zhí)行后a = 6, b = 7, c = 12。

如果你知道答案,或猜出正確答案,做得好。如果你不知道答案,我也不把這個當(dāng)作問題。我發(fā)現(xiàn)這個問題的最大好處是這是一個關(guān)于代碼編寫風(fēng)格(要明確的加上括號,避免歧義或者編譯器不同帶來的差異),代碼的可讀性,代碼的可修改性的好的話題。

?

注:引出代碼風(fēng)格的問題正是作者問此問題的目的,這告訴我們要揣摩面試管每個問題背后隱藏的考查點,能夠趁機發(fā)揮下就大功告成了!

總結(jié)

以上是生活随笔為你收集整理的嵌入式程序员面试时应该知道的16个问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

91视频中文字幕 | 欧洲视频一区 | 久久久久久国产精品999 | 在线观看免费一级片 | 国产一区二区在线影院 | 五月婷婷视频 | 最新中文字幕在线资源 | 91久色蝌蚪 | 成人网在线免费视频 | 五月婷网站 | 免费日韩一区二区三区 | 久久99精品波多结衣一区 | 成人动漫精品一区二区 | 日本久久综合网 | 久久精品一区二区 | 91人人人 | 日韩av在线免费看 | 欧美精品在线观看一区 | 久久国产精品99久久久久久老狼 | 一二区精品| 精品久久一区二区 | 亚洲伊人网在线观看 | 亚洲日本国产精品 | 特级黄色视频毛片 | 国内成人av | 成人国产精品免费观看 | 蜜臀aⅴ国产精品久久久国产 | 欧美亚洲成人xxx | 日韩va欧美va亚洲va久久 | 少妇超碰在线 | 国产a级精品 | 美女福利视频一区二区 | 国产视频精选在线 | 精品 激情 | 少妇av网| 97国产精品免费 | 天天爽夜夜爽人人爽一区二区 | 精品在线播放视频 | av网站免费线看精品 | 国产偷国产偷亚洲清高 | 日韩电影一区二区三区 | 国产大片免费久久 | 99在线高清视频在线播放 | 久久精品国亚洲 | 久久精品视频在线看 | 五月婷婷欧美视频 | 亚洲成a人片在线www | 狠狠色丁香婷婷综合最新地址 | 国产精品一区二区在线看 | www.黄色片网站 | 欧洲精品在线视频 | 91精品一区二区三区蜜桃 | 色多视频在线观看 | 国产精品com| 特级大胆西西4444www | 狠狠色伊人亚洲综合成人 | www.99久久.com| 久久久五月天 | 亚洲区另类春色综合小说 | 久久久国产一区二区 | 91看国产 | 国产中文字幕视频在线 | 中文字幕资源网 国产 | 五月天色站 | 久久精品中文字幕一区二区三区 | 97av视频| 激情片av| 成人一区二区在线 | 中文字幕第一 | 狠狠躁日日躁狂躁夜夜躁 | 日韩精品免费在线观看 | 超碰97网站 | 九九热在线精品视频 | 日韩va欧美va亚洲va久久 | 国产午夜在线 | 国产精品不卡在线播放 | 中文字幕av全部资源www中文字幕在线观看 | 亚洲精品高清视频在线观看 | 911香蕉视频 | 亚洲精品动漫久久久久 | 99精品免费观看 | 国产一区二区在线精品 | 综合色婷婷 | 国产精品99久久久久久久久 | 久久精品五月 | 色wwwww| 日韩视频一区二区三区在线播放免费观看 | 日韩网站在线看片你懂的 | 日本99精品 | 人人草在线观看 | 免费亚洲黄色 | 91九色国产在线 | 麻豆91小视频 | 91色影院 | av久久在线 | 91视频在线观看免费 | 久久人人爽爽人人爽人人片av | 中文字幕 影院 | 国产中文字幕三区 | 激情五月婷婷丁香 | 97电影网手机版 | www操操| 免费高清无人区完整版 | 婷五月激情 | 免费在线观看日韩 | 久久婷婷一区二区三区 | 97超视频在线观看 | av高清网站在线观看 | 在线免费三级 | 久久精品99国产精品日本 | 不卡av电影在线观看 | 日韩av中文 | 国产免费又爽又刺激在线观看 | 欧美成人在线网站 | 国产精品美女久久久久久久 | 你操综合| 久久99精品国产麻豆婷婷 | 欧美日本三级 | 欧美日一级片 | 欧美性生活大片 | 欧美狠狠色 | 国产传媒中文字幕 | 狠狠干夜夜操天天爽 | 黄色大片入口 | 日韩精品视频在线免费观看 | 久久一区精品 | 精品久久久免费视频 | 欧美va日韩va | 97人人澡人人爽人人模亚洲 | 久久久久久综合网天天 | 亚洲精品国精品久久99热 | 日韩视频中文字幕在线观看 | 中文字幕在线观看的网站 | 亚洲黄色区 | 国产视频精品免费 | 欧美a性| 国产三级香港三韩国三级 | 国产精品日韩高清 | 国产精品久久久久久久久久久不卡 | 久久久久久国产精品免费 | 最新国产精品亚洲 | 天天摸天天操天天爽 | 中文字幕视频 | 91精品视频在线免费观看 | 天天狠狠操| 精品国产1区二区 | 久久伦理| 亚洲精品日韩在线观看 | 婷婷九月激情 | 久草在线最新 | 日韩av播放在线 | 在线观看日本韩国电影 | 91视频在线观看免费 | 黄色片免费看 | 免费在线国产 | 中文在线天堂资源 | 97电影在线 | 98涩涩国产露脸精品国产网 | 色窝资源 | 国产精品原创av片国产免费 | 天天色天天操天天爽 | 91亚洲精品久久久中文字幕 | 成人aⅴ视频 | 视频成人免费 | 91麻豆操 | 国产激情小视频在线观看 | 麻豆国产网站 | 亚洲精品综合一二三区在线观看 | 亚洲黄色小说网址 | 女人18毛片a级毛片一区二区 | 网站免费黄色 | 丝袜制服综合网 | 999久久久免费精品国产 | 国产在线观看91 | 亚洲国产中文字幕在线视频综合 | 亚洲综合视频在线 | 少妇高潮流白浆在线观看 | 在线免费av观看 | 激情视频一区二区三区 | 毛片在线播放网址 | 国产黄a三级三级三级三级三级 | 久久夜色精品国产欧美乱极品 | 黄色a在线| 又黄又爽又色无遮挡免费 | 色综合久久精品 | 久久久久久麻豆 | 91av网址 | 婷婷丁香视频 | 日韩视频免费观看高清 | 日韩一级成人av | 欧美日韩精品免费观看 | 91视频免费观看 | 91久久偷偷做嫩草影院 | 99久热 | 欧美成人在线免费观看 | 国产中文字幕三区 | 99精品免费 | 爱爱av网| 亚洲一区二区三区在线看 | 亚洲女在线 | 免费在线观看黄网站 | 国产福利一区二区三区在线观看 | 五月天婷亚洲天综合网鲁鲁鲁 | 久草视频在线看 | 色综合天天色 | 99精品电影 | 久久五月激情 | 500部大龄熟乱视频使用方法 | 欧美成人一二区 | 国产精品丝袜久久久久久久不卡 | 日韩精品中文字幕有码 | 9i看片成人免费看片 | 亚洲欧美日韩国产一区二区三区 | 激情久久小说 | 超碰av在线| 久久成人国产 | 久久久免费观看完整版 | 中文字幕在线播出 | av免费观看在线 | 久久久精品久久日韩一区综合 | 91看成人 | 九色视频网址 | 国产91丝袜在线播放动漫 | 最近免费中文字幕 | 日韩高清免费电影 | 丁香免费视频 | 色综合天天狠狠 | 国产一级黄大片 | 中文伊人| 日韩区欠美精品av视频 | 午夜视频一区二区 | 狠狠干狠狠久久 | 天天舔天天射天天操 | 精品国偷自产在线 | 国产精品久久久久一区二区三区共 | 久久三级毛片 | a天堂最新版中文在线地址 久久99久久精品国产 | 麻豆国产精品视频 | 欧美极品xxxxx | 99色| 亚洲日本一区二区在线 | 国产专区在线看 | 天堂网在线视频 | 日韩www在线 | 国产va精品免费观看 | 久久av中文字幕片 | 97成人精品视频在线播放 | 久久草草热国产精品直播 | 九九三级毛片 | 日韩视频免费看 | 五月天激情综合 | 久久精品人人做人人综合老师 | 日韩精品久久久久久久电影99爱 | 久久永久视频 | 日韩电影在线观看一区二区三区 | 精品美女久久久久久免费 | 亚洲欧洲在线视频 | 久久久这里有精品 | 亚洲一区二区精品视频 | 国产精品私人影院 | 99久视频 | 美女一区网站 | 亚洲国产成人久久 | 精品一区在线看 | 日韩av在线一区二区 | 97看片网| 午夜视频欧美 | 国产乱码精品一区二区三区介绍 | 天天躁日日 | 日韩免费视频观看 | 国产品久精国精产拍 | 九九免费在线观看视频 | 欧美日韩aaaa | 一区二区三区四区免费视频 | 久久精品电影网 | 久久av免费| 久久国内免费视频 | 久久久国产精品一区二区中文 | 日韩理论在线播放 | 国产专区精品 | av在线播放一区二区三区 | 午夜私人影院久久久久 | 97视频在线播放 | 成人黄色小说视频 | 狠狠操综合网 | 97色狠狠 | 国产在线观看91 | 亚洲激情五月 | 亚洲精品国偷拍自产在线观看蜜桃 | 2018亚洲男人天堂 | 97人人射| 久草在线最新视频 | 久久成人精品电影 | 久久精品视频日本 | 国产精品午夜av | 日韩电影在线观看中文字幕 | 国产亚洲精品久久久久久大师 | 东方av在 | 91精彩视频在线观看 | 国产91九色蝌蚪 | 中文字幕在线播出 | 亚洲精色 | 精品黄色片 | 日韩色视频在线观看 | 成年人毛片在线观看 | 国产黄色精品网站 | 在线观看91av | 亚洲专区 国产精品 | 欧美激情va永久在线播放 | 欧美片网站yy | 中日韩在线视频 | 久久艹影院| 中文字幕视频网 | 国产精品国内免费一区二区三区 | 精品久久久久久久久久久久久久久久 | 综合网天天色 | 可以免费看av | 日韩一级片观看 | 看av免费| 国产91勾搭技师精品 | 国产成人在线观看免费 | 97av免费视频 | 麻豆视频在线免费观看 | 麻豆免费视频观看 | 日韩毛片久久久 | 91热视频在线观看 | 国产一线二线三线性视频 | 黄色在线免费观看网址 | 国产一区网址 | 91色吧| 成人激情开心网 | 精品国产一区二区三区噜噜噜 | 亚洲年轻女教师毛茸茸 | 丁香色天天| 国产一级视频在线免费观看 | 久久国产精品99久久久久久进口 | 日本成人免费在线观看 | 久久激情日本aⅴ | 亚洲最大av在线播放 | 444av| 99视频精品 | 碰超在线97人人 | 色鬼综合网 | avsex| 国产精品久久久久久久久久 | 九九99| 亚洲视频在线观看网站 | 天堂va欧美va亚洲va老司机 | 精品女同一区二区三区在线观看 | 国产精品高潮呻吟久久av无 | 五月婷婷开心中文字幕 | 国产黄色av | 国产日韩欧美在线播放 | 99视频精品| 亚洲婷婷综合色高清在线 | 天天干天天干天天 | 欧美一级免费片 | 亚洲成人家庭影院 | 亚洲美女免费视频 | 久久免费黄色网址 | 国产伦精品一区二区三区在线 | 超碰在线日韩 | 国产自产在线视频 | 色就色,综合激情 | 国产精品久久久久影视 | 久久免费电影网 | 日韩免费在线网站 | 91精品爽啪蜜夜国产在线播放 | 国产麻豆视频网站 | 精品国产成人av在线免 | 久久综合五月 | 国产一级视频在线观看 | 操高跟美女 | 在线免费观看涩涩 | 精品久久久久久久久久岛国gif | 日韩精品一区二区在线观看 | 超碰97人人爱 | 日韩专区在线播放 | 国产乱码精品一区二区蜜臀 | 国产爽妇网 | 狠狠干天天色 | 99久久99热这里只有精品 | 成人激情开心网 | 免费在线观看黄 | 亚洲成aⅴ人片久久青草影院 | 久久亚洲婷婷 | 欧美午夜剧场 | 香蕉精品视频在线观看 | 日韩欧美国产免费播放 | 高清国产一区 | 97超碰人人看| 国产高清在线永久 | 免费福利在线播放 | 99久久精品免费看国产一区二区三区 | 国产成人1区 | 最新99热 | 久久久久婷 | 久久国产影院 | 国产精品久久久久久久免费大片 | 一区二区三区免费在线 | 国产中文字幕av | 久九视频 | 98涩涩国产露脸精品国产网 | 色资源二区在线视频 | 久久久香蕉视频 | 日韩欧美在线观看一区二区三区 | 网站在线观看日韩 | 欧美午夜久久 | 五月开心六月伊人色婷婷 | 18女毛片 | 人人爽人人爽人人片av免 | 波多野结衣最新 | 免费在线色 | av大片免费在线观看 | 欧美一级日韩三级 | 嫩小bbbb摸bbb摸bbb | 一区二区三区四区五区在线 | 亚洲综合色激情五月 | 在线精品在线 | 国产精品嫩草69影院 | 五月天六月婷婷 | 91在线视频观看免费 | 在线看黄色的网站 | 国产在线观看你懂得 | 丁香婷婷综合激情五月色 | 免费观看完整版无人区 | a视频在线看 | 丝袜精品视频 | 国产黄色美女 | 日韩羞羞 | 中文字幕影片免费在线观看 | 字幕网资源站中文字幕 | 成人h视频 | 国产精品精品久久久久久 | 99产精品成人啪免费网站 | 韩日电影在线 | 国产精品初高中精品久久 | 久草在线精品观看 | 综合在线观看色 | 超级av在线 | 97色涩 | 婷婷四房综合激情五月 | 中文字幕视频播放 | 91大神电影 | 一区二区激情视频 | 亚洲成a人片77777潘金莲 | 三级黄色网络 | 91亚洲欧美激情 | 亚洲综合欧美日韩狠狠色 | 成人动漫一区二区 | www99精品| 伊人伊成久久人综合网站 | 久久精品国产免费观看 | 欧美日韩在线视频一区二区 | 亚洲精品永久免费视频 | 久久99在线视频 | 国产成人av一区二区三区在线观看 | av最新资源 | 在线免费观看一区二区三区 | 三三级黄色片之日韩 | 国产成人久久av免费高清密臂 | 四虎小视频 | 在线精品一区二区 | 国产黄色特级片 | 91在线国产观看 | 欧美精品久久久久 | 久久久久久久免费看 | 国产日韩欧美精品在线观看 | 91香蕉视频黄色 | 久久a国产| 探花视频免费在线观看 | 九色91在线| 最新中文在线视频 | 懂色av一区二区三区蜜臀 | 免费观看黄 | 久久久久亚洲精品男人的天堂 | 日韩精品视频在线观看网址 | 在线看黄网站 | 天天射,天天干 | 手机看片久久 | 亚洲一区二区高潮无套美女 | 国产精品成人一区二区三区 | 免费观看一级成人毛片 | 国产污视频在线观看 | 久久久免费精品国产一区二区 | 九色在线 | 九九久久久久久久久激情 | 日韩午夜av | 亚洲视频在线观看免费 | 国产精品美女毛片真酒店 | 爱爱av网站 | 国产精品18videosex性欧美 | 欧美另类网站 | 久久久免费精品视频 | 国产美女精品视频 | 99热只有精品在线观看 | 欧美在线aaa| 高清av中文字幕 | 91污在线观看 | 99成人在线视频 | 一区二区精品国产 | 精品无人国产偷自产在线 | 亚洲国产精品推荐 | 中文字幕亚洲高清 | 国产只有精品 | 亚洲人成人在线 | 九九久久影院 | 久久最新 | 91精品国产91p65 | 日本丶国产丶欧美色综合 | 在线观看韩日电影免费 | 国产98色在线 | 日韩 | 国产精品毛片网 | 免费三级网 | 亚洲综合视频在线观看 | 亚洲国产日本 | 国产在线精品二区 | 免费看毛片网站 | 日韩av中文在线 | 97超碰色| 天天舔夜夜操 | 久久久久欧美精品 | 久久国产一区 | 日日夜夜噜噜噜 | 国产手机在线视频 | 国产精品久久久久aaaa | 国产亚洲人成网站在线观看 | 六月婷色| a'aaa级片在线观看 | 激情综合狠狠 | 欧美 日韩 性 | 91精品成人 | av在线短片 | 在线成人免费电影 | 国产精品久久久久久久久岛 | 亚洲 欧美变态 另类 综合 | 99视频免费看 | 婷婷丁香激情 | 91经典在线 | 不卡的av | 伊人久久在线观看 | 天天爽人人爽夜夜爽 | 98精品国产自产在线观看 | 伊人五月天 | 在线看片一区 | 国产一级视频免费看 | 国产精品自产拍在线观看中文 | 日批视频在线播放 | 国产久草在线观看 | 四虎国产免费 | 久久国产精品系列 | 久久综合狠狠综合 | 亚洲成a人片综合在线 | 国内精品小视频 | 久久久精品欧美一区二区免费 | 中文字幕日韩在线播放 | 黄色软件在线观看视频 | 国产日韩一区在线 | 午夜色性片 | 久久精品高清视频 | 丁五月婷婷 | 日本论理电影 | 免费国产一区二区视频 | 日韩激情小视频 | 久久久精品电影 | 中文av在线免费观看 | 欧美性黄网官网 | 久久久.com| 久久免费高清视频 | 国产特级毛片aaaaaa高清 | 综合网在线视频 | 日韩在线免费看 | 精品在线观看国产 | 一区二区三区视频在线 | 91在线视频在线观看 | 六月丁香激情网 | 超碰人人射| 国产精品九九九九九 | 免费观看成年人视频 | 亚洲专区中文字幕 | 精品亚洲男同gayvideo网站 | 亚洲精品久久久久中文字幕m男 | 亚洲国产欧洲综合997久久, | 97视频免费在线观看 | 色婷婷免费视频 | 国产综合精品一区二区三区 | 亚洲精品视频www | 精品久久亚洲 | 天天躁日日躁狠狠躁av麻豆 | 久久精品2 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 在线免费观看国产黄色 | 国产精品麻豆果冻传媒在线播放 | 高清av在线免费观看 | 人人干人人干人人干 | 天天摸日日摸人人看 | 最近中文字幕完整高清 | 午夜精品一区二区三区可下载 | 综合激情网...| 久久天天躁夜夜躁狠狠躁2022 | 免费观看午夜视频 | 91私密视频| 国产二区免费视频 | 国产资源在线免费观看 | 久草网视频在线观看 | 99免费| 午夜18视频在线观看 | 青青久草在线视频 | 天天操夜 | 国产一区二区三区视频在线 | 亚洲欧美日韩国产精品一区午夜 | 99爱精品在线| 99精品国产一区二区三区不卡 | 久九视频| 视频在线播放国产 | 久久综合免费视频 | 欧美一级久久 | 成人a级黄色片 | 国产精品久久久久久久久久久久久 | 天天五月天色 | 中文字幕在线一区观看 | 91成人精品一区在线播放 | 91亚色视频 | 精品96久久久久久中文字幕无 | 91精品国产福利在线观看 | 成人黄在线 | 国产免费久久 | 久艹在线免费观看 | 在线观看视频99 | 91最新视频在线观看 | 国产精品麻豆三级一区视频 | 六月天色婷婷 | 日韩一级黄色av | 少妇超碰在线 | 久久久久久久18 | 精品国产伦一区二区三区 | 91av国产视频 | 日本在线视频一区二区三区 | 天天插伊人 | 精品三级av| 午夜精品久久久久久久久久久久 | 中文字幕a在线 | 天天操天天操天天操天天操天天操天天操 | 精品国产乱码一区二区三区在线 | 免费久久99精品国产 | 色的网站在线观看 | 日韩城人在线 | a v在线视频| 日韩av在线免费看 | 综合影视| 成 人 黄 色 视频 免费观看 | 免费色视频在线 | 成人网中文字幕 | 在线观看中文字幕一区 | 黄色小说视频在线 | 成人午夜免费剧场 | 国产成a人亚洲精v品在线观看 | 色欧美88888久久久久久影院 | 国产精品综合久久久久 | 国产精品 国内视频 | 久久天天操 | 国产色拍| 国产精品精品国产 | 日韩乱色精品一区二区 | 97精品国自产拍在线观看 | 国产视频精品视频 | 国产一线二线三线在线观看 | 亚洲成av人影片在线观看 | 毛片网站在线 | 免费看三片 | 人人精久 | 精品亚洲午夜久久久久91 | 免费在线观看亚洲视频 | 96精品在线 | 亚洲 欧美变态 另类 综合 | 九九在线国产视频 | 9999激情| 国产美女久久 | 午夜精品一区二区三区在线观看 | 亚洲在线网址 | 黄色三级网站在线观看 | 亚洲精品www | 成人免费网站在线观看 | 亚洲精品免费在线播放 | 免费男女网站 | 天天爽天天爽夜夜爽 | 亚洲黄网站 | 色综合久久久久综合体 | 久久草在线视频国产 | 又黄又刺激视频 | 黄色三级av| 国产99色 | 中文字幕一区二区三区在线观看 | 中文字幕 在线 一 二 | 天天干天天摸 | 欧美一级片在线播放 | 亚洲一区二区观看 | 最近中文字幕免费av | 午夜精品区 | 99热精品免费观看 | 国产91大片| 天天操狠狠操 | 成人av片免费看 | 欧美精品一级视频 | av 一区二区三区四区 | 自拍超碰在线 | 五月天视频网站 | 亚洲精品视频中文字幕 | 在线99视频 | www.少妇 | 久久久久久久毛片 | 性色av免费看 | 91av在线播放视频 | 天天碰天天操视频 | 久久精品三 | 色久综合| 亚洲一级片在线观看 | 亚洲国产精品500在线观看 | 国产美女精彩久久 | 日本久久91| 色.com| 999久久久国产精品 高清av免费观看 | 99精品欧美一区二区三区 | 久爱精品在线 | 午夜电影 电影 | 亚州国产精品久久久 | 欧美另类人妖 | 一区久久久 | 91在线网站| 91色蜜桃 | 日本黄色免费观看 | 午夜12点 | 精品久久久久久电影 | 久久www免费视频 | 国产精品美女久久久久久久久 | 久草在线在线视频 | 精品视频中文字幕 | 久久精品毛片基地 | 日韩欧美国产免费播放 | 国产精品免费成人 | 美女视频一区二区 | 四虎成人精品 | 久久视频在线视频 | 国产黄色大片 | av在线小说| 午夜影院一级 | 国产精品久久一区二区三区不卡 | 亚洲精品裸体 | 国产专区视频在线观看 | 国产亚洲精品久久久久久大师 | 国产精品成人一区二区 | 欧美日韩视频 | 欧美美女一级片 | 亚洲国产中文在线 | 日本黄色一级电影 | 超碰最新网址 | 日韩中文字幕在线看 | 精品自拍网| 一级全黄毛片 | 亚洲午夜小视频 | 欧美日韩免费观看一区二区三区 | 欧美性生活免费看 | 超碰午夜 | 国产在线观看免费 | 六月丁香婷婷久久 | 精品91在线| 美女国产免费 | 国产自偷自拍 | 少妇精69xxtheporn | 国产精品大片免费观看 | 国产九色91 | av一级片网站 | 天天弄天天干 | 麻豆91视频| 久久艹中文字幕 | www.狠狠色.com| 激情网婷婷| 久久影视精品 | 国产亚洲一区二区在线观看 | 国产99精品在线观看 | 99视频99 | 亚洲丝袜中文 | 国色综合 | 97超碰成人 | 国产在线观看高清视频 | 久久综合色播五月 | 久av在线 | 天堂va在线高清一区 | 精品视频免费观看 | 91香蕉视频720p | 狠狠成人| av在线电影网站 | 国产精品a久久 | 97超碰在线久草超碰在线观看 | 国产精品一区二区三区99 | 精品久久99 | 久青草视频在线观看 | 亚洲不卡在线 | 激情偷乱人伦小说视频在线观看 | 99在线观看免费视频精品观看 | 久久国产高清视频 | 最新的av网站 | 日韩av看片 | 国产一性一爱一乱一交 | 欧美男男tv网站 | 国产黄色一级大片 | 九九电影在线 | 国产高清福利在线 | 一区二区三区四区五区在线视频 | 国产欧美在线一区二区三区 | 人人狠狠综合久久亚洲 | 久久综合久久综合久久 | 在线精品在线 | 91试看 | 1024在线看片 | 婷婷激情在线 | 国产精品国产自产拍高清av | 91精品成人| 手机av看片 | 三级免费黄 | 亚洲精品成人av在线 | 九九九毛片 | 久草在线免费播放 | 91视频啊啊啊 | 这里只有精品视频在线观看 | 国产中文字幕网 | 超碰97久久 | 国产精品国产三级国产不产一地 | 美国av片在线观看 | 国产69久久| 久草精品视频 | 99 久久久久| 中文字幕在线日本 | 干干干操操操 | 亚洲日韩中文字幕在线播放 | 2019天天干天天色 | www.com.黄| 久久久久久久久久久久亚洲 | 四川妇女搡bbbb搡bbbb搡 | 日韩av成人在线观看 | 精品国产成人在线影院 | 免费看久久 | 福利视频一二区 | 五月婷婷一级片 | 日韩欧美中文 | 四虎在线免费观看 | 日韩专区在线观看 | 亚洲三级av | 亚洲欧美日韩国产精品一区午夜 | 中文字幕免费国产精品 | 在线视频18在线视频4k | 亚洲欧美视频在线播放 | 激情综合网天天干 | 97天天综合网 | 美女视频一区二区 | 欧美久久久久久久久久久久久 | 亚洲在线视频免费 | 日韩二区三区在线 | 五月天婷婷在线观看视频 | 欧美色插| 在线观看日韩国产 | 久久精品九色 | 成人9ⅰ免费影视网站 | 久久久天堂| 在线免费观看涩涩 | 字幕网在线观看 | 久久久久久久99精品免费观看 | 欧美国产日韩激情 | 欧美夫妻性生活电影 | 久久艹精品 | 国产理论免费 | 精品国产乱码 | 福利视频一二区 | 国产精品对白一区二区三区 | 天天干 夜夜操 | 成人中文字幕av | 天天综合网国产 | 亚洲精品免费在线 | 成全在线视频免费观看 | 91精品久久久久久久久 | 久久色在线播放 | 91在线影院| 香蕉成人在线视频 | www.天天操.com | 综合精品在线 | 国产精品第三页 | www免费看 | 麻豆 videos| 色永久免费视频 | 国产精品午夜久久久久久99热 | 激情综合婷婷 | 黄色一级免费电影 | 丰满少妇久久久 | 亚洲一二三在线 | 亚洲精品在线免费看 | 男女啪啪免费网站 | 少妇视频在线播放 | 伊人天天狠天天添日日拍 | 99热这里只有精品久久 | 欧美动漫一区二区三区 | 91精品国产三级a在线观看 | 五月色综合 | 黄色三级av | 欧美精品在线观看一区 | 欧美性久久久 | 在线观看免费成人 | 免费看片网址 | 久久97久久 | av网站手机在线观看 | 91精品久久久久久综合乱菊 | 成人黄色av免费在线观看 | 亚洲黄色在线播放 | 天天操人人要 | 奇米先锋 | 国产精品久久久久久妇 | 色婷婷av国产精品 | 91视频91色| 麻豆视频网址 | 免费观看性生交大片3 | 亚洲国产精品电影在线观看 | 日韩精品中文字幕av | 日韩高清无线码2023 | 欧美九九九 | 中文字幕人成人 | 国产精品免费久久久久 | 97夜夜澡人人爽人人免费 | 91视频啪| 久久久国产影院 | 99亚洲精品| 五月婷婷激情综合 | 99国产免费网址 | 97影视| 久久亚洲电影 | 349k.cc看片app | 天天射天 | 欧美一级视频免费看 | 黄色片网站av | 91完整版 | 国产夫妻自拍av | 欧美在线观看视频免费 | 欧美三级高清 | 欧美成人免费在线 | 久久久精品影视 | 色88久久| 天天色天天艹 | 国产尤物一区二区三区 | 欧美激情综合五月色丁香小说 | 精品999久久久 | 亚洲精品一区二区久 | 久久香蕉电影网 | 97成人啪啪网 | 97日日碰人人模人人澡分享吧 | 久久精品国产成人精品 | 三级av在线免费观看 | 黄色国产成人 | av一本久道久久波多野结衣 | 欧美一区二区三区四区夜夜大片 | 国产精品免费在线观看视频 | 中文资源在线播放 | 在线亚洲欧美日韩 | 又黄又爽又无遮挡的视频 | 91日韩免费 | 亚洲一区不卡视频 | 色网站国产精品 | 激情五月五月婷婷 | 91在线视频免费91 | 欧美a√在线 | 精品在线观看视频 | 亚洲成年人在线播放 | 天天射,天天干 | 免费看的黄色的网站 | 国产精品美女久久久久久久久 | 亚洲一区天堂 | 99麻豆久久久国产精品免费 | 2019中文最近的2019中文在线 | 天天操天天艹 | 国产女人免费看a级丨片 | av天天干 | 日本精品在线看 | 狠狠狠狠狠狠操 | 玖玖玖国产精品 | 国产午夜精品免费一区二区三区视频 | 国产毛片aaa | 亚洲综合色视频在线观看 | 91精品国产高清自在线观看 | 日韩午夜在线观看 | 免费精品人在线二线三线 | 色综合久 | 国产一区二区成人 | 欧美精品做受xxx性少妇 | 日韩av看片 | 91精品国产成人 | 亚洲精品美女 | 日韩精品中文字幕一区二区 | av片免费播放 | 在线亚州 | 天天综合导航 | 色视频网址 |