驅動工程師面試題彙編

1、camera如何調試?
 
Camera的接口如下:
 
1.VSYNC
2.HSYNC
3.PWDN
4.RESET
5.AGND
6.SCL
7.SDA
8.DVDD18
9.DOVDD28
10.MCLK
11.PCLK
12.DGND
13.DATA0-DATA7
14.IOVDD28
15.GND
 
看sensor的spec來調試。
 
1)莫爾條紋(綵帶) 
        從技術角度上講,莫爾條紋是兩條線或兩個物體之間以恆定的角度和頻率發生干涉的視覺結果,當人眼無法分辨這兩條線 或兩個物體時,只能看到干涉的花紋,這種光學現象就是莫爾條紋。莫爾條紋現象是由於信號取樣頻率接近感光器分辨率所致,通常解決方法用一個低通濾鏡把高於 感光器分辨率的信號擋住,其副作用就是降低成像分辨率。因此在設計低通濾鏡時設計師要在分辨率和莫爾條紋之間做一個妥協選擇。因爲D70的CCD前面使用 效果比較弱的低通濾鏡,所以在提高成像分辨率也造成了莫爾條紋出現機率的增大,此現象也廣泛出現於其他DSLR上。 
推薦解決方法:避免拍攝場面有接近相機分辨率的規則性圖案,或者後期通過軟件去除。
      "水波紋"的現象、banding或者是fliker,如下圖所示:

         關於你反映的手機對着日光燈preview時有類似"水波紋"的現象, 
現解釋如下: 

     這個現象叫做banding或者是fliker,主要是由於日光燈的頻率 
和曝光時間而引起的。我們已經避免了在室內正常情況下(不對着日光燈的情況) 
沒有banding的現象。但是對着日光燈時,banding現象是無法完全消除的。 
這種現象屬於正常的。
2)對比度過大導致顏色更豔,有偏紅。
 
3)中間亮,四周暗:shutting不夠。
 
4)暗處噪聲大:調gamma
 
5)鏡頭能夠影響分辨率和清晰度。
 
6)preview 和capture 時存在的壞點是由於sensor自己產生的。一般主要是亮的壞點。
        OV2640在Fxxxx上通過取2.0M(1600*1200)sensor處理後輸出給sunplus556(800*600)來減小壞點。
 
7)高低亮度動態範圍太小。導致高亮時過曝,低亮圖片亮度不夠。(ov9655)

解決方法:(會使圖片變的模糊.模糊的原因是因爲使用的鏡頭的mtf數值太小,模組整體高度太低造成的.要徹底解決這個問題,只有更換更好的鏡頭才行.)

修改gamma:

60 7A2c
60 7B C
60 7C 19
60 7D 28
60 7E 40
60 7F 4b
60 80 56
60 81 60
60 82 67
60 83 70
60 84 7a
60 85 89
60 86 95
60 87 AF
60 88 C8
60 89 DF

 
8)預覽低亮度拍照目標效果不佳,需要改善。(ov9655)

解決方法:增加gain:

60 142e

 

9)預覽低亮度拍照目標會出現閃爍,請調整。(ov9655)

解決方法:(亮度的調整需要時間,所以亮度會閃幾下)

固定fps:

60 3b0c

 
10) preview和capture的不一致:(ov9655)
我們preview使用的是vga的模式,capture使用的是sxga的模式.兩個模式切換過程中要進行亮度計算,這個計算是將sensor的增益轉化成曝光時間.由於這兩種實現亮度的方式有差別,所以preview和capture一定存在差異.我們的調試就是讓這種差異儘量的小.
 
11)preview中有跳動的感覺.(ov9655)
從亮到暗和從暗到亮的變化中,sensor的調整需要時間.在這個時間中,vsync一直有輸出,所以可以看到這個問題.(主要是壞幀的問題)
現在的修改是調整過程中的vsync不輸出,所以看不到這個問題了.
 
12)在暗處切換夜景和自動後,回到正常光線preview不停的閃動。(ov9655)

 

For 9655 night mode:

 

night:

0x3b,0xcc

 

normal:

0x3b,0x0c

0x2d,0x00

0x2e,0x00

在夜間模式的時候是會自動變楨率的,sensor會自動調整0x2d,0x2e的數值來變楨率.切回自動的時候要將這兩個寄存器清零,不然它們還是夜間模式裏面的數值.
 
13)Fxxxx的顏色不夠鮮豔目前最新的版本發灰。

這個應該是圖象的數據分佈有問題,範圍窄(我看下來32以下的數據很少),而cxxxxx的數據分佈比較寬。

另外,我們和LCDC(sunplus)調整顏色是對者標準色板來調試的。其實Cxxxx的顏色反而是有些失真的。

建議:

必須需要isp做black levelcaliberation,讓響應曲線過零點。

  如果沒有,看看有沒有Y_offset,Y_contrast可以動動的。

 

14)亮度不夠。

從分析來看,平均亮度在128+/-10範圍之內了,曝光控制是正常的。可能是因爲圖象發灰導致看上去亮度不夠

建議:解決第一條可能這條也解決了。

 

15)暗光下噪點大。

暗光對sensor的要求高。任何sensor的噪聲都要變大。

對於30萬象素的手機,主要還是看屏上的效果,雖然噪聲大了點,但屏小 ,所以不明顯。

重點應該在提升其他方面,使preview的效果更好。

 

16)夜景下比Cxxxxxx噪點大。微帶發綠。

大部分sensor都會在暗處發綠和亮處發紅,但應該在一個可接受的範圍之內。

原因:紅綠藍三個顏色的響應曲線是非線形的,在做白平衡時候靠簡單的線形處理無法將三根曲線進行重合。手機DSP能力畢竟不能夠和數碼相機的能力相比。

如果把暗光顏色很準,那麼可能正常下顏色就不夠鮮豔或者亮處顏色不準,或者噪聲大等其他更加嚴重的狀況出現。

我覺得現在的狀況還不算離譜。

17)數字影像測試總評

·        白平衡檢測(White Balance

 

 

        白平衡差異(White Balance)影響數字相機的色彩表現甚鉅,雖然大多數的數字相機自動白平衡(AUTOWB)都能應付一般的拍攝狀況。不過, 若將白平衡誤差 更進一步以(K)色溫來區分,則誤差普遍存在於各廠家的設定之中。ColorChecker 特別針對白平衡部分設計了圖塊檢測,標示 (1) 爲原始攝影圖塊、標示(2)則爲理想的  ColorChecker HSV值合併運算曝光之表現以及標示 (3) 原始 ColorChecker 理想值,以 HSV 和 K 兩種系統顯示白平衡的誤差比值。

 

 

·         

鏡頭光衰減(Light FallOff

 

        採用多重鏡片組合設計的鏡頭,鏡片材質、形狀,或多或少都會影響光線路徑和光量大小;不同於色像差,Light Falloff 主要是判別自鏡頭中央 起至整幅畫面邊緣位置於拍攝均勻光線下所產生的光差。理想鏡頭於均勻光線下,自中心到邊緣的光分佈應爲相同,但實際上卻不容易做到,形成許多攝影人員口中的『暗角』現象。

 

       

 

光衰減檢測,可以看出鏡頭中心到邊緣影像光線不均勻分佈的情形

 

         優良的鏡頭設計下,人眼幾乎難以辨認 Falloff 的發生。但在電腦或專業儀器的輔助下,鏡頭的光衰減卻相當明顯。理想的光衰減檢測,可透過 Labsphere 或 Electro-Optical Industries(EOI) 產生球狀均勻光線(模擬自然狀態下三維空間之均勻光線產生),例如:Labsphere 出品的 USS-1200 或 USS-1200V;實際上,一般的檢測也可以透過大面的素色板(或牆壁),藉着散焦方式取得均勻光線進入相機之中,再利用相關的電腦軟件取得對應的數據。

 

 

·         

影像器材數據化量測綜合評量

 

           今日的影像器材效能檢測已經是一門相當科學且專業化的科目,一般攝影玩家較難負擔如此複雜且昂貴的測試器材,而必須仰賴媒體或公正第三者提供相關測試報告。爲了方便大家快速且有效的認知器材性能,多數評量都集中『解像力』和『色彩』表現上。然而,實際上,影響影像品質的因素不單只是鏡頭和 CCD 而已,甚至包括許多外在的人爲因素。

 

附註:人爲因素的影響在測試報告中很難被發現,多數的專業媒體理當避免人爲影響其最終測試結果。

 

          影響數字相機 測試表現的因素,也往往是許多業餘攝影者常犯的錯誤。例如:

1.      相機是否固定於穩定的三角架(反光鏡是否鎖起);相機機身是否會晃動影像畫質

2.      相機與測試標的距離是否恰當

3.      相機是否正確與測試標的完成對焦; 對焦選擇是否正確、對焦點是否位於正確中心

4.      影像格式和壓縮比是否正確選擇(RAW格式是否可以選擇) ; 過高的壓縮比或過低的解析度,同樣影響畫質的表現

5.      環境 Gamma 值的選擇 ; 環境亮度影響畫質清晰表現甚鉅

6.      清潔工作是否確實 ; 無論鏡頭表現、UV濾鏡、保護鏡,甚至於相機內之CCD / CMOS 等,沾染上灰塵等,都將影響後續的測試值

7.      鏡頭的設定 ; 測試標的是否位於有效的景深內(鏡頭之光圈和焦長是否正確設定);  測試 DSLR 最好可以選擇定焦鏡頭

8.      光線的位置 ; 直射光線易造成測試標的的反光,影響判別。

 

 

·         

親身體驗

 

        因此,數據化的測試報告,雖有助於你瞭解相機的性能表現,卻不一定讓你在操作上得心應手。一架具備完善操作設計的消費型數位相機,未必一定輸給 DSLR。『盡信書,不如無書!』,實際走訪體驗你心目中的影像器材,輔之你網路或是平面上閱讀到的測試報告,將更具說服力。

18)我多次拍攝白紙的照片.一般在剛進入preview時,馬上拍攝會出現嚴重
偏紅或者偏藍等.
        
OV:因爲自動曝光和自動白平衡在preview開始前會有一個初始值得設置,在進入preview後,曝光和白平衡自動調節開始,調節過程的長短與初始設置和實際環境間的差異相關。
改變初始值可以使在某一特定環境下的調節時間最短,但對其他條件,還是要視環境差異的大小而定。
 
通過提高preview的楨率可以縮短調節的時間,或者可以使用跳楨的方法使此現象減輕。
LCDC(Sunplus):這個以前我們調過,但是AWB初始化速度太慢,沒有效果。 
但是你可以通過流程來控制,讓開始的幾幀不要顯示在屏幕上,即讓那個等待界面時間長一些,將preview的前幾幀不要顯示。
 
19)ov7670在對着窗外一會(亮處),再轉換到室內(暗處)這時候調節亮度特別慢或者preview全黑不能恢復。這個問題是因爲LCDC(sunplus)在進入preview時沒有完全給ov7670初始化,而是隻在手機開機初始化一次,以後只是更改少部分寄存器。後來更改爲進入preview時就初始化一次寄存器就可以了。
 
 
2、stack棧和heap堆的關係?
 

一、預備知識—程序的內存分配
一個由c/C++編譯的程序佔用的內存分爲以下幾個部分
1、棧區(stack)—   由編譯器自動分配釋放,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。
2、堆區(heap) —   一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表,呵呵。
3、全局區(靜態區)(static)—,全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。 - 程序結束後有系統釋放
4、文字常量區  —常量字符串就是放在這裏的。 程序結束後由系統釋放
5、程序代碼區—存放函數體的二進制代碼。
二、例子程序
這是一個前輩寫的,非常詳細
//main.cpp
int a = 0; 全局初始化區
char *p1; 全局未初始化區
main()
{
int b; 棧
char s[] = "abc"; 棧
char *p2; 棧
char *p3 = "123456"; 123456\0在常量區,p3在棧上。
static int c =0; 全局(靜態)初始化區
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得來得10和20字節的區域就在堆區。
strcpy(p1, "123456"); 123456\0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。
}

二、堆和棧的理論知識
2.1申請方式
stack:
由系統自動分配。 例如,聲明在函數中一個局部變量 int b; 系統自動在棧中爲b開闢空間
heap:
需要程序員自己申請,並指明大小,在c中malloc函數
如p1 = (char *)malloc(10);
在C++中用new運算符
如p2 = (char *)malloc(10);
但是注意p1、p2本身是在棧中的。

2.2
申請後系統的響應
棧:只要棧的剩餘空間大於所申請空間,系統將爲程序提供內存,否則將報異常提示棧溢出。
堆:首先應該知道操作系統有一個記錄空閒內存地址的鏈表,當系統收到程序的申請時, 會遍歷該鏈表,尋找第一個空間大於所申請空間的堆結點,然後將該結點從空閒結點鏈表中刪除,並將該結點的空間分配給程序,另外,對於大多數系統,會在這塊內存空間中的首地址處記錄本次分配的大小,這樣,代碼中的delete語句才能正確的釋放本內存空間。另外,由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閒鏈表中。

2.3申請大小的限制
棧:在Windows下,棧是向低地址擴展的數 據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總 之是一個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。
堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由於系統是用鏈表來存儲的空閒內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。


2.4申請效率的比較:
棧由系統自動分配,速度較快。但程序員是無法控制的。
堆是由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便.
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配內存,他不是在堆,也不是在棧是直接在進程的地址空間中保留一快內存,雖然用起來最不方便。但是速度快,也最靈活。

2.5堆和棧中的存儲內容
棧: 在函數調用時,第一個進棧的是主函數中後的下一條指令(函數調用語句的下一條可執行語句)的地址,然後是函數的各個參數,在大多數的C編譯器中,參數是由右往左入棧的,然後是函數中的局部變量。注意靜態變量是不入棧的。
當本次函數調用結束後,局部變量先出棧,然後是參數,最後棧頂指針指向最開始存的地址,也就是主函數中的下一條指令,程序由該點繼續運行。
堆:一般是在堆的頭部用一個字節存放堆的大小。堆中的具體內容有程序員安排。

2.6存取效率的比較

char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在運行時刻賦值的;
而bbbbbbbbbbb是在編譯時就確定的;
但是,在以後的存取中,在棧上的數組比指針所指向的字符串(例如堆)快。
比如:
#i nclude
void main()
{
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}
對應的彙編代碼
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一種在讀取時直接就把字符串中的元素讀到寄存器cl中,而第二種則要先把指針值讀到edx中,在根據edx讀取字符,顯然慢了。


2.7小結:
堆和棧的區別可以用如下的比喻來看出:
使用棧就象我們去飯館裏吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。
使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。

 

下面是另一篇,總結的比上面好:

堆和棧的聯繫與區別dd

   在bbs上,堆與棧的區分問題,似乎是一個永恆的話題,由此可見,初學者對此往往是混淆不清的,所以我決定拿他第一個開刀。

    首先,我們舉一個例子:

    void f() { int* p=new int[5]; }

    這條短短的一句話就包含了堆與棧,看到new,我們首先就應該想到,我們分配了一塊堆內存,那麼指針p呢?他分配的是一塊棧內存,所以這句話的意思就是:在棧內存中存放了一個指向一塊堆內存的指針p。在程序會先確定在堆中分配內存的大小,然後調用operator new分配內存,然後返回這塊內存的首地址,放入棧中,他在VC6下的彙編代碼如下:

    00401028  push        14h

    0040102A  call        operator new (00401060)

    0040102F  add         esp,4

    00401032  mov         dword ptr [ebp-8],eax

    00401035  mov         eax,dword ptr [ebp-8]

    00401038  mov         dword ptr [ebp-4],eax

    這裏,我們爲了簡單並沒有釋放內存,那麼該怎麼去釋放呢?是delete p麼?澳,錯了,應該是delete []p,這是爲了告訴編譯器:我刪除的是一個數組,VC6就會根據相應的Cookie信息去進行釋放內存的工作。

    好了,我們回到我們的主題:堆和棧究竟有什麼區別?

    主要的區別由以下幾點:

    1、管理方式不同;

    2、空間大小不同;

    3、能否產生碎片不同;

    4、生長方向不同;

    5、分配方式不同;

    6、分配效率不同;

    管理方式:對於棧來講,是由編譯器自動管理,無需我們手工控制;對於堆來說,釋放工作由程序員控制,容易產生memory leak

    空間大小:一般來講在32位系統下,堆內存可以達到4G的空間,從這個角度來看堆內存幾乎是沒有什麼限制的。但是對於棧來講,一般都是有一定的空間大小的,例如,在VC6下面,默認的棧空間大小是1M(好像是,記不清楚了)。當然,我們可以修改:   

    打開工程,依次操作菜單如下:Project->Setting->Link,在Category 中選中Output,然後在Reserve中設定堆棧的最大值和commit。

注意:reserve最小值爲4Byte;commit是保留在虛擬內存的頁文件裏面,它設置的較大會使棧開闢較大的值,可能增加內存的開銷和啓動時間。

    碎片問題:對於堆來講,頻繁的new/delete勢 必會造成內存空間的不連續,從而造成大量的碎片,使程序效率降低。對於棧來講,則不會存在這個問題,因爲棧是先進後出的隊列,他們是如此的一一對應,以至於永遠都不可能有一個內存塊從棧中間彈出,在他彈出之前,在他上面的後進的棧內容已經被彈出,詳細的可以參考數據結構,這裏我們就不再一一討論了。

    生長方向:對於堆來講,生長方向是向上的,也就是向着內存地址增加的方向;對於棧來講,它的生長方向是向下的,是向着內存地址減小的方向增長。

    分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如局部變量的分配。動態分配由alloca函數進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由編譯器進行釋放,無需我們手工實現。

    分配效率:棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的,它的機制是很複雜的,例如爲了分配一塊內存,庫函數會按照一定的算法(具體的算法可以參考數據結構/操作系統)在堆內存中搜索可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由於內存碎片太多),就有可能調用系統功能去增加程序數據段的內存空間,這樣就有機會分到足夠大小的內存,然後進行返回。顯然,堆的效率比棧要低得多。

    從這裏我們可以看到,堆和棧相比,由於大量new/delete的使用,容易造成大量的內存碎片;由於沒有專門的系統支持,效率很低;由於可能引發用戶態和核心態的切換,內存的申請,代價變得更加昂貴。所以棧在程序中是應用最廣泛的,就算是函數的調用也利用棧去完成,函數調用過程中的參數,返回地址,EBP和局部變量都採用棧的方式存放。所以,我們推薦大家儘量用棧,而不是用堆。

    雖然棧有如此衆多的好處,但是由於和堆相比不是那麼靈活,有時候分配大量的內存空間,還是用堆好一些。

    無論是堆還是棧,都要防止越界現象的發生(除非你是故意使其越界),因爲越界的結果要麼是程序崩潰,要麼是摧毀程序的堆、棧結構,產生以想不到的結果,就算是在你的程序運行過程中,沒有發生上面的問題,你還是要小心,說不定什麼時候就崩掉,那時候debug可是相當困難的:)

     對了,還有一件事,如果有人把堆棧合起來說,那它的意思是棧,可不是堆,呵呵,清楚了

 
 
3、進程和線程的關係。
解釋一:
        Linux是一個多用戶、多任務的操作系統。多用戶是指多個用戶可以在同一時間使用計算機系統;多任務是指Linux可以同時執行幾個任務,它可以在還未 執行完一個任務時又執行另一項任務。在操作系統設計上,從進程(Process)演化出線程(Thread),最主要的目的就是更好地支持多處理器,並且 減小(進程/線程)上下文切換的開銷。

進程和線程的關係

根據操作系統的定義,進程是系統資源管理的最小單位,線程是程序執行的最小單位。線程和進程十分相似,不同的只是線程比進程小。

首先,線程採用了多個線程可共享資源的設計思想。例如,它們的操作大部分都是在同一地址空間進行的。其次,從一個線程切換到另一線程所花費的代價比進程低。再次,進程本身的信息在內存中佔用的空間比線程大。

因此,線程更能允分地利用內存。線程可以看作是在進程內部執行的指定序列。線程和進程的最大區別在於線程完全共享相同的地址空間,運行在同一地址上。

Linux線程的定義

線程是在共享內存空間中併發的多道執行路徑,它們共享一個進程的資源,如文件描述和信號處理。在兩個普通進程(非線程)間進行切換時,內核準備從一個進程的上下文切換到另一個進程的上下文要花費很大的開銷。

這裏上下文切換的主要任務是保存老進程CPU狀態,並加載新進程的保存狀態,用新進程的內存映像替換老進程的內存映像。線程允許進程在幾個正在運行的任務之間進行切換,而不必執行前面提到的完整的上下文。

在Unix類系統中,曾經出現過一些不同線程標準,它們都支持可移植操作系統接口標準POSIX(Portable Operating System Interface Standard)。

POSIX 標準由IEEE制定,並由國際標準化組織接受爲國際標準。POSIX 1003.1c是一個用於線程(在一個程序中當前被執行的代碼段)的標準,以前是P1993.4或POSIX.4的一部分,這個標準已經在1995年被 IEEE通過,歸入ISO/IEC 9945-1:1996。

本文介紹線程主要是針對POSIX線程,即Pthread,因爲Linux 對它的支持最好。相對進程而言,線程是一個更加接近於執行體的概念,它可以與進程中的其它線程共享數據,但擁有自己的棧空間,擁有獨立的執行序列。在串行 程序基礎上引入線程和進程是爲了提高程序的併發度,從而提高程序運行效率和響應時間。

也可以將線程和輕量級進程(LWP)視爲等同,但其實在不同的系統/實現中有不同的解釋。LWP更恰當的解釋可能爲一個虛擬CPU或內核的線程,它可以幫助用戶態線程實現一些特殊的功能。Pthread是一種標準化模型,它用來把一個程序分成一組能夠同時執行的任務。
解釋二:
 進程是表示資源分配的基本單位,又是調度運行的基本單位。例如,用戶運行自己的程序, 系統就創建一個進程,併爲它分配資源,包括各種表格、內存空間、磁盤空間、I/O設備等。然後,把該進程放人進程的就緒隊列。進程調度程序選中它,爲它分 配CPU以及其它有關資源,該進程才真正運行。所以,進程是系統中的併發執行的單位。 

        在Mach、Windows NT等採用微內核結構的操作系統中,進程的功能發生了變化:它只是資源分配的單位,而不再是調度運行的單位。在微內核系統中,真正調度運行的基本單位是線程。因此,實現併發功能的單位是線程。

線程概念 

         線程是進程中執行運算的最小單位,亦即執行處理機調度的基本單位。如果把進程理解爲在邏輯上操作系統所完成的任務,那麼線程表示完成該任務的許多可能的 子任務之一。例如,假設用戶啓動了一個窗口中的數據庫應用程序,操作系統就將對數據庫的調用表示爲一個進程。假設用戶要從數據庫中產生一份工資單報表,並 傳到一個文件中,這是一個子任務;在產生工資單報表的過程中,用戶又可以輸人數據庫查詢請求,這又是一個子任務。這樣,操作系統則把每一個請求――工資單 報表和新輸人的數據查詢表示爲數據庫進程中的獨立的線程。線程可以在處理器上獨立調度執行,這樣,在多處理器環境下就允許幾個線程各自在單獨處理器上進 行。操作系統提供線程就是爲了方便而有效地實現這種併發性 

引入線程的好處 

(1)易於調度。 

(2)提高併發性。通過線程可方便有效地實現併發性。進程可創建多個線程來執行同一程序的不同部分。 

(3)開銷少。創建線程比創建進程要快,所需開銷很少。。 

(4)利於充分發揮多處理器的功能。通過創建多線程進程(即一個進程可具有兩個或更多個線程),每個線程在一個處理器上運行,從而實現應用程序的併發性,使每個處理器都得到充分運行。 

進程和線程的關係 

(1)一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少有一個線程。 

(2)資源分配給進程,同一進程的所有線程共享該進程的所有資源。 

(3)處理機分給線程,即真正在處理機上運行的是線程。 

(4)線程在執行過程中,需要協作同步。不同進程的線程間要利用消息通信的辦法實現同步。
 
4、硬件I2C和軟件I2C的對比。

用軟件實現和硬件實現基本上沒有區別,可以把多個不同種類的器件加到一個雙線結構上,只是要注意:

1.  注意軟件產生的時序要滿足i2c協議要求,就是那些AC參數,具體情況和MCU種類,速率等有關; 因爲指令延時的關係,可能無法達到要求的通訊速率,但可以很接近;

2. 作爲SDA總線的I/O端口在轉換輸入和輸出方向時,要注意滿足總線協議,當器件較多時要使用一個外部上拉電阻;

3.如果使用帶有擴展地址字節的存儲器和一般的I2C器件在同一總線中,注意不要產生協議上的衝突;

 解釋二:

I2C(發音爲:”I squared see”)能用於替代標準的並行總線,能連接的各種集成電路和功能模塊。對於嵌入式系統設計者來說,有以下好處:

·        更少的管腳連接,也就不需要並行總線接口。

·        由更少的管腳連接帶來的更小的電路規模。

·        更少的電路板層數和更少的電路連線。

·        由於I2C支持多主控,所以更容易調試。

支持I2C的設備有微控制器,A/D、D/A轉換器,儲存器,LCD控制器,LED驅動器,I/O端口擴展器以及實時時鐘。

通過使用內建的I2C接口硬件或者連接到微控制器標準並行總線的外部I2C控制芯片,微控制器能夠連接到I2C總線。任選其中一種方式,通過通常的 I/0管腳和軟件上的“位拆裂(bit-banging)”技術,你就能實現一種軟件I2C接口。這種方式比較慢,比以硬件爲基礎的實現要複雜的多。

I2C的性能

標準I2C總線傳輸速率可以到100Kbit/s,通過使用了7位地址碼,就能支持128個設備。加強型I2C總線用了10位地址碼(能夠支持1024個設備),快速模式(400Kbit/s)和高速模式(最高有3.4Mbit/s)。

I2C是多主控總線,所以任何一個設備都能像主控器一樣工作,並控制總線。總線上每一個設備都有一個獨一無二的地址,根據設備它們自己的能力,它們可以作爲發射器或接收器工作。多路微控制器能在同一個I2C總線上共存。

只要很小的電路附件,I2C總線就能夠支持設備在不同電平下工作(例如:3.3伏和5伏),

I2C總線的工作情況

I2C總線的規範中規定了如何在兩個設備之間傳遞數據,採取的方法是總線仲裁、時鐘同步和總線的電氣特徵。

在一次數據傳輸中,一個設備扮演臨時主控器,開始在它和一個有單一地址設備(從控器)之間的傳輸。主控器爲數據傳輸產生時鐘信號。規範中要求數據線(SDA,串行數據線)只有在時鐘(SCL,串行時鐘線)處於低平時才能變化。

總線的一次典型工作流程如下:

1.開始:信號表明傳輸開始。

2.地址:主設備發送地址信息,包含7位的從設備地址和1位的指示位(表明讀或者寫,即數據流的方向)。

3.數據:根據指示位,數據在主設備和從設備之間傳輸。數據一般以8位傳輸,最重要的位放在前面;具體能傳輸多少量的數據並沒有限制。接收器上用一位的ACK(回答信號)表明每一個字節都收到了。傳輸可以被終止和從新開始。

4.停止:信號結束傳輸。

I2C的仲裁

在向那些只有一個主設備(典型的是主微控制器)的基本系統中不會有仲裁的。然而,更多的複雜系統能夠有多個主控設備,因此,就有必要用某種形式的仲裁來避免總線衝突和數據丟失。

通過用線與(開路基極)連接I2C總線的兩路信號(數據和時鐘)可以實現仲裁。所有的主設備必須監視I2C的數據和時鐘線,如果主設備發現已經有傳輸正在進行,它就不會開始傳輸了。

有很小的機率會產生一下情況:有兩個或更多的設備同時發出“開始”信號。在這種情況下,相互競爭的設備自動使它們的時鐘保持同步,然後像平常一樣繼續發射信號。

第一個檢測到自己發送的數據和總線上的數據不匹配的設備要失去仲裁能力。這種情況會在這時發生:當前述設備發送一個高電平時,而同時另一個主控設備也正在發送一個低電平。也許直到相互競爭的設備已經傳輸了許多字節後,仲裁纔會完成。

因爲沒有數據丟失,仲裁處理是不需要一種特殊的仲裁相位的。獲得主控權的設備從本質上來說,是不知道它爲了總線而和其它設備競爭的。

在一個以硬件爲基礎的I2C中,有關發送、同步和仲裁的細節是自動處理的,不用你操心。如果你計劃實現一個軟件驅動的多主控I2C接口,那你需要研究I2C詳細規範(study the I2C specification in detail),並懂得其細微差別,

 
5、待機電流、底電流。
 

通常在測待機電流出現異常時,要先打開某個功能,然後離開,等待手機進入待機狀態,然後再測試待機電流。

比如開機->進入待機->打開照相機->關閉照相機->待機->測待機電流

要一個功能一個功能去驗證,看看是否因爲沒有真正關閉某個功能而導致待機電流很大

 
 

有一個基站的參數是BS_PA,它的設定值爲2到9,設爲X;

一個單位週期爲一個復幀,51*5000*12/13=0.235S

每 X*0.235 手機將會醒過來,與基站同步。

還有一點很重要,X的不同,測出來的待機電流相差也很大的。

 
 
那是不是說如果PR爲2的話,那麼手機每0.47S與基站同步一次,也就是0.47秒搜網一次吧。
比較我以前測的數據。推測聯通是paging 2,移動是paging 8
實際測聯通卡的搜網間隔是470mS,測移動卡的搜網間隔是1.89秒,
算出來的是0.235*2=0.47S,0.235*8=1.88S都非常吻合,現在明白了,謝謝!
 
 
經常碰到這種波形,往往是鬧鐘啊,記事本呀等等定時啓動。
與基站聯絡時的波形爲週期性2A脈衝的波形,前面已經提到週期的計算方法不累訴。
叫MMI的查查,很容易的,先關掉與RTC有關的模塊,往往就正常了。
 

正常的情況下,很多RF模塊大概1秒鐘和基站通信一次,所以一秒鐘會有個高脈衝,至於連續10秒的脈衝,這是對應的RF模塊有關,一個穩定的RF模塊是沒有這個情況出現的,你可以測試一下其他平臺,
手機RF部分最小電流一般有1mA,平均下來差不多3mA,當然這和不同的手機RF模塊有關

 
 

我從軟件來簡單分析下待機電流問題:

1、所謂待機電流就是bb cpu主動降低cpu運行時鐘,如果原來高速運行是26M的話,那麼在待機的情況下

 可能就是幾k,這樣,整個系統io都關閉,系統只是非常慢的處理一些待機程序。

2、有人說到卡不同,待機電流不同,這是由於手機軟件在待機的情況下,要每隔段時間搜索網絡,如果網絡信號好的話,

  搜索快,電流就小,如果網絡信號不好,就慢,同時耗電流就大。

4、所謂的搜網間隔時間,在手機系統中一般是比較固定的,因爲對整個系統的時間片要求比較嚴格。

3、地域不同引起的電流不同同2一樣,與網絡信號有關。

 
 
 
 
6、BB和LCDC的通信。16位通過發命令和數據通信。
 
I80總線即80總線。
 
7、sensor的數據格式YUV和RAW data RGB的區別。
 
解釋一:
 
RGB是三基色,一般每個象素點用24表示,RGB個佔8位。YUV中Y爲亮度分量,UV爲色度分量,YUV有好幾種格式,相比RGB,YUV可以減少數據量。對於黑白電視,只需要使用Y分量即可,因而YUV可以兼容黑店電視。
 
RGB和YUV都是色彩空間,用於表示顏色,兩者可以相互轉化.至於電視採用YUV分量形式是由ITU(國際電信聯盟)規定的,因爲其能減少數據儲存空間和數據傳輸帶寬,同時又能非常方便的兼容黑白電視!
 
首先,200萬象素的sensor,就是有2M個pixel;
    YUV是電視傳輸用的名詞,一個亮度信號(Y),兩個色差信號(U分量、V分量)
    YUV (亦稱YCrCb)是被歐洲電視系統所採用的一種顏色編碼方法(屬於PAL)。YUV主要用於優化彩色視頻信號的傳輸,使其向後兼容老式黑白電視。與 RGB視頻信號傳輸相比,它最大的優點在於只需佔用極少的帶寬(RGB要求三個獨立的視頻信號同時傳輸)。其中“Y”表示明亮度(Luminance或 Luma),也就是灰階值;而“U”和“V”表示的則是色度(Chrominance或Chroma),作用是描述影像色彩及飽和度,用於指定像素的顏 色。“亮度”是通過RGB輸入信號來創建的,方法是將RGB信號的特定部分疊加到一起。“色度”則定義了顏色的兩個方面—色調與飽和度,分別用Cr和CB 來表示。其中,Cr反映了GB輸入信號紅色部分與RGB信號亮度值之間的差異。而CB反映的是RGB輸入信號藍色部分與RGB信號亮度值之同的差異。 


     在現代彩色電視系統中,通常採用三管彩色攝像機或彩色CCD(點耦合器件)攝像機,它把攝得的彩色圖像信號,經分色、分別放大校正得到RGB,再經過矩陣 變換電路得到亮度信號Y和兩個色差信號R-Y、B-Y,最後發送端將亮度和色差三個信號分別進行編碼,用同一信道發送出去。這就是我們常用的YUV色彩空 間。 

    YUV (YCrCb)和4:2:2, 4:1:1, 4:2:0
  是指亮度信號Y和紅/藍色差信號的抽樣格 式. 在dv中, ntsc是4:1:1, pal採用4:2:0. 注意, 4:2:0並非藍色差信號採樣爲0,而是和4:1:1相比,在水平方向上提高1倍色差採樣頻率,在垂直方向上以Cr/Cb間隔的方式減小一半色差採樣.
 
RGB色彩模式是工業界的一種顏色標準,是通過對紅(R)、綠(G)、藍(B)三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的,RGB 即是代表紅、綠、藍三個通道的顏色,這個標準幾乎包括了人類視力所能感知的所有顏色,是目前運用最廣的顏色系統之一。
  而與我們電腦相關的地方,就是目前的顯示器大都是採用了RGB顏色標準,這就是爲什麼它對我們來說這麼重要了。
  在顯示器上,是通過電子槍打在屏幕的紅、綠、藍三色發光極上來產生色彩的,目前的電腦一般都能顯示32位顏色,約有一百萬種以上的顏色。如果說它所顯示的顏色還不能完全吻合自然界中的某種色彩的話,那已經幾乎是我們肉眼所不能分辯出來的了。 

RGB是從顏色發光的原理來設計定的,通俗點說它的顏色混合方式就好象有紅、綠、藍三盞燈,當它們的光相互疊合的時候,色彩相混,而亮度卻等於兩者亮度之總和(兩盞燈的亮度嘛!),越混合亮度越高,即加法混合。

  有色光可被無色光沖淡並變亮。如藍色光與白光相遇,結果是產生更加明亮的淺藍色光。知道它的混合原理後,在軟件中設定顏色就容易理解了.

  紅、綠、藍三盞燈的疊加情況,中心三色最亮的疊加區爲白色,加法混合的特點:越疊加越明亮。
  紅、綠、藍三個顏色通道每種色各分爲255階亮度,在0時“燈”最弱——是關掉的,而在255時“燈”最亮。當三色數值相同時爲無色彩的灰度色,而三色都爲255時爲最亮的白色,都爲0時爲黑色。
 
解釋二:

       YUV和RGB是兩種不同的顏色空間。一般來說,用YUV的話,可以節省存儲空間,且對視頻編解碼有利。不過LCD直接接收的格式基本都是RGB的,在DSP或者類似控制器裏面有專門的YUV到RGB的轉換電路。

 
解釋三:
RGB是由YUV進行矩陣計算得到的,其效果要比S端子和CVBS好很多.是目前電腦顯示器上主要用的視頻接口(VGA),但畢竟還是模擬信號,所以以後 的主流都是TMDS(最小差分信號傳輸)信號的DVI接口和HDMI接口.畢竟數字纔是未來嗎,呵呵...而這些接口之間有些是可以很輕鬆的進行轉換的, 所以使用的時候我們根據需要可以進行必要的改進.
 
解釋四:
RGB三基色信號,YUV是色差信號。
/f
F:fK;h_X 如果是攝像機輸出,RGB三基色信號可以比YUV色差信號清晰度高,UV信號一般經過壓縮。‑s*B"N;S p5t nKIg 如果是衛星機輸出,RGB三基色信號和YUV色差信號清晰度一樣,只是信號方式不一樣。
 
解釋五:
RGB   顏色模式   
    雖然可見光的波長有一定的範圍,但我們在處理顏色時並不需要將每一種波長的顏色都單獨表示。因爲自然界中所有的顏色都可以用紅、綠、藍(RGB)這三 種顏色波長的不同強度組合而得,這就是人們常說的三原色原理。因此,這三種光常被人們稱爲三基色或三原色。有時候我們亦稱這三種基色爲添加色 (Additive   Colors),這是因爲當我們把不同光的波長加到一起的時候,得到的將會是更加明亮的顏色。把三種基色交互重疊,就產生了次混合色:青(Cyan)、洋 紅(Magenta)、黃(Yellow)。這同時也引出了互補色(Complement   Colors)的概念。基色和次混合色是彼此的互補色,即彼此之間最不一樣的顏色。例如青色由藍色和綠色構成,而紅色是缺少的一種顏色,因此青色和紅色構 成了彼此的互補色。在數字視頻中,對   RGB   三基色各進行   8   位編碼就構成了大約16.7萬種顏色,這就是我們常說的真彩色。順便提一句,電視機和計算機的監視器都是基於   RGB   顏色模式來創建其顏色的;     
  Lab   顏色模式   
    Lab   顏色是由   RGB   三基色轉換而來的,它是由   RGB   模式轉換爲   HSB   模式和   CMYK   模式的橋樑。該顏色模式由一個發光率(Luminance)和兩個顏色(a,b)軸組成。它由顏色軸所構成的平面上的環形線來表示顏色的變化,其中徑向表 示色飽和度的變化,自內向外,飽和度逐漸增高;圓周方向表示色調的變化,每個圓周形成一個色環;而不同的發光率表示不同的亮度並對應不同環形顏色變化線。 它是一種具有“獨立於設備”的顏色模式,即不論使用任何一種監視器或者打印機,Lab   的顏色不變。     
  HSB   顏色模式   
    從心理學的角度來看,顏色有三個要素:色澤(Hue)、飽和度(Saturation)和亮度(Brightness)。HSB   顏色模式便是基於人對顏色的心理感受的一種顏色模式。它是由   RGB   三基色轉換爲   Lab   模式,再在Lab   模式的基礎上考慮了人對顏色的心理感受這一因素而轉換成的。因此這種顏色模式比較符合人的視覺感受,讓人覺得更加直觀一些。它可由底與底對接的兩個圓錐體 立體模型來表示,其中軸向表示亮度,自上而下由白變黑;徑向表示色飽和度,自內向外逐漸變高;而圓周方向,則表示色調的變化,形成色環。     
  YUV   顏色模式   
    這是電視系統中常用的顏色模式,即電視中所謂的分量(Component)信號。該模式由一個亮度信號   Y   和兩個色差信號   U、V   組成。它是利用了人眼對亮度信號敏感而對色度信號相對不敏感的特點,將   RGB   顏色通過亮度信號公式Y=039R+050G+011B轉換爲一個亮度信號   Y   和兩個色差分量信號   U(R-Y)、V(B-Y),即對色差信號進行了頻帶壓縮。毫無疑問,這是以犧牲信號的質量爲代價的。     
  CMYK   顏色模式   
    這是彩色印刷使用的一種顏色模式。它由青(Cyan)、洋紅(Magenta)、黃(Yellow)和黑(Black)四種顏色組成。其中黑色之所以 用   K   來表示,是爲避免和   RGB   三基色中的藍色(Blue,用B表示)發生混淆。該種模式的創建基礎和   RGB   不同,它不是靠增加光線,而是靠減去光線,因爲和監視器或者電視機不同的是,打印紙不能創建光源,它不會發射光線,只能吸收和反射光線。因此通過對上述四 種顏色的組合,便可以產生可見光譜中的絕大部分顏色了
 
解釋六:
在Camera Sensor中,最常用的YUV模型是 YUV422格式,因爲它採用4個字節描述兩個像素,能和RGB565模型比較好的兼容。有利於Camera Sensor和Camera controller的軟硬件接口設計。
 
解釋七:http://dearymz.blog.163.com/blog/static/2056574200741774122887/

自然界的顏色千變 萬化,爲了給顏色一個量化的衡量標準,就需要建立色彩空間模型來描述各種各樣的顏色,由於人對色彩的感知是一個複雜的生理和心理聯合作用的過程,所以在不同的應用領域中爲了更好更準確的滿足各自的需求,就出現了各種各樣的色彩空間模型來量化的描述顏色。我們比較常接觸到的就包括 RGB /CMYK / YIQ / YUV / HSI等等。

       對於數字電子多媒體領域來說,我們經常接觸到的色彩空間的概念,主要是RGB ,YUV這兩種(實際上,這兩種體系包含了許多種具體的顏色表達方式和模型,如sRGB,Adobe RGB, YUV422, YUV420 …), RGB是按三基色加光系統的原理來描述顏色,而YUV則是按照 亮度,色差的原理來描述顏色。

       即使只是RGB YUV這兩大類色彩空間,所涉及到的知識也是十分豐富複雜的,自知不具備足夠的相關專業知識,所以本文主要針對工程領域的應用及算法進行討論。

而在Camera Sensor中,最常用的YUV模型是 YUV422格式,因爲它採用4個字節描述兩個像素,能和RGB565模型比較好的兼容。有利於Camera Sensor和Camera controller的軟硬件接口設計。
 

進一步分析,我們可以看到,因爲在手機等嵌入式運用上我們最終是要把數據轉換成RGB565格式送到LCD屏上顯示的,所以,對於RGB三分量來說,我們根本不需要8bit這麼高的精度,爲了簡單和運算的統一起見,對每個分量我們其實只需要高6bit的數據就足夠了,所以我們可以進一步把表格改爲4個6*6的二維表格,這樣一共只需要佔用16K內存!在計算表格元素值的時候還可以把最終的溢出判斷也事先做完。最後的算法如下:

       y = (YUVdata[Y1POS] >> 2);
        u = (YUVdata[UPOS] >> 2);
        v = (YUVdata[VPOS] >> 2);

        r = yv2r_table[ y ][ v ];
        g = yig2g_table[ y ][ uv2ig_table[ u][ v ] ];
        b = yu2b_table[ y ][ u ];
 
        RGBdata[1] =( (r & 0xF8)  |( g >> 5) );
        RGBdata[0] =( ((g & 0x1C)<< 3) | ( b >> 3) );

       這樣相對部分查表法,我們增加了3次移位運算,而進一步減少了4次加法運算和6次比較賦值操作。

       在計算表格元素數值的時候,要考慮舍入和偏移等因數使得計算的中間結果滿足數組下標非負的要求,需要一定的技巧。

       採用完全查表法,相對於第一種算法,最終運算速度可以有比較明顯的提高,具體性能能提高多少,要看所在平臺的CPU運算速度和內存存取速度的相對比例。內存存取速度越快,用查表法帶來的性能改善越明顯。在我的PC上測試的結果性能大約能提高35%。而在某ARM平臺上測試只提高了約15%。

3.4 進一步的思考

       實際上,上述算法:

        RGBdata[1]=( (r & 0xF8)  | ( g >> 5) );
        RGBdata[0] =( ((g & 0x1C)<< 3) | ( b >> 3) );

       中的 (r & 0xF8) 和 ( b >> 3) 等運算也完全可以在表格中事先計算出來。另外,YU / YV的取值實際上不可能覆蓋滿6*6的範圍,中間有些點是永遠取不到的無輸入,RB的運算也可以考慮用5*5的表格。這些都可能進一步提高運算的速度,減小表格的尺寸。

       另外,在嵌入式運用中,如果可能儘量將表格放在高速內存如SRAM中應該比放在SDRAM中更加能發揮查表法的優勢。

4 RGB2YUV ?

       目前覺得這個是沒法將3維表格的查表運算化簡爲2維表格的查表運算了。只能用部分查表法替代其中的乘法運算。

       另外,多數情況下,我們需要的還是YUV2RGB的轉換,因爲從Sensor得到的數據通常我們會用YUV數據,此外JPG和MPEG實際上也是基於YUV格式編碼的,所以要顯示解碼後的數據需要的也是YUV2RGB的運算。

 
 
8、LCD的總線類型。
 
80總線,SPI總線+RGB,
 
1.YU (Touch panel)
2.XL
3.YD
4.XR
5.VCC
6.GND
7.RESET:reset pin
8.DATA0-DATA15:data bus pin
9.RD:read pin
10.WR:write pin
11.RS:register select pin
12.CS:chip select pin
13.IM0:18/16/9/8 –bit parallel switching pin
14.LED_K:LED cathode connection
15.LED_A1:power supply for LED(BLU)
 
Lcd is RGB interface:
1.YU (Touch panel,up,lefe,down,right)
2.XL
3.YD
4.XR
5.GND
6.R0-R5(RED SIGNAL 0-5)
7.G0-G5(GREEN SIGNAL 0-5)
8.B0-B5(BLUE SIGNAL 0-5)
9.SPI_CLK
10.SPI_SDI:serial data input
11.SPI_CS
12.VSYNC:Vertical synchronous for display data.
13.HSYNC:Horizontal synchronous for display data
14.VDDIO:POWER supply for I/O logic
15.LED+:B/L LED Anode
16.LED-:B/L LED Cathode
17.DE:Data Enable signal for display
18.PCLK:clock signal for display data
19.reset
 
9、按鍵的原理。
 
 
10、T卡的接口。
 
1.  sd_sdata0
2. sd_sclk
3.sd_scmd
4.sd_sdata3
5.vdd
6.vss
 
 
 
11、ARM的各個接口的理解和區別。
 
12、存儲類器件sd等的硬件連接和軟件協議理解
 
13、文件系統的理解,底層協議的編寫。
 
14、編譯器的工作
 
15、camera各個功能的實現方式(dsp or isp)和函數原型
 
16、lcd的硬件連接和軟件接口
 
17、camera中容易出現的問題和解決方法
 
18、lcd中容易出現的問題和解決方法,例如lcd不亮我們將如何解決。
 
19、如果lcd顯示的數據變斜了,是什麼原因。
 
20、camera的硬件連接和軟件接口
 
21、刷屏的buffer的組織。mirror
 
22、如何使用鏈表
Struct pnode{
*pnext;
Data;
}
23、如何用結構體實現一個數據包
Struct pack{
Int length;
Char data[1];
}
Pack xx(int length,char *data)
{
       Pack *p = NULL;
       Malloc(p);
       p.length = length;
       p->data = data;
       return p;
}
應該注意給p分配空間,以及如何釋放data的空間。
24、如何用結構體實現如下32位數據的控制。
3 bit control
4 bit type
5 bit length
10 bit data
10 bit end
Struct x{
Con:3;
Type:4;
Length:5
Data:10;
End10
}
 
25、寫一個函數實現挑選一個字符串內“0-9”或者“a-z”的函數。
 
26、進程和線程的關係,進程如何調度線程?
 
27、如何用嵌入式的思想優化下面的代碼:
Int pcc(int a,int b)
{
   Return (a/16+b/32);
 
}
應該更改爲:
Int pcc(int a,int b)
{
   Return (a>>16+b>>32);
 
}
 
28、#define dddd(a,b)  (a*b) is wrong?
 
29、對結構體內的數組如何操作?
Struct pack{
Int length;
Char data[1];
}
Pack p;
p.length =1;
int i;
for(i=0;i<10;i++)
{
  p->data++ = i;
}
Why is wrong below?
for(i=0;i<10;i++)
{
  p->data[i] = i;
}
 
30、#define addoffset(addr,field)  (*field->0)(field)
 
31、#define startAddress(addr,field) (*field-offset)
 
 
32、頭文件如何定義?
 
33、對寄存器的某一位如何用code操作?set clear
 
34、對位操作時,intel 何motolona都有哪些指令。或者其他地方的指令。
 
35、如何用一行代碼實現輸入“1234”輸出也爲“1234”
Int x(int *string,int length)
{
       Int i,ret=0;
       For(i=0;i<length;i++)
       {
       Ret = ,,,,,
}
Return ret;
}
 
36、gsm,td-scdma,wcdma的協議理解
 
37、同樣的硬件接口,如何使用軟件區分不同的lcd?
 
38、如何管理mmi?
 
39、如何調度任務?
 
40、linux操作系統中對鏈表的操作,操作系統和驅動的關係
 
41、如何求一個指針的起始地址和偏移地址
 
 
 

Freescale使用的是大端系統。

Drogfly使用的是小端系統。

Pc使用的是小端系統。

如何去判斷是大端或者小端系統?

定義兩個char類型變量,然後附初始值,然後打trace對比看。

NAND和NOR flash的區別

 

NOR和NAND是現在市場上兩種主要的非易失閃存技術。Intel於1988年首先開發出NOR flash技術,徹底改變了原先由EPROM和EEPROM一統天下的局面。緊接着,1989年,東芝公司發表了NAND flash結構,強調降低每比特的成本,更高的性能,並且象磁盤一樣可以通過接口輕鬆升級。但是經過了十多年之後,仍然有相當多的硬件工程師分不清NOR 和NAND閃存。

  相“flash存儲器”經常可以與相“NOR存儲器”互換使用。許多業內人士也搞不清楚NAND閃存技術相對於NOR技術的優越之處,因爲大多數情況下閃存只是用來存儲少量的代碼,這時NOR閃存更適合一些。而NAND則是高數據存儲密度的理想解決方案。

  NOR的特點是芯片內執行(XIP, eXecute In Place),這樣應用程序可以直接在flash閃存內運行,不必再把代碼讀到系統RAM中。

NOR的傳輸效率很高,在1~4MB的小容量時具有很高的成本效益,但是很低的寫入和擦除速度大大影響了它的性能。

  NAND結構能提供極高的單元密度,可以達到高存儲密度,並且寫入和擦除的速度也很快。應用NAND的困難在於flash的管理和需要特殊的系統接口。



性能比較

   flash閃存是非易失存儲器,可以對稱爲塊的存儲器單元塊進行擦寫和再編程。任何flash器件的寫入操作只能在空或已擦除的單元內進行,所以大多數 情況下,在進行寫入操作之前必須先執行擦除。NAND器件執行擦除操作是十分簡單的,而NOR則要求在進行擦除前先要將目標塊內所有的位都寫爲0。

  由於擦除NOR器件時是以64~128KB的塊進行的,執行一個寫入/擦除操作的時間爲5s,與此相反,擦除NAND器件是以8~32KB的塊進行的,執行相同的操作最多只需要4ms。

  執行擦除時塊尺寸的不同進一步拉大了NOR和NADN之間的性能差距,統計表明,對於給定的一套寫入操作(尤其是更新小文件時更多的擦除操作必須在基於NOR的單元中進行。這樣,當選擇存儲解決方案時,設計師必須權衡以下的各項因素。

  ● NOR的讀速度比NAND稍快一些。

  ● NAND的寫入速度比NOR快很多。

  ● NAND的4ms擦除速度遠比NOR的5s快。

  ● 大多數寫入操作需要先進行擦除操作。

  ● NAND的擦除單元更小,相應的擦除電路更少。


接口差別
  NOR flash帶有SRAM接口,有足夠的地址引腳來尋址,可以很容易地存取其內部的每一個字節。

  NAND器件使用複雜的I/O口來串行地存取數據,各個產品或廠商的方法可能各不相同。8個引腳用來傳送控制、地址和數據信息。

  NAND讀和寫操作採用512字節的塊,這一點有點像硬盤管理此類操作,很自然地,基於NAND的存儲器就可以取代硬盤或其他塊設備。

容量和成本

  NAND flash的單元尺寸幾乎是NOR器件的一半,由於生產過程更爲簡單,NAND結構可以在給定的模具尺寸內提供更高的容量,也就相應地降低了價格。

   NOR flash佔據了容量爲1~16MB閃存市場的大部分,而NAND flash只是用在8~128MB的產品當中,這也說明NOR主要應用在代碼存儲介質中,NAND適合於數據存儲,NAND在CompactFlash、 Secure Digital、PC Cards和MMC存儲卡市場上所佔份額最大。
可靠性和耐用性
  採用flahs介質時一個需要重點考慮的問題是可靠性。對於需要擴展MTBF的系統來說,Flash是非常合適的存儲方案。可以從壽命(耐用性)、位交換和壞塊處理三個方面來比較NOR和NAND的可靠性。
  壽命(耐用性)
  在NAND閃存中每個塊的最大擦寫次數是一百萬次,而NOR的擦寫次數是十萬次。NAND存儲器除了具有10比1的塊擦除週期優勢,典型的NAND塊尺寸要比NOR器件小8倍,每個NAND存儲器塊在給定的時間內的刪除次數要少一些。
  位交換
  所有flash器件都受位交換現象的困擾。在某些情況下(很少見,NAND發生的次數要比NOR多),一個比特位會發生反轉或被報告反轉了。
  一位的變化可能不很明顯,但是如果發生在一個關鍵文件上,這個小小的故障可能導致系統停機。如果只是報告有問題,多讀幾次就可能解決了。
  當然,如果這個位真的改變了,就必須採用錯誤探測/錯誤更正(EDC/ECC)算法。位反轉的問題更多見於NAND閃存,NAND的供應商建議使用NAND閃存的時候,同時使用EDC/ECC算法。
  這個問題對於用NAND存儲多媒體信息時倒不是致命的。當然,如果用本地存儲設備來存儲操作系統、配置文件或其他敏感信息時,必須使用EDC/ECC系統以確保可靠性。
  壞塊處理
  NAND器件中的壞塊是隨機分佈的。以前也曾有過消除壞塊的努力,但發現成品率太低,代價太高,根本不划算。

  NAND器件需要對介質進行初始化掃描以發現壞塊,並將壞塊標記爲不可用。在已製成的器件中,如果通過可靠的方法不能進行這項處理,將導致高故障率。



易於使用
  可以非常直接地使用基於NOR的閃存,可以像其他存儲器那樣連接,並可以在上面直接運行代碼。
  由於需要I/O接口,NAND要複雜得多。各種NAND器件的存取方法因廠家而異。
  在使用NAND器件時,必須先寫入驅動程序,才能繼續執行其他操作。向NAND器件寫入信息需要相當的技巧,因爲設計師絕不能向壞
塊寫入,這就意味着在NAND器件上自始至終都必須進行虛擬映射。

軟件支持
  當討論軟件支持的時候,應該區別基本的讀/寫/擦操作和高一級的用於磁盤仿真和閃存管理算法的軟件,包括性能優化。
  在NOR器件上運行代碼不需要任何的軟件支持,在NAND器件上進行同樣操作時,通常需要驅動程序,也就是內存技術驅動程序(MTD),NAND和NOR器件在進行寫入和擦除操作時都需要MTD。

   使用NOR器件時所需要的MTD要相對少一些,許多廠商都提供用於NOR器件的更高級軟件,這其中包括M-System的TrueFFS驅動,該驅動被 Wind River System、Microsoft、QNX Software System、Symbian和Intel等廠商所採用。

  驅動還用於對DiskOnChip產品進行仿真和NAND閃存的管理,包括糾錯、壞塊處理和損耗平衡。

 

 

/***************************question**********************/

1.mmu的意義和作用

⑴.MMU的使用
MMU是存儲器管理單元的縮寫,是用來管理虛擬內存系統的器件。 MMU通常是CPU的一部分,本身有少量存儲空間存放從虛擬地址到物理地址的匹配表。此表稱作TLB(轉換旁置緩衝區)。所有數據請求都送往MMU,由 MMU決定數據是在RAM內還是在大容量存儲器設備內。如果數據不在存儲空間內,MMU將產生頁面錯誤中斷。
MMU的兩個主要功能是:
1.    
將虛地址轉換成物理地址。
2.    
控制存儲器存取允許。MMU關掉時,虛地址直接輸出到物理地址總線。
在實踐中,使用MMU解決了如下幾個問題:
①使用DRAM作爲大容量存儲器時,如果DRAM的物理地址不連續,這將給程序的編寫調試造成極大不便,而適當配置MMU可將其轉換成虛擬地址連續的空間。
②ARM內核的中斷向量表要求放在0地址,對於ROM在0地址的情況,無法調試中斷服務程序,所以在調試階段有必要將可讀寫的存儲器空間映射到0地址。
③系統的某些地址段是不允許被訪問的,否則會產生不可預料的後果,爲了避免這類錯誤,可以通過MMU匹配表的設置將這些地址段設爲用戶不可存取類型。
啓動程序中生成的匹配表中包含地址映射,存儲頁大小(1M,64K,或4K)以及是否允許存取等信息。
例如:目標板上的16兆DRAM的物理地址區間爲0xc000,0000~0xc07f,ffff;0xc100,0000~0xc17f,ffff;16兆ROM的虛擬地址區間爲:0x0000,0000~0x00ff,ffff。匹配表配置如下:
可以看到左邊是連續的虛擬地址空間,右邊是不連續的物理地址空間,而且將DRAM映射到了0地址區間。 MMU通過虛擬地址和頁面表位置信息,按照轉換邏輯獲得對應物理地址,輸出到地址總線上。
應注意到的是使能MMU後,程序繼續運行,但是對於程序員來說程序計數器的指針已經改變,指向了ROM所對應的虛擬地址。

 

2。讀取DMA變量和cpu共享區域變量時,應注意什麼

一、關於DMA 的問答

1、問:DMA的優點是什麼?
答:它有以下幾項優點: 由於把CPU從多任務的環境的數據傳輸和單任務環境的大量數據傳輸解放出來了,從而明顯提高了整個系統的性能可以把數據從HDD直接傳輸到主存而不佔用很多的CPU資源 在數據傳輸中解放了CPU,使得CPU可以工作在多任務環境下 在多任務環境下,DMA的作用尤其顯著

2、問:DMA和PIO模式有哪些不同?
答: DMA(Direct Memory Access) PIO(ProgrammedInput/Output) 在內存中建立了輸出/輸入描述表,還在主板中設計了總線管理芯片用以實現數據的傳輸按照優先次序來執行計算和數據的傳輸 數據的傳輸工作不再由CPU來完成,從而使得它可以專門去做計算工作 CPU不但要做文件的傳輸還要做計算,因此某些任務可能會被掛起

3、問:Ultra DMA 33是什麼?
答:Ultra DMA 33是一種由Intel公司設計的同步DMA協議。Intel的PIIX4芯片組包括了這一功能。傳統的IDE數據傳輸僅僅用於單邊帶的數據脈衝。Ultra DMA/33則在數據傳輸時使用了雙邊帶的數據脈衝。因此,在ATA 2驅動器傳輸速度可以由16MB/s提高到33MS/s。

4、問:Ultra DMA 33有什麼優點?
答:除了顯著的性能提高之外,該協議還具有以下優點: 節省了CPU的數據傳輸時間;從而CPU可以不做數據傳輸而專門進行計算工作 提高了整個系統的性能效率;數據傳輸速率由16MB/secATA 2提高到33MB/sec 改善了在DMA/33模式下的ATA現存信號;IDE集線器不再需要外部信號引腳 對原先的ATA驅動器完全兼容;控制器和驅動器在每一次傳輸中均可使用正確的協議 即插即用;由於UltraDMA/33的兼容性,設備可以自動識別 具有檢錯功能;16位的CRC寄存器可以在每一個脈衝實現CRC檢查 實現自動搜索以確保能夠檢測到所有的CD ROMs 包括了Window NT 4.0驅動程序 不必改變主板的設置

5、問:什麼是SDRAM?
答: SDRAM代表同步動態隨機存取內存。由於所有地址、數據和控制系統都是同步的,或者說是被控制在一個單個的系統時鐘下,SDRAM可以提高到主內存的帶 寬。所有的操作都和系統時鐘同步,這樣系統等待的狀態就被消除。SDRAM簡化了設計和內存-系統控制,它大大減少了安裝和運行的時間。

6、問:DRAM和SDRAM有何不同?
答: DRAM: 沒有系統時鐘 水平行地址選通控制One-bank 運行 SDRAM: 以系統時鐘運行 脈衝行地址選通控制 爲單一芯片交錯的兩個觸排可編程讀延遲 問: SDRAM的優點是什麼? 答: SDRAM技術使設計者能夠解決帶寬限制,並且提供給他們許多優點: 1.使用現存的設備技術,符合JEDEC標準 2.能夠支持速度在100MHz的外部總線頻率,並且在將來外部總線頻率超過100MHz時,可提供一種升級的途徑 3.爲主內存提供一種單一的,有效的設計,合併了內存系統 4.提供了一種非專有途徑來適應高速外部總線頻率帶寬需要 5.控制芯片組的設計被簡化,因爲它是基於機器運行狀態而取代了以前的水平/脈衝寬度驅動

7、問:什麼是ATX?
答:ATX是對Baby-AT主板結構的發展,是今天佔主要地位的主板結構。它的特徵有以下幾點:易於使用: о 擴展插槽增多 о 重新安置的CPU使得電路的電容量利用率更高、電壓更利於管理 о 減小了電路板佈線的複雜度增強了對將來的I/O發展趨勢的適應性: о 在統一的緩衝結構中使用了完整的算法 о 支持將來的連接和I/O標準,諸如USB、TV綜合業務服務網的輸 入/輸出等等 減少了整個系統的消耗 о 冷卻系統由單個風扇承擔,而且噪音減少了

8、問:ATX規格有哪些需求?
答:它有以下幾點需求: 對主板結構的限制 о 可調節的雙層高度的I/O。外圍設備的高度限制在3.5”和5.25”о 主板面積爲12'×13' 對電源供應的限制 о 基於PS/2標準。只用一個電源就可以把±5V、±12V、3.3V和遙控電源信號合爲一體о 把連向主板的線路統一固化到一個20針的接口上 о 重新放置的風扇使得風可以吹向CPU 全新的主板設計 о PCB的面積是12'×9.6',與Baby-AT結構完全不同

9、問:ATX 2.0是什麼?它與ATX 1.0有那些不同?
答:在1996年十一月,Intel公司發佈了最新的ATX 2.0結構規格說明:它與 ATX 1.0的主要不同有: A . 對主板上的組件高度有了限制 主板上擴展槽組件的最大高度範圍爲0.6”(大約1.5cm)。驅動器隔板爲0.35”、1.2”和1.5”。PSU爲2.8”。之所以規定了這些限制,是爲了方便Intel公司的Pentium II處理器。 B . 改變了托架的位置 托架的位置稍有改變。因此,系統集成商應該注意這種改變對ATX結構的最佳M/B匹配。 C . 具有了I/O後面板和I/O外殼 ATX 2.0具有獨特的底座接口,而I/O後面板外殼的設計並非獨特。代而替之的是Intel公司推薦的CIS(Chassis Independent Shields)。系統集成商應該通過底座製造商、主板製造商或其他單位來得到他們最好的解決方案。   

二、微軟的解釋
Ultra DMA(也稱作 Ultra DMA/33 或ATA/33)是對 ATA 硬盤接口的擴展,Ultra DMA就是並口的,也就是IDE口,它從理論上允許以每秒 33.3 MB 的突發速率傳輸數據。 這是 ATA-2/ATA-3 標準(每秒 16.6 MB)的兩倍。 與 ATA-2/ATA-3 標準相比,使用 Ultra DMA 會有 40% 的性能提高。
也就是從Ultra DMA/33開始

3。進程通信的幾種辦法

IPC:信號量,鎖,共享內存,消息隊列,管道;

 進程間通信機制允許任意進程同步交換數據,其通信方式通常有無名管道、有名管道、軟中斷信號、共享存儲區幾種形式. 前3 種通信方式對於該系統來說都存在不足:無名管道的缺點是相互無關的進程不能通過無名管道通信;有名管道則不能多路複用,無法爲多對通信的進程提供私有的通 道;而軟中斷信號,雖然任意進程間可以通過系統調用kill 發送軟中斷信號來通信,但所傳遞的消息只有軟中斷信號的序號,信息量較少. 使用共享存儲區,則進程能夠通過共享它們虛地址空間的若干部分,對存儲在其中的數據進行讀寫,進而實現彼此的直接通信.

共享存儲區的操作:
  操作共享存儲區的系統調用有:SHMGET 可建立一個新的共享存儲區或返回已存在的一個共享存儲區;SHMAT可從邏輯上將一個共享存儲區附接到一個進程的虛地址空間上;SHMDT 可從一個進程的虛地址空間斷接一個共享存儲區;SHMCTL 可對與共享存儲區相關聯的各種參數進行操縱. 進程使用與讀寫普通存儲器一樣的機器指令來讀寫共享存儲區,所以,在附接了共享存儲區以後,該共享存儲區就變成了進程虛地址空間的一部分,進程就能以存取 其他虛地址一樣的方法存取它,而不需要系統調用來存取共享存儲區中的數據. 具體的使用方法如下面的程序段:


# include < sys/ ipc. h >
# include < sys/ shm. h >
# include < sys/ unistd. h >
# include < sys/ signal . h >
# define SHMKEY 25
# define K  1024
in shmid ;
...
void communicate (  )
{
int I ,
3
point ;
int
3
addr ,
3
addr1 ;   / / 定義共享存儲區的指針
extern cleanup (  ) ;
⋯⋯
shmid = shmget (SHMKEY,2
3
K,0777| IPC CREAT) ;   / / 建立一個2 KB 的共享存儲區
addr = shmat (shmid ,0 ,0) ;   / / 附接到共享存儲區的地址
}

注:在Unix中實現 。

 

 

4。中斷程序的特徵

 

5。char a[]={2,3,4,5,6};  int b;

   b = *(char *) ((int *)a+1);  輸出b =6

 

6.林銳那本書的4道內存題目,

void GetMemory(char *p)

{

p = (char *)malloc(100);

}

void Test(void)

{

char *str = NULL;

GetMemory(str);  

strcpy(str, "hello world");

printf(str);

}

 

請問運行Test函數會有什麼樣的結果?

答:程序崩潰。

因爲GetMemory並不能傳遞動態內存,

Test函數中的 str一直都是 NULL。

strcpy(str, "hello world");將使程序崩潰。

 

char *GetMemory(void)

{  

char p[] = "hello world";

return p;

}

void Test(void)

{

char *str = NULL;

str = GetMemory();   

printf(str);

}

 

請問運行Test函數會有什麼樣的結果?

答:可能是亂碼。

因爲GetMemory返回的是指向“棧內存”的指針,該指針的地址不是 NULL,但其原現的內容已經被清除,新內容不可知。

void GetMemory2(char **p, int num)

{

*p = (char *)malloc(num);

}

void Test(void)

{

char *str = NULL;

GetMemory(&str, 100);

strcpy(str, "hello");  

printf(str);   

}

請問運行Test函數會有什麼樣的結果?

答:

(1)能夠輸出hello

(2)內存泄漏

 

 

void Test(void)

{

char *str = (char *) malloc(100);

    strcpy(str, “hello”);

    free(str);     

    if(str != NULL)

    {

      strcpy(str, “world”);

printf(str);

}

}

請問運行Test函數會有什麼樣的結果?

答:篡改動態內存區的內容,後果難以預料,非常危險。

因爲free(str);之後,str成爲野指針,

if(str != NULL)語句不起作用。

 

 

 

7。下列哪個掉電後可讀取變量認爲是正確的。選擇題,應該是eeprom,你自己查查

8。虛擬內存的作用

進程地址空間的獨立性,擴大線性空間的連續行;

 

9。int a=5;int i = 6;a =(--i)*(i++);則i = 6 ,a = 25

10,提高讀取數據速度的方法,選擇題,好像和虛擬內存有關

DMA方式:預讀取;

 

11,pv操作,修改代碼的錯誤,這題我不會,你自己看看相關的知識

1962年,狄克斯特拉離開數學中心進入位於荷蘭南部的艾恩德霍芬技術大學(Eindhoven Technical University)任數學教授。在這裏,他參加了X8計算機的開發,設計與實現了具有多道程序運行能力的操作系統——THE Multiprogramming SystemTHE是艾恩德霍芬技術大學的荷蘭文Tchnische Hoogeschool Eindhov –en的詞頭縮寫。狄克斯特拉在THE這個系統中所提出的一系統方法和技術奠定了計算機現代操作系統的基礎,尤其是關於多層體系結構,順序進程之間的同步和互斥機制這樣一些重要的思想和概念都是狄克斯特拉在THE中首先提出併爲以後的操作系統如UNIX等所採用的。爲了在單處理機的情況下確定進程(process)能否佔有處理機,狄克斯特拉將每個進程分爲就緒”(ready)運行”(running)阻塞”(blocking)三個工作狀態。由於在任一時刻最多隻有一個進程可以使用處理機,正佔用着處理機的進程稱爲運行進程。當某進程已具備了使用處理機的條件,而當前又沒有處理機供其使用,則使該進程處於就緒狀態。當運行進程由於某種原因無法繼續運行下去時,就停止其佔用處理機,使之進入阻塞狀態,待造成其退出運行的條件解除,再進入就緒狀態。而對系統中所有同時運行的進程,在一個進程訪問共享數據時,另一個進程不訪問該數據)和互斥(mutually- exclusive,指兩個進程不能同時在一個臨界區中使用同一個可重複使用的資源,諸如讀寫緩衝區)兩個關係,狄克斯特拉巧妙地利用火車運行控制系統中信號燈”(semaphore,或叫信號量”)概念加以解決。所謂信號燈,實際上就是用來控制進程狀態的一個代表某一資源的存儲單元。例如,P1 P2是分別將數據送入緩衝B和從緩衝B讀出數據的兩個進程,爲了防止這兩個進程併發時產生錯誤,狄克斯特拉設計了一種同步機制叫“PV操作P操作和V操作是執行時不被打斷的兩個操作系統原語。執行P操作PS)時信號量S的值減1,若結果不爲負則PS)執行完畢,否則執行P操作的進程暫停以等待釋放。執行V操作VS)時,S的值加1,若結果不大於0則釋放一個因執行PS)而等待的進程。對P1P2可定義兩個信號量S1S2,初值分別爲1 0。進程P1在向緩衝B送入數據前執行P操作PS1),在送入數據後執行V操作VS2)。進程P2在從緩衝B讀取數據前先執行P操作PS2),在讀出數據後執行V操作VS1)。當P1往緩衝B送入一數據後信號量S1之值變爲0,在該數據讀出後S1之值才又變爲1,因此在前一數未讀出前後一數不會送入,從而保證了P1P2之間的同步。我國讀者常常不明白這一同步機制爲什麼叫PV操作,原來這是狄克斯特拉用荷蘭文定義的,因爲在荷蘭文中,通過叫 passeren,釋放叫vrijgevenPV操作因此得名。這是在計算機術語中不是用英語表達的極少數的例子之一。

12,以下協議在手機的分層結構中,分別在哪層?只記得幾個簡單的協議,具體我也不會

      pop3,ppp,icmp,ip,udp,tcp,arp,  你查查這些吧,我不懂。

應用層:pop3,ppp

網絡層:icmp,ip,udp,tcp

arp三層

 

Pop3,ppp
Icmp,tcp,udp
Ip
Arp

 

13,程序員可見的buffer,我不知道,你查查吧

        GUI-Framebuffer,
//文件系統的高速緩存;
發佈了7 篇原創文章 · 獲贊 7 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章