GNU CC是GNU項目中符合ANSI C標準的編譯系統(tǒng),能夠編譯用C、C++和Object C等語言編寫的程序。gcc不僅功能強大,而且可以編譯如C、C++、Object C、Java、Fortran、Pascal、Modula-3和Ada等多種語言,而且gcc是一個交叉平臺編譯器。
調(diào)試是所有程序員都會面臨的問題。如何提高程序員的調(diào)試效率,更好、更快地定位程序中的問題從而加快程序開發(fā)的進度,是大家都很關(guān)注的問題。就如讀者熟知的Windows下的一些調(diào)試工具,如Visual Studio自帶的設(shè)置斷點、單步跟蹤等,都受到了廣大用戶的贊賞。
到此為止,讀者已經(jīng)了解了如何在Linux下使用編輯器編寫代碼,如何使用gcc把代碼編譯成可執(zhí)行文件,還學(xué)習(xí)了如何使用gdb來調(diào)試程序,那么,所有的工作看似已經(jīng)完成了,為什么還需要make這個工程管理器呢?
在上一小節(jié),讀者已經(jīng)了解到了make項目管理器的強大功能。的確,makefile可以幫助make完成它的使命,但要承認的是,編寫makefile確實不是一件輕松的事,尤其對于一個較大的項目而言更是如此。那么,有沒有一種輕松的手段生成makefile而同時又能讓用戶享受make的優(yōu)越性呢?
尼葛洛龐帝2001年訪華時的預(yù)言“4~5年后,嵌入式智能電腦將是繼PC和Internet后的最偉大發(fā)明!”。如今,嵌入式系統(tǒng)已成為當(dāng)今最為熱門的領(lǐng)域之一,它迅猛的發(fā)展勢頭引起了社會各界人士的關(guān)注。如家用電器、手持通信設(shè)備、信息終端、儀器儀表、汽車、航天航空、軍事裝備、制造工業(yè)、過程控制等。今天,嵌入式系統(tǒng)帶來的工業(yè)年產(chǎn)值已超過1萬億美元。
通過指定指令的vi操作練習(xí),使讀者能夠熟練使用vi中的常見操作,并且熟悉vi的3種模式,如果讀者能夠熟練掌握實驗內(nèi)容中所要求的內(nèi)容,則表明對vi的操作已經(jīng)很熟練了。
由嵌入式系統(tǒng)本身的特性所影響,嵌入式系統(tǒng)開發(fā)與通用系統(tǒng)的開發(fā)有很大的區(qū)別。嵌入式系統(tǒng)的開發(fā)主要分為系統(tǒng)總體開發(fā)、嵌入式硬件開發(fā)和嵌入式軟件開發(fā)3大部分,其總體流程圖如圖4.15所示。
通過使用JTAG燒寫Flash的實驗,了解嵌入式硬件環(huán)境,熟悉JTAG的使用,為今后的進一步學(xué)習(xí)打下良好的基礎(chǔ)。本書以優(yōu)龍的FS2410及Flash燒寫工具為例進行講解,不同廠商的開發(fā)板都會提供相應(yīng)的Flash燒寫工具,并有相應(yīng)的說明文檔,請讀者在了解基本原理之后查閱相關(guān)手冊。
本章講解了嵌入式中的基本概念,包括嵌入式系統(tǒng)的含義、發(fā)展歷史、特點以及其體系結(jié)構(gòu)。在這里,重點要掌握嵌入式系統(tǒng)和通用計算機的區(qū)別以加深對嵌入式系統(tǒng)的理解。
本章是Linux中進行C語言編程的基礎(chǔ),首先講解了C語言編程的關(guān)鍵點,這里關(guān)鍵要了解編輯器、編譯鏈接器、調(diào)試器及項目管理工具等概念。
簡單地說,Bootloader就是在操作系統(tǒng)內(nèi)核運行之前運行的一段程序,它類似于PC機中的BIOS程序。通過這段程序,可以完成硬件設(shè)備的初始化,并建立內(nèi)存空間的映射關(guān)系,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),為最終加載系統(tǒng)內(nèi)核做好準備。
串口是計算機一種常用的接口,常用的串口有RS-232-C接口。它是于1970年由美國電子工業(yè)協(xié)會(EIA)聯(lián)合貝爾系統(tǒng)、調(diào)制解調(diào)器廠家及計算機終端生產(chǎn)廠家共同制定的用于串行通信的標準,它的全稱是“數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)通信設(shè)備(DCE)之間串行二進制數(shù)據(jù)交換接口技術(shù)標準”。
在Linux中對目錄和設(shè)備的操作都等同于文件的操作,因此,大大簡化了系統(tǒng)對不同設(shè)備的處理,提高了效率。Linux中的文件主要分為4種:普通文件、目錄文件、鏈接文件和設(shè)備文件。
本章前面幾節(jié)所述的文件及I/O讀寫都是基于文件描述符的。這些都是基本的I/O控制,是不帶緩存的。而本節(jié)所要討論的I/O操作都是基于流緩沖的,它是符合ANSI C的標準I/O處理,這里有很多函數(shù)讀者已經(jīng)非常熟悉了(如printf()、scantf()函數(shù)等),因此本節(jié)中僅簡要介紹最主要的函數(shù)。
通過編寫文件讀寫及上鎖的程序,進一步熟悉Linux中文件I/O相關(guān)的應(yīng)用開發(fā),并且熟練掌握open()、read()、write()、fcntl()等函數(shù)的使用。
本書在第2章中介紹“ps”的命令時提到過管道,當(dāng)時指出了管道是Linux中一種很重要的通信方式,它是把一個程序的輸出直接連接到另一個程序的輸入,這里仍以第2章中的“ps –ef | grep ntp”為例,描述管道的通信過程,如圖8.2所示
本章首先講解了系統(tǒng)調(diào)用(System Call)、用戶函數(shù)接口(API)和系統(tǒng)命令之間的聯(lián)系和區(qū)別,這也是貫穿本書的一條主線,本書就是按照系統(tǒng)命令、用戶函數(shù)接口(API)系統(tǒng)調(diào)用的順序逐層深入講解,希望讀者能有一個較為深刻的認識。
進程的概念首先是在20世紀60年代初期由MIT的Multics系統(tǒng)和IBM的TSS/360系統(tǒng)引入的。在40多年的發(fā)展中,人們對進程有過各種各樣的定義?,F(xiàn)列舉較為著名的幾種。
在Linux中創(chuàng)建一個新進程的惟一方法是使用fork()函數(shù)。fork()函數(shù)是Linux中一個非常重要的函數(shù),和讀者以往遇到的函數(shù)有一些區(qū)別,因為它看起來執(zhí)行一次卻返回兩個值。難道一個函數(shù)真的能返回兩個值嗎?希望讀者能認真地學(xué)習(xí)這一部分的內(nèi)容。
守護進程,也就是通常所說的Daemon進程,是Linux中的后臺服務(wù)進程。它是一個生存期較長的進程,通常獨立于控制終端并且周期性地執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。守護進程常常在系統(tǒng)引導(dǎo)載入時啟動,在系統(tǒng)關(guān)閉時終止。