版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
附錄練習題及解答一、編程類:1.寫一個“標準”宏MIN,這個宏輸入兩個參數(shù)并返回較小的一個。#defineMIN(A,B)((A)<=(B)?(A):(B))這個測試是為下面的目的而設的:(1)標識#define在宏中應用的基本知識。這是很重要的,因為直到嵌入(inline)操作符變?yōu)闃藴蔆的一部分,宏是方便產生嵌入代碼的唯一方法,對于嵌入式系統(tǒng)來說,為了能達到要求的性能,嵌入代碼經(jīng)常是必須的方法。(2)三重條件操作符的知識。這個操作符存在C語言中的原因是它使得編譯器能產生比if-then-else更優(yōu)化的代碼。(3)懂得在宏中小心地把參數(shù)用括號括起來.預處理器標識#eiror的目的是什么?#error是C/C++語言預處理命令之一,當預處理器預處理到#error命令時,將停止編譯并輸出用戶自定義的錯誤消息。其中如果是C語言編輯器則執(zhí)行#error命令,如果是C++命令則跳過該命令。用來主動的檢測不合規(guī)范的情況并提示報錯。terror停止編譯并顯示錯誤信息例如,使用C編譯器:ttifndef_cplusplusterrorttendifttinclude<stdio.h>intmain(){printf("Hello,World!〃);return0;).內核有很多do……while(O);有何作用?do……while(O)用于避免在C中宏定義被展開時導致出錯的問題。例如:ttdefineexch(x,y){inttmp;tmp=x;x=y;y=tmp;}if(x>y)Exch(x,y);elsedo_something();展開:if(x>y){在Linux機器上,CPU要么處于受信任的內核模式,要么處于受限制的用戶模式。除了內核本身處于內核模式以外,所有的用戶進程都運行在用戶模式之中。內核模式的代碼可以無限制地訪問所有處理器指令集以及全部內存和10空間。如果用戶模式的進程要享有此特權,它必須通過系統(tǒng)調用向設備驅動程序或其他內核模式的代碼發(fā)出請求。另外,用戶模式的代碼允許發(fā)生缺頁,而內核模式的代碼則不允許。在2.4和更早的內核中,僅僅用戶模式的進程可以被上下文切換出局,由其他進程搶占。除非發(fā)生以下兩種情況,否則內核模式代碼可以一直獨占CPU:⑴它自愿放棄CPU;(2)發(fā)生中斷或異常。2.6內核引入了內核搶占,大多數(shù)內核模式的代碼也可以被搶占。15.怎樣申請大塊內核內存?在Linux內核環(huán)境下,申請大塊內存的成功率隨著系統(tǒng)運行時間的增加而減少,雖然可以通過vmalloc系列調用申請物理不連續(xù)但虛擬地址連續(xù)的內存,但畢竟其使用效率不高且在32位系統(tǒng)上vmalloc的內存地址空間有限。所以,一般的建議是在系統(tǒng)啟動階段申請大塊內存,但是其成功的概率也只是比較高而已,而不是100虬如果程序真的比較在意這個申請的成功與否,只能退用“啟動內存"(BootMemoi^y)。下面就是申請并導出啟動內存的一段示例代碼:void*xbootmeni=NULL;EXPORT_SYMBOL(x_bootmem);unsignedlongx_bootmeni_size=0;EXPORTSYMBOL(xbootmemsize);staticint_initx_bootmem_setup(char*str)(x_bootmem_size=memparse(str,&str);x_bootmem=alloc_bootmem(x_bootmem_size);printk(''Reserved%lubytesfrom%pforx\n〃,x_bootmem_size,x_bootmem);return1;)_setup('x-bootmem=〃,x_bootmem_setup);可見其應用還是比較簡單的,不過利弊總是共生的,它不可避免也有其自身的限制:內存申請代碼只能連接進內核,不能在模塊中使用。被申請的內存不會被頁分配器和slab分配器所使用和統(tǒng)計,也就是說它處于系統(tǒng)的可見內存之外,即使在將來的某個地方你釋放了它。一般用戶只會申請一大塊內存,如果需要在其上實現(xiàn)復雜的內存管理則需耍自己實現(xiàn)。在不允許內存分配失敗的場合,通過啟動內存預留內存空間將是我們唯一的選擇。五、驅動類:.驅動中異步通知是基于信號實現(xiàn)的。.misc類型主設備號是10;input類型的主設備號是13o.輸入子系統(tǒng)是由輸入子系統(tǒng)設備驅動層、輸入子系統(tǒng)核心層和輸入子系統(tǒng)事件處理層組成。.觸摸屏驅動中兩個重要的中斷是按下,彈起中斷和AD轉換完畢之后產生的中斷。.簡述字符設備與塊設備的區(qū)別:參考答案:(1)塊設備只能以塊為單位接受輸入和返回輸出,而字符設備則以字節(jié)為單位。大多數(shù)設備是字符設備,因為它們不需要緩沖而且不以固定塊大小進行操作。(2)塊設備對于10請求有對應的緩沖區(qū),因此它們可以選擇以什么順序進行響應,字符設備無需緩沖且被直接讀寫。對于存儲設備而言調整讀寫的順序作用巨大,因為在讀寫連續(xù)的扇區(qū)比分離的扇區(qū)更快。(3)字符設備只能被順序讀寫,而塊設備可以隨機訪問。雖然塊設備可隨機訪問,但是對于磁盤這類機械設備而言,順序地組織塊設備的訪問可以提高性能。注意,對SD卡、RAMDISK等塊設備而言,不存在機械上的原因,進行這樣的調整沒有必要。(4)塊設備不同與字符設備的一個明顯特征就是:塊設備可以被掛載到文件系統(tǒng)上。Mount-tvfat/dev/hda6/mnt/hda.6將一個硬盤分區(qū)hda6掛載到文件系統(tǒng)/mnt/hda6節(jié)點上。.描述一個硬件中斷信號發(fā)生,到為其注冊的中斷服務例程開始執(zhí)行,之間所經(jīng)過的內核處理過程。并進一步分析,制約linux中斷響應時間的因素存在于哪些方面。參考答案:當一個硬件中斷產生時,CPU從相應的硬件中獲取中斷號,然后再根據(jù)中斷號再中斷向量表中查找相應的中斷服務程序入口,在調用中斷服務程序之前開辟現(xiàn)場區(qū),并將現(xiàn)場區(qū)組織成“棧”結構,保持現(xiàn)場,進入中斷服務程序進行處理,在退出時恢復所保存的現(xiàn)場。影響中斷響應時間的因素有:(1)中斷屏蔽如果該中斷被屏蔽操作,則需要進行等待影響響應時間。(2)錯誤使用了快速中斷模式快速中斷由于優(yōu)先級比較高而且需要在關中斷的條件執(zhí)行,后來的中斷會因此而等待或者被搶占影響響應時間。(3)其他先前處理過的中斷對于中斷共享,內核在處理中斷的時候會依次執(zhí)行注冊在該IRQ上的中斷處理程序。.在大家相關于串口的工作中,可能會遇到這樣的問題:串口在發(fā)送數(shù)據(jù)時,不是連續(xù)且迅速地發(fā)送,而是以一個固定的節(jié)拍(10秒),且每次只發(fā)送等長度的一段數(shù)據(jù),請列舉可能造成這一問題的所有原因;參考答案:可能情況有:(1)串口屬于低速設備,優(yōu)先級比較低,如果有其他高優(yōu)先級搶占串口數(shù)據(jù)得不到及時處理。(2)在多線程編程中如果一個現(xiàn)成占用了絕大部分CPU資源,沒有及時釋放CPU資源。.設計并實現(xiàn)一個軟件watchdog設備,以監(jiān)視系統(tǒng)運行情況。說明:watchdog設備用于監(jiān)測系統(tǒng)運行狀態(tài),正常運行的系統(tǒng)定期寫watchdog以使其不會超時,一旦超時,意味系統(tǒng)已掛起;watchdog應該重啟系統(tǒng).現(xiàn)在的軟件watchdog不重啟系統(tǒng),只用于監(jiān)視應用程序的運行.參考答案:可以使用守護進程不斷檢測應用程序,發(fā)現(xiàn)應用程序退出即重啟應用程序。自動腳本如下:while[1]dopgrep“程序名”test$?-eq1&&echo”程序名isdown,restartit!”&&執(zhí)行“程序名”sleep5done.簡述12c的基本操作方法:參考答案:I2C主機基本操作方法:設置12c管腳連接;設置12c時鐘速率(I2SCLH.I2SCLL);設置為主機,并發(fā)送起始信號(I2C0NSET的I2EN、STA位為1,AA位為0);發(fā)送從機地址(I2DAT),控制I2C0NSET發(fā)送;判斷總線狀態(tài)(I2STAT),進行數(shù)據(jù)傳輸控制;發(fā)送結束信號(I2C0NSET)oI2C從機基本操作方法:設置12c管腳連接;設置自身的從機地址(I2ADR);使能12c(I2C0NSET的I2EN、AA位為1);判斷SI位或等待12c中斷,等待主機操作;判斷總線狀態(tài)I2STAT,進行數(shù)據(jù)傳輸控制。.簡述insmod和modprobe用法區(qū)別。參考答案:insmdo加載需要寫明路徑并輸入驅動全名,包括后綴。如insmodXXX.koo在加載時有先后順序要求,及加載的模塊中使用的外部符號必須在內核中已經(jīng)存在,否則加載不成功。相對應的卸載是rmmodXXXmodprobe加載時不需要輸入路徑,也不需要輸入后綴。如modprobeXXX。在加載時modprobe會按照/lib/modules/version/下的moudles.dep文件描述進行依賴關系判斷,并將本模塊需要依賴的其他模塊檢測,如果被依賴模塊不存在內核中,即先加載依賴模塊C最終調用insmod加載本模塊自身。與之相對應的模塊卸載是modprobe-rXXXo.為什么要使用copy_from_user和copy_to_user。參考答案:當用一個指針指向用戶空間時;必須確保指向的用戶空間是合法的。對未驗證用戶空間指針的訪問,可能導致oops、系統(tǒng)崩潰或者安全問題。使用copy_from_user和copy_to_user函數(shù)可安全的與用戶空間交換數(shù)據(jù)。.中斷上下文和進程上下文的本質區(qū)別是什么?為什么中斷中不能有睡眠?參考答案:進程中有一個堆棧指針current指向進程task_struct,而中斷上下文不屬于某個進程.current指針游離不再有意義,所以不能進行任何形式的進程切換.也即不能使得調度起介入.所以睡眠是不允許的。所以中斷中是不能有睡眠的。.簡述自旋鎖和信號量選用的3項原則。參考答案:(1)判斷進程切換時間Tsw,和等待獲取自旋鎖(由臨界區(qū)執(zhí)行時間決定)Tcs。如果若Tcs比較小,應使用自旋鎖,若Tcs很大,應使用信號量。(2)信號量所保護的臨界區(qū)可包含可能引起阻塞的代碼,而自旋鎖則絕對要避免用來保護包含這樣代碼的臨界區(qū)。因為阻塞意味著要進行進程的切換,如果進程被切換出去后,另一個進程企圖獲取本自旋鎖,死鎖就會發(fā)生(3)信號量存在于進程上下文,因此,如果被保護的共享資源需要在中斷或軟中斷情況下使用,則在信號量和自旋鎖之間只能選擇自旋鎖。當然,如果一定要使用信號量,則只能通過down_讓ylockO方式進行,不能獲取就立即返回以避免阻塞。.簡述Platform總線的優(yōu)點。參考答案:(1)使得設備被掛接在一個總線上,因此,符合Linux2.6的設備模型。其結果是,配套的sysfs節(jié)點、設備電源管理都成為可能;platform機制將設備本身的資源注冊進內核,由內核統(tǒng)一管理,在驅動程序中使用這些資源時通過platformdevice提供的標準接口進行申請并使用。(3)隔離BSP和驅動。在BSP中定義platform設備和設備使用的資源、設備的具體配置信息,而在驅動中,只需要通過通用的API去獲取資源和數(shù)據(jù),做到了板相關代碼和驅動代碼的分離,使得驅動具有更好的可擴展性和跨平臺性。.簡述PWM基本操作方法。參考答案:(1)連接PWM功能管腳輸出,即設置PINSELO、PINSEL1;(2)設置PWM定時器的時鐘分頻值(PWMPR),得到所要的定時器時鐘;(3)設置比較匹配控制(PWMMCR),并設置相應比較值(PWMMRx);(4)設置PWM輸出方式并允許PWM輸出(PWMPCR)及鎖存使能控制(PWMLER);(5)設置PWMTCR,啟動定時器,使能PWM;運行過程中要更改比較值時,更改之后要設置鎖存使能。使用雙邊沿PWM輸出時,建議使用PWM2、PWM4、PWM6;使用單邊PWM輸出時,在PWM周期開始時為高電平,匹配后為低電平,使用PWMMR0作為PWM周期控制,PWMMRx作為占空比控制。.簡述下分成上半部分和下半部分的原因,為何要分?如何實現(xiàn)?參考答案:上半部分執(zhí)行與硬件相關的處理要求快,而有些驅動在中斷處理程序中又需要完成大量工作,這構成矛盾,所以Linux有所謂的bottomhalf機制,中斷處理程序中所有不要求立即完成的,在開中斷的環(huán)境下,由底半程序隨后完成.Linux的底半處理實際上是建立在內核的軟中斷機制上的.Linux的底半機制主要有Tasklet和workqueue以及softirq(2.4內核則有BH,Taskqueue,softirq,tasklet沒有workqueue),其實底半可以理解成一種工作的延遲。所以實際使用時跟timer機制基本上一個意思。.內核函數(shù)mmap的實現(xiàn)原理,機制J?參考答案:mmap函數(shù)實現(xiàn)把一個文件映射到一個內存區(qū)域,從而我們可以像讀寫內存一樣讀寫文件,他比單純調用read/write也要快上許多。在某些時候我們可以把內存的內容拷貝到一個文件中實現(xiàn)內存?zhèn)浞?,當然,也可以把文件的內容映射到內存來恢復某些服務。另外,nrniap實現(xiàn)共享內存也是其主要應用之一,mmap系統(tǒng)調用使得進程之間通過映射同一個普通文件實現(xiàn)共享內存。.Cache的工作方式劃分?參考答案:分為write-none,write-all,write-through(寫通cache,執(zhí)行寫操作時同時寫入主存與cache),write-back(寫回cache,執(zhí)行寫操作時不寫入主存,除非需要替換)。.驅動里面為什么要有并發(fā)、互斥的控制?如何實現(xiàn)?參考答案:在驅動程式中,當多個線程同時訪問相同的資源時(驅動程式中的全局變量是一種典型的共享資源),可能會引發(fā)〃競態(tài)〃,因此必須對共享資源進行并發(fā)控制。Linux內核中解決并發(fā)控制的最常用方法是自旋鎖和信號量(絕大多數(shù)時候作為互斥鎖使用)。而互斥是指任何時刻只允許一個進程使用某一共享資源,其他進程等待。實現(xiàn)是利用臨界區(qū)。.spinlock自旋鎖是如何實現(xiàn)的?參考答案:最多只能被一個可執(zhí)行單元持有,不會引起調用者睡眠,它會一直忙循環(huán),如果對應的資源不釋放鎖。實現(xiàn)過程是:spinlockinit(x):初始化自旋鎖xspin_lock(lock):獲取自旋鎖spin_trylock(lock):也是獲取自旋鎖,但不忙等待。spinunlock(lock):釋放自旋鎖。.簡述自旋鎖原理和使用注意事項。參考答案:顧名思義,自旋鎖就是原地打轉,一直忙等待。是一種對臨界資源進行互斥手訪問的典型手段。(1)是一個變量。在獲得一個自旋鎖時CPU運行的代碼需要先執(zhí)行一個原子操作。(2)為忙等待。只有在占用鎖的時間極短的情況下使用自旋鎖才合理。因為忙等待是白白在浪費CPU資源。(3)可能導致死鎖。一個已經(jīng)擁有某個自旋鎖的CPU想第二次獲得這個自旋鎖必將引起死鎖。所以不能聯(lián)系在沒有釋放的情況下獲取同一個自旋鎖。(4)進程獲得自旋鎖后再阻塞,也有可能死鎖。不能用于有阻塞的情況。引起阻塞的函數(shù)有copyfromuser>copytouser和kmalloc等。.分別介紹Linux中消息隊列、等待隊列、工作隊列、請求隊列、發(fā)送隊列和接收隊列分別用在什么場合?參考答案:(I)消息隊列是進程之間的概念,屬于IPC中的內容。(2)等待隊列是夠用于實現(xiàn)內核中的異步事件通知機制,也可以用來同步對系統(tǒng)資源的訪問。是工作隊列、異步、完成量等實現(xiàn)的基礎。(3)工作隊列是中斷中下半部的一種實現(xiàn)方式,是在系統(tǒng)空閑的失控進行調度處理。(4)請求隊列是塊設備中的概念,塊設備驅動就是處理請求隊列。(5)發(fā)送隊列和接收隊列是網(wǎng)絡設備中的概念,數(shù)據(jù)存放在發(fā)送隊列中等待發(fā)送,接收到的數(shù)據(jù)存放在接收隊列中等待讀取。六、網(wǎng)絡類:1.is。的七層模型是什么?tcp/udp是屬于哪一層?tcp/udp有何優(yōu)缺點?參考答案:應用層表示層會話層運輸層網(wǎng)絡層物理鏈路層物理層tcp/udp屬于運輸層TCP服務提供了數(shù)據(jù)流傳輸、可靠性、有效流控制、全雙工操作和多路復用技術等。與TCP不同,UDP并不提供對IP協(xié)議的可靠機制、流控制以及錯誤恢復功能等。由于UDP比較簡單,UDP頭包含很少的字節(jié),比TCP負載消耗少。tcp:提供穩(wěn)定的傳輸服務,有流量控制,缺點是包頭大,冗余性不好udp:不提供穩(wěn)定的服務,包頭小,開銷小。七、嵌入式系統(tǒng)類:.嵌入式設備,為加快啟動速度,可以做哪些方面的優(yōu)化?參考答案:有以下優(yōu)化措施(1)優(yōu)化u-boot,減少u-boot運行時間;(2)減少keiTiel的體積,將不是在啟動階段必須加載的內容驅動模塊化,留在文件系統(tǒng)后面加載。減少kernel運行時間;(3)優(yōu)化或者關閉調試串口的輸出;(4)驅動程序放到文件系統(tǒng)后面加載,加載必要的內容驅動模塊;(5)仔細優(yōu)化kernel和各種驅動程序,將每個部分的延時操作調試到最快;應用程序環(huán)境的優(yōu)化,減少應用程序啟動時間。.什么是BusyBox?參考答案:BusyBox是標準Linux工具的一個單個可執(zhí)行實現(xiàn)。BusyBox包含了一些簡單的工具,例如cat和echo,還包含了一些更大、更復雜的工具,例如grep、find、mount以及telneto有些人將BusyBox稱為Linux工具里的瑞士軍刀.簡單的說BusyBox就好像是個大工具箱,它集成壓縮了Linux的許多工具和命令。.淺談bootloader,kelnel,filesystem三者之間的關系。參考答案:bootloader啟動加載器,相當于pc的bios,完成硬件啟動過程中設備檢測。bootloader啟動完成后,將為Kernel提供運行環(huán)境,kernel用和管理和分配資源,kernel啟動完成后就可以為filesystem等應用程序提供運行環(huán)境。inttmp;tmp=x;x=y;y=tmp;};〃此處多了個分號,使用時會出錯。elsedo_something();ttdefineexch(x,y)do{inttmp;tmp=x;x=y;y=tmp;}while(0)〃最后沒有分號所以宏定義中涉及到函數(shù)的處理,最好使用do…while(O)封裝。.談談Volatile與Register修飾符的作用?volatile是純程序與在硬件上運行的程序的最大區(qū)別,在linux系統(tǒng)中編譯時必須進行優(yōu)化的,加上volatile關鍵詞的變量是讓編譯器不對其優(yōu)化。register是建議編譯器使用寄存器來優(yōu)化對變量的存取。.關鍵字volatile有什么含意并給出三個不同的例子。一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優(yōu)化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個例子:(1)并行設備的硬件寄存器(如:狀態(tài)寄存器)一個中斷服務子程序中會訪問到的非自動變量(Non-automaticvariables)(3)多線程應用中被幾個任務共享的變量回答不出這個問題的人是不會被雇傭的。我認為這是區(qū)分C程序員和嵌入式系統(tǒng)程序員的最基本的問題。嵌入式系統(tǒng)程序員經(jīng)常同硬件、中斷、RTOS等等打交道,所用這些都要求volatile變量。不懂得volatile內容將會帶來災難。.一個參數(shù)既可以是const還可以是volatile嗎?解釋為什么。答案:是的。一個例子是只讀的狀態(tài)寄存器。它是volatile因為它可能被意想不到地改變。它是const因為程序不應該試圖去修改它。.一個指針可以是volatile嗎可以,因為指針和普通變量一樣,有時也有變化程序的不可控性。常見例:子中斷服務子程序修改一個指向一個buffer的指針時,必須用volatile來修飾這個指針。說明:指針是一種普通的變量,從訪問上沒有什么不同于其他變量的特性。其保存的數(shù)值是個整型數(shù)據(jù),和整型變量不同的是,這個整型數(shù)據(jù)指向的是一段內存地址。.下面的函數(shù)有什么錯誤:intsquare(volatileint*ptr)(return*ptr**ptr;)答案:這段代碼的有個惡作劇。這段代碼的目的是用來返指針*ptr指向值的平方,但是,由于*ptr指向一個volatile型參數(shù),編譯器將產生類似下面的代碼:intsquare(volatileint*ptr)inta,b;a=*ptr;b=*ptr;returna*b;)由于*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:longsquare(volatileint*ptr)(inta;a=*ptr;returna*a;).關鍵字static的作用是什么?在C語言中,關鍵字static有三個明顯的作用:(1)在函數(shù)體,一個被聲明為靜態(tài)的變量在這一函數(shù)被調用過程中維持其值不變。(2)在模塊內(但在函數(shù)體外),一個被聲明為靜態(tài)的變量可以被模塊內所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問。它是一個本地的全局變量。(3)在模塊內,一個被聲明為靜態(tài)的函數(shù)只可被這一模塊內的其它函數(shù)調用。那就是,這個函數(shù)被限制在聲明它的模塊的本地范圍內使用。大多數(shù)應試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。這是一個應試者的嚴重的缺點,因為他顯然不懂得本地化數(shù)據(jù)和代碼范圍的好處和重要性。.C語言的關鍵字static和C++的關鍵字static有什么區(qū)別?在C中static用來修飾局部靜態(tài)變量和外部靜態(tài)變量、函數(shù)。而C++中除了上述功能外,還用來定義類的成員變量和函數(shù)。即靜態(tài)成員和靜態(tài)成員函數(shù)。注意:編程時static的記憶性,和全局性的特點可以讓在不同時期調用的函數(shù)進行通信,傳遞信息,而C++的靜態(tài)成員則可以在多個對象實例間進行通信,傳遞信息。.C中的malloc和C++中的new有什么區(qū)別?malloc和new有以下不同:new、delete是操作符,可以重載,只能在C++中使用。malloc>free是函數(shù),可以覆蓋,C、C++中都可以使用。new可以調用對象的構造函數(shù),對應的delete調用相應的析構函數(shù)。malloc僅僅分配內存,free僅僅回收內存,并不執(zhí)行構造和析構函數(shù)new^delete返回的是某種數(shù)據(jù)類型指針,malloc>free返回的是void指針。注意:malloc申請的內存空間要用free釋放,而new申請的內存空間要用delete釋放,不要混用。因為兩者實現(xiàn)的機理不同。.關鍵字const是什么含意及作用?const意味著“只讀二(1)關鍵字const告訴了用戶這個參數(shù)的應用目的。(2)通過給優(yōu)化器一些附加的信息,使用關鍵字const也許能產生更緊湊的代碼。(3)合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的參數(shù),防止其被無意的代碼修改。.下面的聲明都是什么意思?constinta;intconsta;constint*a;int*consta;intconst*aconst;答案:前兩個的作用是一樣,a是一個常整型數(shù)。第三個意味著a是一個指向常整型數(shù)的指針(也就是,整型數(shù)是不可修改的,但指針可以)。第四個意思a是一個指向整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。最后一個意味著a是一個指向常整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是不可修改的,同時指針也是不可修改的)。.Typedef在C語言中頻繁用以聲明一個已經(jīng)存在的數(shù)據(jù)類型的同義字。也可以用預處理器做類似的事。例如,思考一下下面的例子:#definedPSstructs*typedefstructs*tPS;以上兩種情況的意圖都是要定義dPS和tPS作為一個指向結構s指針。哪種方法更好呢?(如果有的話)為什么?答案:typedef更好。例如:dPSpl,p2;tPSp3,p4;第一個擴展為structs*pl,p2;上面的代碼定義pl為一個指向結構的指,p2為一個實際的結構。第二個例子正確地定義了p3和p4兩個指針。.變量的聲明和定義有什么區(qū)別?為變量分配地址和存儲空間的稱為定義,不分配地址的稱為聲明。一個變量可以在多個地方聲明,但是只在一個地方定義。加入extern修飾的是變量的聲明,說明此變量將在文件以外或在文件后面部分定義。說明:很多時候一個變量,只是聲明不分配內存空間,直到具體使用時才初始化,分配內存空間,如外部變量。.寫出bool、int、float、指針變量與“零值”比較的if語句。bool型數(shù)據(jù):if(flag){A;}else{B;}int型數(shù)據(jù):if(0!=flag){A;}else{B;}指針型數(shù):if(NULL==flag){A;}else{B;}float型數(shù)據(jù):if((flag>=NORM)&&(flag<=NORM)){A;}else{B;}注意:應特別注意在int、指針型變量和“零值”比較的時候,把“零值”放在左邊,這樣當把—誤寫成時,編譯器可以報錯,否則這種邏輯錯誤不容易發(fā)現(xiàn),并且可能導致很嚴重的后果。.sizeof和strlen有什么區(qū)別?sizeof和strlen有以下區(qū)別:sizeof是一個操作符,strlen是庫函數(shù)。sizeof的參數(shù)可以是數(shù)據(jù)的類型,也可以是變量,而strlen只能以結尾為、(T的字符串作參數(shù)。編譯器在編譯時就計算出了sizeof的結果。而strlen函數(shù)必須在運行時才能計算出來。并且sizeof計算的是數(shù)據(jù)類型占內存的大小,而strlen計算的是字符串實際的長度。數(shù)組做sizeof的參數(shù)不退化,傳遞給strlen就退化為指針了。注意:有些是操作符看起來像是函數(shù),而有些函數(shù)名看起來又像操作符,這類容易混淆的名稱一定要加以區(qū)分,否則遇到數(shù)組名這類特殊數(shù)據(jù)類型作參數(shù)時就很容易出錯。最容易混淆為函數(shù)的操作符就是sizeofo.簡述C、C++程序編譯的內存分配情況。C、C++中內存分配方式可以分為三種:(1)從靜態(tài)存儲區(qū)域分配:內存在程序編譯時就已經(jīng)分配好,這塊內存在程序的整個運行期間都存在。速度快、不容易出錯,因為有系統(tǒng)會善后。例如全局變量,static變量等。(2)在棧上分配:在執(zhí)行函數(shù)時,函數(shù)內局部變量的存儲單元都在棧上創(chuàng)建,函數(shù)執(zhí)行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集中,效率很高,但是分配的內存容量有限。(3)從堆上分配:即動態(tài)內存分配。程序在運行的時候用malloc或new申請任意大小的內存,程序員自己負責在何時用free或delete釋放內存。動態(tài)內存的生存期由程序員決定,使用非常靈活。如果在堆上分配了空間,就有責任回收它,否則運行的程序會出現(xiàn)內存泄漏,另外頻繁地分配和釋放不同大小的堆空間將會產生堆內碎塊。一個C、C++程序編譯時內存分為5大存儲區(qū):堆區(qū)、棧區(qū)、全局區(qū)、文字常量區(qū)、程序代碼區(qū)。.簡述strcpy>sprintf與memcpy的區(qū)別。三者主要有以下不同之處:(1)操作對象不同,strcpy的兩個操作對象均為字符串,sprintf的操作源對象可以是多種數(shù)據(jù)類型,目的操作對象是字符串,memcpy的兩個對象就是兩個任意可操作的內存地址,并不限于何種數(shù)據(jù)類型。(2)執(zhí)行效率不同,memcpy最高,strcpy次之,sprintf的效率最低。(3)實現(xiàn)功能不同,strcpy主要實現(xiàn)字符串變量間的拷貝,sprintf主要實現(xiàn)其他數(shù)據(jù)類型格式到字符串的轉化,memcpy主要是內存塊間的拷貝。說明:strcpy、sprintf與memcpy都可以實現(xiàn)拷貝的功能,但是針對的對象不同,根據(jù)實際需求,來選擇合適的函數(shù)實現(xiàn)拷貝功能。二、ARM類:ARM啟動代碼包括哪些?參考答案:ARM啟動代碼直接面對處理器內核和硬件控制器進行編程,一般使用匯編語言。啟動代碼一般包括:中斷向量表初始化存儲器系統(tǒng)初始化堆棧初始化有特殊要求的端口、設備初始化用戶程序執(zhí)行環(huán)境改變處理器模式呼叫主應用程序簡述ARM處理器對異常中斷的響應過程。參考答案:ARM處理器對異常中斷的響應過程如下所述:保存處理器當前狀態(tài)、中斷屏蔽位以及各條件標志位;設置當前程序狀態(tài)寄存器CPSR中的相應位;將寄存器lr_mode設置成返回地址;將程序計數(shù)器值PC,設置成該異常中斷的中斷向量地址,跳轉到相應異常中斷處執(zhí)行。ARM指令與Thumb指令的區(qū)別是什么?參考答案:在ARM體系結構中,ARM指令集中的指令是32位的指令,其執(zhí)行效率很高。對于存儲系統(tǒng)數(shù)據(jù)總線為16位的應用系統(tǒng),ARM體系提供了Thumb指令集。Thumb指令集是對ARM指令集的一個子集重新編碼得到的,指令長度為16位。通常在處理器執(zhí)行ARM程序時,稱處理器處于ARM狀態(tài);當處理器執(zhí)行Thumb程序時,稱處理器處于Thumb狀態(tài)。Thumb指令集并沒有改變ARM體系地層的程序設計模型,只是在該模型上加上了一些限制條件。Thumb指令集中的數(shù)據(jù)處理指令的操作數(shù)仍然為32位,指令尋址地址也是32位的。ARM程序和Thumb程序混合使用的場合有哪些?參考答案:通常,Thumb程序比ARM程序更加緊湊,而且對于內存為8位或16位的系統(tǒng),使用Thumb程序效率更高。但是,在下面一些場合下,程序必須運行在ARM狀態(tài),這時就需要混合使用ARM和Thumb程序。強調速度的場合,應該使用ARM程序;有些功能只能由ARM程序完成。如:使用或者禁止異常中斷;當處理器進入異常中斷處理程序時,程序狀態(tài)切換到ARM狀態(tài),即在異常中斷處理程序入口的一些指令是ARM指令,然后根據(jù)需要程序可以切換到Thumb狀態(tài),在異常中斷程序返回前,程序再切換到ARM狀態(tài)。ARM處理器總是從ARM狀態(tài)開始執(zhí)行。因而,如果要在調試器中運行Thumb程序,必須為該Thumb程序添加一個ARM程序頭,然后再切換到Thumb狀態(tài),執(zhí)行Thumb程序。三、操作系統(tǒng)類:.死鎖的4個必要條件。答案:互斥、請求保持、不可剝奪、環(huán)路。.死鎖的處理。答案:鴕鳥策略、預防策略、避免策略、檢測與解除死鎖。.IRQ和FIQ有什么區(qū)別,在CPU里面是是怎么做的?參考答案:IRQ和FIQ是ARM處理器的兩種編程模式。IRQ是指中斷模式,F(xiàn)IR是指快速中斷模式。對于FIQ必須盡快處理你的事情并離開這個模式。IRQ可以被FIQ所中斷,但IRQ不能中斷FIQo為了使F1Q更快,所以這種模式有更多的影子寄存器。F1Q不能調用SWI(軟件中斷)。FIQ還必須禁用中斷。如果一個FIQ例程必須重新啟用中斷,則它太慢了,并應該是IRQ而不是FIQo四、Linux類:SpinLock相對于信號量的特點;在UP/MP/SMP這些不同環(huán)境下,SpinLock的不同實現(xiàn)方法。spin」ock()在UP和SMP的不同:UP下:#definespin_lock(x)do{}while(O)#definespin_unlock(x)do{(void)(lock);}while(0)可見,spin」ock(x)和spin_unlock(x)在UP環(huán)境下什么都不做。SMP下:voidspin_lock(spinlock_t*plock)的執(zhí)行過程如下:如果plock->lock=l,說明已被鎖住,則CPU就不能去使用它所保護的資料結構;如果plock->lock=l,說明已被鎖住,則可以從spin」ock()傳回,接下去使用它所保護的資料。自旋鎖主要是針對SMP或單CPU但是內核可搶占的情況,對應單CPU且內核不支持搶占的系統(tǒng)中自旋鎖退化為空操作。spink_lock各個變種的區(qū)別:(1)有些情況下需要在訪問共享資源時必須中斷失效,而訪問完后必須中斷使能,這樣的情形使用spinlockirq和spinunlockirq最好;(2)spin_lock_irqsave保存訪問共享資源前的中斷標志,然后失效中斷;spin_unlock_irqrestore將恢復訪問共享資源前的中斷標志而不是直接使能中斷;(3)如果被保護的共享資源只在進程上下文訪問和軟中斷上下文訪問,那么當在進程上下文訪問共享資源時,可能被軟中斷打斷,從而可能進入軟中斷上下文來對被保護的共享資源訪問,因此對于這種情況,對共享資源的訪問必須使用spin_lock_bh和spinunlockbh來保護。當然使用spinlockirq和spinunlockirq以及spin_lock_irqsave和spin_unlock_irqrestore也可以,它們失效了本地硬中斷,失效硬中斷隱式地也失效了軟中斷。但是使用spin_lock_bh和spin_unlock_bh是最恰當?shù)?,它比其他兩個快。如果被保護的共享資源只在進程上下文和tasklet或timer上下文訪問,那么應該使用與上面情況相同的獲得和釋放鎖的宏,因為tasklet和timer是用軟中斷實現(xiàn)的。(4)對tasklet和timer和互斥操作如果被保護的共享資源只在一個tasklet或timer上下文訪問,那么不需要任何自旋鎖保護,因為同一個tasklet或timer只能在一個CPU上運行,即使是在SMP環(huán)境下也是如此;如果被保護的共享資源只在兩個或多個tasklet或timer上下文訪問,那么對共享資源的訪問僅需要用spin_lock和spin_unlock來保護,不必使用_bh版本,因為當tasklet或timer運行時,不可能有其他tasklet或timer在當前CPU上運行。spin」ock用于阻止在不同CPU上的執(zhí)行單元對共享資源的同時訪問以及不同進程上下文互相搶占導致的對共享資源的非同步訪問,而中斷失效和軟中斷失效卻是為了阻止在同一CPU上軟中斷或中斷對共享資源的非同步訪問.在Linux系統(tǒng)中,以文件方式訪問設備。.Linux內核引導時,從文件/etc/fstab中讀取要加載的文件系統(tǒng)。.Linux文件系統(tǒng)中每個文件用i節(jié)點來標識。.內核分為進程管理系統(tǒng)、內存管理系統(tǒng)、10管理系統(tǒng)和文件管理系統(tǒng)等四個子系統(tǒng)。.Linux文件系統(tǒng)分為磁盤文件系統(tǒng)、網(wǎng)絡文件系統(tǒng)和特殊文件系統(tǒng)三大類。.在Linux系統(tǒng)中所有內容都被
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 焊接銷釘行業(yè)深度研究報告
- 新藥進院申請書
- 2024-2025年中國網(wǎng)絡視頻市場供需預測及投資戰(zhàn)略研究咨詢報告
- 利息低合同范例
- 2025年度環(huán)保型建筑材料研發(fā)合作合同
- 專利權合同范本
- 保險債權轉讓合同范例
- 公寓經(jīng)營餐飲合同范本
- 農民轉賣房屋合同范本
- bot模式運營合同范本
- 鋰硫電池介紹
- (高職)旅游景區(qū)服務與管理電子課件(全套)
- DB50∕T 959-2019 營運高速公路施工管理規(guī)范
- 人教版一年級下學期數(shù)學第5單元試卷《認識人民幣》試題3
- RBA培訓教材系列02RBA商業(yè)道德政策培訓針對員工
- 高中研究性課題-------食品添加劑
- T∕CNFAGS 3-2021 三聚氰胺單位產品消耗限額
- 弟子規(guī)全文拼音版打印版
- 變電站設備驗收管理標準規(guī)范
- 鍋爐房危害告知卡
- NPI流程管理分解
評論
0/150
提交評論