本書首先介紹了GNU gcc的基本組成,分章節(jié)講述了GNU gcc、Debian Linux、makefile、gdb、vi、emacs等開源開發(fā)工具的使用,然后以Atmel公司的兩款頗具代表性的嵌入式芯片,即低端的8位AVR單片機ATmega48和中端的32位ARM芯片AT91SAM7S64為代表,全面講述了GNU gcc在嵌入式開發(fā)中的應用?梢钥吹紾NU gcc在不同硬件下的開發(fā)過程與使用方法的確具有高度的一致性,給學習與使用帶來了很大的方便。書中還特別列舉了非常實用的開源項目USBASP以及usbdrv,使讀者既能對開源軟件的強大功能留下深刻的印象,又能學到實際有用的東西。
本書可作為高等院校計算機、電子、自動化、機電一體化等相關專業(yè)嵌入式系統(tǒng)課程的教學參考書,也可作為從事嵌入式系統(tǒng)應用開發(fā)工程師的參考資料。
筆者從事電子類相關工作近二十年,一直都對此有著深厚的興趣。自學生時代的家電維修開始,到后來從事計算機硬件教學工作這一路走來,從電子硬件電路、單片機應用,到計算機應用程序、驅動程序開發(fā)以及到現(xiàn)在的軟硬一體化的嵌入式系統(tǒng),一步一步地從最底層的電路焊接開始到現(xiàn)在,計算機硬件的多個層次都曾接觸過,較長的專業(yè)生涯使筆者也積累了較多的經(jīng)驗體會。一直以來也有想法,將這些經(jīng)驗集結成冊,為推廣計算機知識盡一點綿薄之力,恰逢北京航空航天大學出版社的邀請,于是決定著手此書的編寫。
做過技術工作的人都有過這樣的經(jīng)歷與體會,大量的時間都是花費在技術資料的閱讀與查找上,很多項目常常因為某個技術資料的缺乏而使項目卡殼,有時甚至影響到項目的順利完成。這一點在技術飛速發(fā)展的IT行業(yè)特別在計算機軟件領域表現(xiàn)更為突出,很多的技術細節(jié)被隱藏在不公開的源代碼中,源碼的不公開往往造成技術發(fā)展的瓶頸,直到20世紀80年代出現(xiàn)了一種全新的開源思想:它認為計算機源代碼應該像文學藝術作品一樣作為人類共同知識財富的一部分,讓每個人都有機會閱讀與學習,而不應該只作為公司或個人的私有財產(chǎn),并為此發(fā)布了一系列的法律文件來保證開源軟件源碼的公開性。開源精神得到了廣大計算機專業(yè)人士及愛好者的大力擁護,包括很多世界著名的大公司在內,行業(yè)內的很多精英都投身到這一偉大的事業(yè)中來,這極大地促進了計算機產(chǎn)業(yè)的發(fā)展。在開源精神的指導下,世界有了全新的操作系統(tǒng)Linux,有了全新的開發(fā)工具gcc,有了全新的文本編輯器emacs等。
開源軟件對于莘莘學子來說更是一個福音,有了開源代碼,他們就能自由地閱讀到世界一流的代碼,學習的資料極大地豐富,所學的技術與知識也能最快地站在世界的前沿;能迅速有效地將所學的理論用上,理論與實踐的距離被迅速拉近,學習變成了探索,變成了一件有趣的活動。開源軟件同時也極大地促進了社會經(jīng)濟的發(fā)展,IT產(chǎn)品漸漸地不再昂貴,很多公司的產(chǎn)品都是來源于開源項目,人類智慧的共同合力得到了充分的體現(xiàn)。開源精神在大家的共同努力下不斷發(fā)展,對世界產(chǎn)生了越來越大的影響。
現(xiàn)在IT產(chǎn)業(yè)已進入了后PC時代,傳統(tǒng)的桌面PC市場已經(jīng)趨于飽和,現(xiàn)階段難以找到新的增長點,但隨著人們更熱衷于快捷方便、能隨身攜帶的IT服務,低功耗的便攜式產(chǎn)品成為了市場的新熱點,也成為廣大廠商與專業(yè)人員追捧的目標,連IT業(yè)巨頭Intel都高調宣布進軍嵌入式領域。開源軟件也順應時代潮流率先進入了嵌入式時代,為廣大開發(fā)者提供了特性高度一致的嵌入式產(chǎn)品,Linux、gcc等開源軟件都能在嵌入式系統(tǒng)中使用,而且目前還是支持硬件最多的開發(fā)工具與平臺,這正適合于嵌入式硬件平臺眾多的特點。
為了能全面描述GNU gcc在嵌入式開發(fā)中的應用,筆者選擇了Atmel出品的兩款頗具代表性的嵌入式芯片,一款為低端的8位AVR單片機ATmega48,另一款為中端的32位ARM芯片AT91SAM7S64。本書對這兩款芯片都講述了使用GNU gcc開發(fā)工具進行開發(fā)的方法與過程,可以看到GNU gcc在不同硬件下的開發(fā)過程與使用方法的確是具有高度的一致性,這給學習與使用帶來了很大的方便。書中還特別列舉了非常實用的開源項目USBASP以及usbdrv,使讀者既能對開源軟件的強大功能留下深刻的印象,又能學習實際有用的東西。
寫書是一項艱苦的工作,為此筆者停下了一些項目的開發(fā)工作,專心寫書。在此過程中得到了家人以及很多朋友、同事的關心與幫助,在此表示衷心的感謝。首先要感謝筆者的妻子和家人,他們的支持讓我能安下心來寫書;特別感謝我的合作伙伴劉賓林,他給了我很多專業(yè)上的幫助;還有這些人員:董振興、鄒遠菊、劉中平、譚蔚蕓、陳雙妹、劉冬麗、伍向陽、劉新宇等,他們都為本書作出了貢獻,這里一并表示感謝。同時衷心感謝北航出版社,使本書得以順利出版。
第1章 GNUgcc概述1
1.1 自由軟件與GNU、GPL1
1.2 gcc的發(fā)展歷史及特點2
1.3 gcc的使用簡介與命令行參數(shù)說明4
1.3.1 gcc的基本用法4
1.3.2 警告提示功能選項7
1.3.3 庫操作選項8
1.3.4 代碼優(yōu)化選項9
1.3.5 調試選項10
1.3.6 交叉編譯選項11
1.3.7 鏈接器參數(shù)選項12
1.3.8 鏈接器描述文件格式12
1.3.9 gcc的錯誤類型及對策15
第2章 適合于嵌入式開發(fā)的平臺Debian17
2.1 Debian概述17
2.2 Debian的安裝18
2.3 Debian基本操作25
2.3.1 桌面環(huán)境25
2.3.2 常用應用程序26
2.3.3 文件系統(tǒng)管理27
2.4 Debian系統(tǒng)維護與軟件的安裝37
2.4.1 apt包管理系統(tǒng)的管理37
2.4.2 軟件包管理與安裝命令38
2.4.3 dpkg底層的包管理工具39
2.4.4 軟件的其他安裝方法41
2.5 版本控制42
2.5.1 cvs概述42
2.5.2 Debian中安裝cvs服務器42
2.5.3 cvs的基本操作46
2.5.4 遠程cvs操作54
2.5.5 cvs使用舉例54
2.5.6 Wincvs的使用56
第3章 makefile文件的編寫66
3.1 概述66
3.2 makefile的基本語法和簡單實例67
3.2.1 基本語法67
3.2.2 make命令行參數(shù)定義67
3.2.3 簡單實例71
3.3 常用命令72
3.3.1 @命令72
3.3.2 命令間的相互關聯(lián)72
3.3.3 忽略命令的錯誤73
3.3.4 條件判斷73
3.3.5 定義命令序列73
3.4 目標與規(guī)則74
3.4.1 偽目標74
3.4.2 靜態(tài)目標75
3.4.3 makefile中的常用目標75
3.4.4 后綴規(guī)則76
3.4.5 模式規(guī)則76
3.4.6 多目標與自動推導77
3.4.7 makefile規(guī)則77
3.4.8 引入其他的makefile文件80
3.5 變量81
3.5.1 變量的定義81
3.5.2 與變量相關的操作符82
3.5.3 變量的應用83
3.5.4 特殊變量84
3.6 函數(shù)87
3.6.1 函數(shù)的調用語法87
3.6.2 字符串處理函數(shù)88
3.6.3 文件操作函數(shù)90
3.6.4 循環(huán)函數(shù)91
3.6.5 條件函數(shù)92
3.6.6 其他函數(shù)92
3.6.7 makefile工作過程總結94
第4章 gdb調試技術95
4.1 概述95
4.1.1 簡單的調試實例96
4.1.2 gdb啟動退出與程序的加載98
4.1.3 gdb隨機幫助與常用命令99
4.2 gdb常用查看命令101
4.2.1 查看寄存器101
4.2.2 查看棧信息101
4.2.3 查看源程序103
4.2.4 查看源代碼的內存104
4.3 變量操作命令105
4.3.1 查看單個數(shù)據(jù)105
4.3.2 輸出格式105
4.3.3 修改變量的值106
4.3.4 全局變量與局部變量106
4.3.5 表達式107
4.3.6 數(shù)組107
4.3.7 查看內存108
4.3.8 變量自動顯示108
4.4 程序斷點運行調試命令109
4.4.1 斷點操作109
4.4.2 觀察點操作110
4.4.3 捕捉點操作110
4.4.4 重載函數(shù)的斷點操作111
4.4.5 各種斷點的維護111
4.5 程序的單步調試技術113
4.6 程序的信號調試技術114
4.7 程序的多線程調試技術115
4.8 程序控制命令116
4.8.1 跳轉控制命令116
4.8.2 函數(shù)控制命令116
4.9 gdb環(huán)境設置命令117
4.9.1 運行環(huán)境設置117
4.9.2 顯示設置117
4.9.3 環(huán)境變量120
4.9.4 搜索源代碼121
4.9.5 指定源文件的路徑121
第5章 Linux常用編輯器122
5.1 vi編輯器122
5.1.1 概述122
5.1.2 多文件操作126
5.1.3 光標移動命令127
5.1.4 屏幕操作命令129
5.1.5 尋找與替換131
5.1.6 vi的基本編輯命令及操作133
5.1.7 多窗口操作138
5.1.8 寄存器與緩沖區(qū)操作140
5.1.9 與編程開發(fā)相關操作141
5.1.10 配置設置143
5.1.11 其他編輯命令144
5.2 emacs編輯器146
5.2.1 概述146
5.2.2 emacs基本知識147
5.2.3 對目錄的操作154
5.2.4 編輯遠程機器上的文件157
5.2.5 光標操作157
5.2.6 基本編輯功能160
5.2.7 查找與替換163
5.2.8 多窗口操作164
5.2.9 emacs編程語言支持功能164
5.2.10 emacs設置172
5.2.11 版本控制174
5.2.12 隨機幫助的使用177
5.2.13 emacs的其他功能178
第6章 ATmega48/88/168硬件結構與功能179
6.1 ATmega48/88/168概述179
6.1.1 產(chǎn)品特性179
6.1.2 引腳配置180
6.1.3 結構框圖183
6.1.4 工作狀態(tài)與MCU控制寄存器185
6.1.5 AVRCPU通用工作寄存器186
6.2 存儲結構186
6.2.1 ATmega48的程序存儲器映像186
6.2.2 SRAM數(shù)據(jù)存儲器187
6.2.3 EEPROM數(shù)據(jù)存儲器187
6.3 系統(tǒng)時鐘以及選擇189
6.3.1 時鐘分類189
6.3.2 時鐘源190
6.3.3 與系統(tǒng)時間相關寄存器191
6.4 電源管理與休眠模式192
6.4.1 工作模式192
6.4.2 休眠模式控制寄存器193
6.4.3 功耗最小化需要考慮的幾個問題194
6.5 時間器與看門狗195
6.5.1 看門狗定時器195
6.5.2 看門狗控制寄存器195
6.5.3 看門狗安全操作時間序列196
6.5.4 看門狗熔絲位197
6.5.5 定時器的工作模式197
6.5.6 8位PWM定時器0199
6.5.7 16位PWM定時器1208
6.5.8 8位異步操作PWM定時器2216
6.6 復位與中斷221
6.6.1 復位221
6.6.2 中斷223
6.6.3 外部中斷224
6.6.4 ATmega48復位與中斷向量226
6.6.5 ATmega88復位與中斷向量228
6.6.6 ATmega168復位與中斷向量231
6.6.7 I/O端口234
6.8 串行通信接口238
6.8.1 USART串行通信238
6.8.2 SPI串行通信245
6.8.3 兩線串行通信249
6.9 模擬比較器與模/數(shù)轉換254
6.9.1 模擬比較器254
6.9.2 模/數(shù)轉換器256
6.10 熔絲位以及功能259
第7章 AVRgcc開發(fā)技術262
7.1 Debian中的AVR交叉工具包262
7.1.1 AVR交叉工具包的安裝262
7.1.2 使用Linux平臺的優(yōu)勢263
7.1.3 準備工作263
7.1.4 AVRgcc編譯及makefile的編寫264
7.1.5 軟件模擬調試265
7.2 AVR的GNU下載工具266
7.2.1 PonyProg下載工具266
7.2.2 uisp下載工具269
7.2.3 stk200下載線電路圖274
7.3 procyonAVRLib的C語言庫函數(shù)274
7.3.1 AVRLib的下載與安裝274
7.3.2 與AVR芯片內部設備相關函數(shù)275
7.3.3 常用外部設備函數(shù)285
7.3.4 常見通用設備的軟件模擬297
7.3.5 通用庫函數(shù)298
7.3.6 網(wǎng)絡庫函數(shù)305
第8章 AVR純固件USB協(xié)議314
8.1 USB總線協(xié)議概述314
8.1.1 基本概念314
8.1.2 USB總線狀態(tài)322
8.1.3 USB物理層定義323
8.1.4 USB數(shù)據(jù)鏈路層定義325
8.2 開源純軟件模擬USB總線協(xié)議331
8.2.1 純軟件USB協(xié)議功能特性331
8.2.2 硬件電路331
8.2.3 軟件系統(tǒng)結構333
8.3 純軟件USB應用-USBASP下載線345
8.3.1 USBASP功能概述345
8.3.2 USBASP硬件電路345
8.3.3 USBASP固件程序分析346
8.3.4 USBASP制作過程347
8.3.5 USBASP使用方法348
第9章 ARMgcc開發(fā)包ProcyonARMLib351
9.1 AtmelAT91SAM7S系列芯片概述351
9.1.1 AT91SAM7S的基本特點351
9.1.2 AT91SAM7S的基本結構353
9.1.3 ARM7TDMI處理器概述355
9.1.4 存儲器356
9.1.5 外設358
9.1.6 定時器358
9.1.7 外設數(shù)據(jù)傳輸控制器359
9.1.8 高級中斷控制器360
9.1.9 并行輸入/輸出控制器361
9.1.10 通信總線361
9.1.11 脈寬調制控制器364
9.1.12 USB器件端口365
9.1.13 模/數(shù)轉換器366
9.2 ARM交叉工具軟件包366
9.2.1 gnuarm概述366
9.2.2 gnuarm應用程序binutils366
9.3 ProcyonARMLib的C語言庫函數(shù)388
9.3.1 ARMLib的下載與安裝388
9.3.2 與ARM芯片內部設備相關函數(shù)390
9.3.3 與AVRLib相同的部分398
9.4 OpenOCD398
9.4.1 OpenOCD概述398
9.4.2 OpenOCD的安裝399
9.4.3 OpenOCD芯片的配置文件400
9.4.4 OpenOCD芯片配置命令400
9.4.5 OpenOCD命令403
9.4.6 OpenOCD應用舉例405
9.4.7 wiggler并口jtag408
參考文獻409
GNU項目計劃的主要目的是創(chuàng)建一個名叫GNU’s Not Unix(GNU)的完全免費的操作系統(tǒng)。該操作系統(tǒng)將包括絕大多數(shù)自由軟件基金會所開發(fā)的其他軟件,以對抗所有商業(yè)軟件,而這個操作系統(tǒng)的核心(kernel)就叫HURD。但是GNU在開發(fā)完全免費的操作系統(tǒng)上并未取得成功’直到20世紀90年代由林納斯.本納第克特.托瓦茲(Linus Benedict TorvaIds)開發(fā)了Linux操作系統(tǒng),GNU才算在免費操作系統(tǒng)上完成了任務。
雖然GNU計劃在開發(fā)免費操作系統(tǒng)上不成功,但是卻成功開發(fā)幾個廣為流傳的GNU軟件’其中最著名的是GNU C Complier(gcc)。這個軟件成為歷史上最優(yōu)秀的C語言編譯器,其執(zhí)行效率與一般的編譯器相比平均效率要高20%-30%,使得那些靠販賣編譯器的公司大吃苦頭,因為它們無法研制出與gcc同樣優(yōu)秀,卻又完全免費、并開放源代碼的編譯器來。而由于它又是copylefted,所以一旦有用戶發(fā)現(xiàn)錯誤,就會通知Richard StaIlman,所以幾乎每個月都可以推出新版本。