項目2-學(xué)習(xí)嵌入式系統(tǒng)基本軟硬件開發(fā)_第1頁
項目2-學(xué)習(xí)嵌入式系統(tǒng)基本軟硬件開發(fā)_第2頁
項目2-學(xué)習(xí)嵌入式系統(tǒng)基本軟硬件開發(fā)_第3頁
項目2-學(xué)習(xí)嵌入式系統(tǒng)基本軟硬件開發(fā)_第4頁
項目2-學(xué)習(xí)嵌入式系統(tǒng)基本軟硬件開發(fā)_第5頁
已閱讀5頁,還剩75頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

工程二、學(xué)習(xí)嵌入式系統(tǒng)根本軟硬件開發(fā)一、工程概況一、工程概況工程說明:本工程利用ARM嵌入式微處理器與接口知識,在嵌入式系統(tǒng)的集成開發(fā)環(huán)境中采用基于Linux的應(yīng)用程序設(shè)計根底上設(shè)計程序并在ARM板內(nèi)燒寫開發(fā)的可執(zhí)行文件實現(xiàn)仿真月球車的巡跡控制,包括前進、后退、左右方向拐彎。二、知識儲藏2.1嵌入式ARM系統(tǒng)及接口嵌入式處理機的開展4位->8位->16位->32位->64位速度:時鐘頻率從1Mhz開展到1Ghz以上價格越來越低集成度: 片內(nèi)RAM從幾十字節(jié)開展到幾十K; 片內(nèi)FLASH從幾百字節(jié)開展到幾百K;片內(nèi)I/O包括A/D、各種通訊口、顯示驅(qū)動等二、知識儲藏2.1嵌入式ARM系統(tǒng)及接口嵌入式處理器8位MCU:8051,M68HC08,PIC12/16/18,AVR,Z8,TLCS870,H300,STM08,……16位MCU:M68HC12,MCS96,MPF90x,PXA,MSP430,……32位MPU:ARM,MIPS,PowerPC,M68K,X86,……DSP:TI,ADI,FreeScale(Motorola),……64位MPU:MIPS,……二、知識儲藏2.1嵌入式ARM系統(tǒng)及接口MCU片內(nèi)I/O功能串行通訊口:UART:異步串行口,用于與主機或其它芯片通訊。SPI:四線同步串行外圍接口,用于與I/O擴展芯片接口,如EEPROM、A/D、聲音芯片等。IIC:雙線串行外圍接口,用于電視機及EEPROM等。CAN:控制器局域網(wǎng),多主機,抗干擾性強,用于汽車及控制系統(tǒng)。LIN:單線通訊網(wǎng),價格低,用于汽車電子系統(tǒng)。USB:一般為從機方式,可用于與主機進行高速數(shù)據(jù)通訊。二、知識儲藏2.1嵌入式ARM系統(tǒng)及接口MCU片內(nèi)I/O功能定時器:根本功能:定時、計數(shù)。輸入捕捉:用于測量輸入脈沖的寬度、周期、頻率。輸出比較:可輸出各種脈沖。PWM:脈沖寬度調(diào)制,可驅(qū)動馬達,加濾波器后可代替DA。2.1嵌入式ARM系統(tǒng)及接口RISC處理器特點精簡指令系統(tǒng)指令條數(shù)少,一般小于100條根本尋址方式少,一般24種指令格式少,一般35種指令長度一致(32/16位)以存放器-存放器方式工作,除了Load/Store指令訪問存儲器外,其余指令只訪問存放器。除了Load/Store指令訪問存儲器外,所有指令在一個機器時鐘周期完成,并采用流水線技術(shù)。使用較多的通用存放器,一般至少16個,一般不允許有專用存放器。大多采用硬聯(lián)線控制,少用或不用微程序?qū)崿F(xiàn)。采用針對體系結(jié)構(gòu)特點的優(yōu)化編譯技術(shù),防止或減少流水線中出現(xiàn)的相關(guān)性,保證流水線暢通。二、知識儲藏二、知識儲藏2.1嵌入式ARM系統(tǒng)及接口ARM的概念A(yù)dvancedRISCMachinesARM公司:AdvancedRISCMachinesLimitedARM處理器:一類微處理器的通稱ARM內(nèi)核特點功耗低、應(yīng)用靈活、指令集可擴展且兼容性強、支持雙指令集、尋址方式靈活、大量使用存放器、指令執(zhí)行速度快。ARM處理器系列(1)ARM7。32位,3級流水、馮·諾依曼,0.9MIPS/MHz。(2)ARM9。哈佛結(jié)構(gòu),5級流水,1.1MIPS/MHz,具有MMU(3)ARM9E。提供增強的DSP處理能力。(4)SecureCore。帶有靈活的保護單元,以確保操作系統(tǒng)和應(yīng)用數(shù)據(jù)的平安;采用軟內(nèi)核技術(shù),防止外部掃描探測。2.1嵌入式ARM系統(tǒng)及接口ARM架構(gòu)的結(jié)構(gòu):32位RISC型處理器結(jié)構(gòu)

32位ARM和16位Thumb指令集

多種處理器狀態(tài)模式

嵌入式在線仿真調(diào)試

靈活和方便的接口

低電壓低功耗的設(shè)計

二、知識儲藏2.1嵌入式ARM系統(tǒng)及接口ARMv7體系結(jié)構(gòu)向目標應(yīng)用提供一組自定義配置文件。所有Cortex處理器都實現(xiàn)了ARMv7體系結(jié)構(gòu)〔實現(xiàn)ARMv6M的Cortex-M系列處理器除外〕。所有ARMv7體系結(jié)構(gòu)配置文件都實現(xiàn)了

Thumb-2

技術(shù)〔一個經(jīng)過優(yōu)化的16/32位混合指令集〕,在保持與現(xiàn)有ARM解決方案的代碼完全兼容的同時,既具有32位ARM

ISA的性能優(yōu)勢,也具有16位ThumbISA的代碼大小優(yōu)勢。ARMv7體系結(jié)構(gòu)還包括

NEON?

技術(shù)擴展,可將DSP和多媒體處理吞吐量提升高達400個百分比,并提供改進的浮點支持以滿足下一代3D圖形和游戲物理學(xué)以及傳統(tǒng)嵌入式控制應(yīng)用程序的需要。Cortex體系結(jié)構(gòu)旨在橫跨各種應(yīng)用領(lǐng)域〔從本錢少于1美元的微控制器到功能強大,運行速度超過2GHz的多核設(shè)計〕。二、知識儲藏2.1嵌入式ARM系統(tǒng)及接口ARM7TDMI芯片SamsungARM:ARM7TDMI,8KCache,SDRAM接口,DMA,2路UART,1路IIC,WatchDog,PLLS3C4510B:EthernetMAC,HDLC,2*32位定時器,50MHz工作頻率,208腳PQFPS3C44B0:LCD控制器,IIS控制器,SIO,5路PWM定時器,8路10位A/D,RTC,66MHz工作頻率,160腳PQFP二、知識儲藏2.1嵌入式ARM系統(tǒng)及接口ARMCortex嵌入式處理器Cortex-M:嵌入式控制用,功能較簡單,價格 低,一般為單片形式Cortex-R:實時控制、計算用,速度較快Cortex-A:高性能應(yīng)用處理機二、知識儲藏

2.1嵌入式ARM系統(tǒng)及接口Cortex嵌入式處理器旨在為各種不同的市場提供效勞。Cortex-M

系列

-

面向具有確定性的微控制器應(yīng)用的本錢敏感型解決方案 Cortex-M系列處理器主要是針對微控制器領(lǐng)域開發(fā)的,在該領(lǐng)域中,既需進行快速且具有高確定性的中斷管理,又需將門數(shù)和可能功耗控制在最低。Cortex-R

系列

-面向?qū)崟r應(yīng)用的卓越性能 Cortex-R系列處理器的開發(fā)那么面向深層嵌入式實時應(yīng)用,對低功耗、良好的中斷行為、卓越性能以及與現(xiàn)有平臺的高兼容性這些需求進行了平衡考慮。二、知識儲藏

2.1嵌入式ARM系統(tǒng)及接口應(yīng)用包括Cortex-M系列微控制器混合信號設(shè)備智能傳感器汽車電子和氣囊

Cortex-R系列汽車制動系統(tǒng)

動力傳動解決方案大容量存儲控制器聯(lián)網(wǎng)和打印二、知識儲藏2.1嵌入式ARM系統(tǒng)及接口典型ARM處理器S3C2440是三星基于ARM920T開發(fā)的低功耗芯片。32位RISC,具有MMU、指令緩沖器(I_Cache)和數(shù)據(jù)緩沖器(D_Cache)。內(nèi)核工作電壓低至1.8V,存儲器和I/O口電壓為3.3V。工作頻率最高可達266MHz封裝形式為272FBGA。S3C2440芯片具有極高的性價比,為手持設(shè)備和通用嵌入式應(yīng)用提供片上系統(tǒng)解決方案。二、知識儲藏2.1嵌入式ARM系統(tǒng)及接口S3C2440二、知識儲藏2.1嵌入式ARM系統(tǒng)及接口S3C2440(1)支持大/小端格式;尋址空間到達128MB/Bank(總共1GB);具有8個存儲器Bank,其中,6個適用于ROM、SRAM,2個適用于ROM/SRAM和同步DRAM。(2)支持掉電時的SDRAM自刷新模式,以及各種型號的ROM引導(dǎo)。(3)具有優(yōu)異的時鐘和電源管理功能,具有片上MPLL和UPLL,MPLL最大產(chǎn)生266MHz的時鐘,能通過軟件為每個功能模塊提供時鐘,電源管理具有正常、慢速、空閑和掉電等模式。(4)中斷控制器支持55個中斷源,可編程邊沿/電平觸發(fā)極性,為緊急中斷請求提供快速中斷效勞。(5)具有4通道16位PWM定時器、1通道16位內(nèi)部定時器;RTC(實時時鐘);通用I/O口;3通道UART,支持IrDA;DMA控制器;4通道DMA控制器;A/D轉(zhuǎn)換和觸摸屏接口;LCD控制器;看門狗定時器;I2C總線接口;I2S總線接口;2個USB主設(shè)備接口;1個USB從設(shè)備接口;SD主機接口;SPI接口。二、知識儲藏二、知識儲藏2.2嵌入式系統(tǒng)的開發(fā)流程嵌入式系統(tǒng)開發(fā)流程大體分為需求分析、系統(tǒng)定義與結(jié)構(gòu)設(shè)計、硬件子系統(tǒng)設(shè)計、軟件子系統(tǒng)設(shè)計、系統(tǒng)集成與測試、工程評估與總結(jié)等階段,如下圖。需求分析系統(tǒng)定義與結(jié)構(gòu)設(shè)計硬件子系統(tǒng)設(shè)計軟件子系統(tǒng)設(shè)計系統(tǒng)集成與測試項目評估與總結(jié)2.2嵌入式系統(tǒng)的開發(fā)流程需求分析該階段主要通過充分的市場調(diào)研和與用戶的交流,制定出要開發(fā)的系統(tǒng)的性能指標、操作方式、外觀等需求參數(shù)。根據(jù)需求參數(shù)進行可行性論證,得出工程是否可行的結(jié)論。此階段要形成需求描述、性能指標參數(shù)、可行性分析等文檔。系統(tǒng)定義與結(jié)構(gòu)設(shè)計根據(jù)需求分析尋找能構(gòu)成系統(tǒng)的適宜組件,形成多套方案。然后估計每套方案的本錢與效益,在充分權(quán)衡利弊的根底上,選擇恰當?shù)姆桨高M行實施。此階段要形成系統(tǒng)設(shè)計說明、總體結(jié)構(gòu)設(shè)計方案等文檔。二、知識儲藏2.2嵌入式系統(tǒng)的開發(fā)流程硬件子系統(tǒng)設(shè)計該階段主要完成電路原理圖設(shè)計和PCB〔PrintedCircuitBoard〕布線。硬件設(shè)計應(yīng)綜合考慮多種因素,如選擇適宜的電路板,合理布局各個元器件的位置,防止元器件之間的相互干擾,方便與其他設(shè)備的連接,合理的產(chǎn)品外觀、尺寸,供電方式等。此階段需要形成電路設(shè)計原理圖、PCB布線圖和硬件子系統(tǒng)詳細設(shè)計文檔。軟件子系統(tǒng)設(shè)計軟件子系統(tǒng)設(shè)計通常包括嵌入式操作系統(tǒng)定制、設(shè)備驅(qū)動程序開發(fā)和應(yīng)用程序開發(fā)等三項內(nèi)容。由于軟件子系統(tǒng)的開發(fā)不是直接在硬件子系統(tǒng)上進行的,因此,軟件子系統(tǒng)與硬件子系統(tǒng)的開發(fā)可以同時進行。此階段需要形成嵌入式操作系統(tǒng)定制文檔、設(shè)備驅(qū)動程序開發(fā)文檔和應(yīng)用程序開發(fā)文檔。二、知識儲藏2.2嵌入式系統(tǒng)的開發(fā)流程系統(tǒng)集成與測試在硬件子系統(tǒng)與軟件子系統(tǒng)設(shè)計完成后,需要將軟件子系統(tǒng)下載到硬件子系統(tǒng)的flash中,然后進行整體的系統(tǒng)測試。測試中需要使用不同的方法來測試系統(tǒng)的運行結(jié)果是否與預(yù)期的相同。此階段需要形成整個系統(tǒng)的集成與測試文檔。工程評估與總結(jié)該階段主要對整個系統(tǒng)開發(fā)過程中的成功經(jīng)驗和失敗教訓(xùn)進行總結(jié),為下一次的開發(fā)奠定根底。二、知識儲藏2.2嵌入式系統(tǒng)的開發(fā)流程嵌入式軟件的開發(fā)3個階段源代碼程序的編寫將源程序交叉編譯成各個目標模塊將所有目標模塊及庫文件鏈接成目標程序。二、知識儲藏2.2嵌入式系統(tǒng)的開發(fā)流程嵌入式系統(tǒng)開發(fā)語言匯編:運行時間快,程序短; 開發(fā)時間長,調(diào)試難,移植修改難C:特點:可內(nèi)嵌匯編,可分配存儲器和I/O地址,支持 位操作 優(yōu)點:開發(fā)快,易調(diào)試、移植 缺點:運行效率較低Java:跨平臺,可在線裝入二、知識儲藏

2.2嵌入式系統(tǒng)的開發(fā)流程嵌入式操作系統(tǒng)開放源代碼:

─RTX51、TinyOS、μC/OS、嵌入式Linux商業(yè)化OS:

─VxWorks、WindowCE、QNX、PalmOS、iRMX、iOS汽車電子操作系統(tǒng)標準:OSEK二、知識儲藏嵌入式操作系統(tǒng)二、知識儲藏2.2嵌入式系統(tǒng)的開發(fā)流程2.2嵌入式系統(tǒng)的開發(fā)流程嵌入式Linux概述Linux在1991年問世,嵌入式Linux的應(yīng)用非常廣泛。Linux特性〔1〕廣泛的硬件支持?!?〕內(nèi)核高效穩(wěn)定?!?〕開放源代碼、軟件豐富。〔4〕優(yōu)秀和完整的開發(fā)工和調(diào)試具?!?〕完善的網(wǎng)絡(luò)通信和文件管理機制?!?〕支持ext2、fat16、fat32、romfs等文件系統(tǒng)。缺乏之處實時性GUI二、知識儲藏二、知識儲藏2.2嵌入式系統(tǒng)的開發(fā)流程結(jié)論:嵌入式系統(tǒng)操作系統(tǒng)選擇Linux嵌入式系統(tǒng)開發(fā)語言選擇C二、知識儲藏2.3嵌入式Linux下C語言編程GCCGCC是GNU開源社區(qū)的一個編譯器工程,最初只能編譯C語言程序,是GNUCCompiler的英文縮寫。GNU是“GNU’sNotUnix〞的遞歸縮寫,是由RichardStallman在1983年9月發(fā)起成立的一個開源社區(qū),其目標是創(chuàng)立一套完全自由的操作系統(tǒng)。目前Linux中的許多軟件來源于GNU,如Emacs、GCC等。隨著眾多開源愛好者對GCC功能的不斷擴展和完善,如今的GCC能夠完成對多種編程語言編寫的程序的編譯,包括C、C++、Ada、ObjectC、Java、Fortran等,因此,GCC的含義也由原來的GNUCCompiler變?yōu)镚NUCompilerCollection,也就是GNU編譯器家族的含義。2.3嵌入式Linux下C語言編程GCC

GCC通過文件名的后綴來區(qū)分文件,因此,使用GCC編譯文件時要按照GCC的要求,給文件名加上相應(yīng)的后綴。二、知識儲藏2.3嵌入式Linux下C語言編程GCCGCC在使用時需要給出參數(shù)來執(zhí)行相應(yīng)的功能,GCC的參數(shù)大約有100多個,其中大多數(shù)的參數(shù)不經(jīng)常使用,僅介紹常用的幾個參數(shù),想全面了解GCC參數(shù)的讀者可參閱專門的GCC手冊。GCC的用法為:gcc[參數(shù)]文件列表,常用的參數(shù)含義如下:-c:編譯生成以.o為后綴的目標文件,不生成可執(zhí)行文件。-o:該參數(shù)后面跟要生成的可執(zhí)行文件的名稱。-g:生成符號調(diào)試工具(GNU的GDB)所需要的符號信息,要想使用GDB對可執(zhí)行程序進行調(diào)試執(zhí)行,必須參加這個參數(shù)。二、知識儲藏2.3嵌入式Linux下C語言編程GDBGDB是GNU發(fā)布的一個功能強大的程序調(diào)試工具。源程序在用GCC編譯時如果加上參數(shù)“-g〞,生成的可執(zhí)行文件就可以使用GDB進行調(diào)試執(zhí)行。二、知識儲藏2.3嵌入式Linux下C語言編程GDB啟動GDB的方法是在Linux命令窗口中執(zhí)行命令:“gdb可執(zhí)行文件〞,其中可執(zhí)行文件表示要調(diào)試運行的程序。進入GDB界面后,GDB提供了大量的程序調(diào)試命令供用戶使用,常用的命令如下:setargs:給當前要運行的程序傳遞參數(shù),參數(shù)跟在其后。showargs:顯示當前程序的參數(shù)。list或l:以每頁10行的形式分頁顯示源程序。后跟1個行號時顯示以該行號為中心的10行源程序;后跟函數(shù)名時顯示指定函數(shù)的源程序;后跟兩個行號且行號之間以逗號分隔時,顯示以前一個行號開始到第二個行號處的源程序;不指定行號或者函數(shù)名時,顯示下頁源程序。break或b:設(shè)置斷點。后跟斷點所在行號或者函數(shù)名,可以設(shè)置條件斷點infobreak或ibreak:顯示斷點信息。delete或d:刪除指定斷點。后跟斷點編號。不指定斷點編號時,提示刪除所有斷點。

二、知識儲藏2.3嵌入式Linux下C語言編程GDBclear:刪除指定斷點。后跟斷點所在行號或者函數(shù)名,不指定行號或者函數(shù)名時,刪除該命令執(zhí)行之前創(chuàng)立的斷點。disable:使指定斷點失效。后跟斷點編號。不指定斷點編號時,使所有斷點失效。enable:使指定斷點生效。后跟斷點編號。不指定斷點編號時,使所有斷點生效。run或r:從頭運行程序,直到結(jié)束或遇到有效的斷點處。continue或c:繼續(xù)運行程序,直到結(jié)束或遇到下一個有效的斷點處。next或n:逐條語句執(zhí)行,語句中有函數(shù)調(diào)用語句時,不進入函數(shù)內(nèi)部執(zhí)行。二、知識儲藏

2.3嵌入式Linux下C語言編程GDB

step或s:逐條語句執(zhí)行,語句中有函數(shù)調(diào)用語句時,進入函數(shù)內(nèi)部執(zhí)行。

finish:結(jié)束當前函數(shù)的執(zhí)行,并顯示函數(shù)的返回值。

call:調(diào)用執(zhí)行指定函數(shù),后跟函數(shù)名。

setvariable:給指定變量賦值。

print或p:顯示指定變量的值或者函數(shù)調(diào)用結(jié)果值,還可以數(shù)組形式顯示指定變量及其后的值。

whatis:顯示指定變量的類型。

ptype:顯示指定變量的類型,比whatis的功能更強,可顯示結(jié)構(gòu)體的定義。bt:查看函數(shù)的調(diào)用關(guān)系。

help或h:幫助信息。無參數(shù)時,顯示GDB命令的分類和功能描述;有參數(shù)時,顯示以給出參數(shù)為分類的命令列表和功能描述。

quit或q:退出GDB?;剀囨I:繼續(xù)執(zhí)行上條命令。二、知識儲藏2.3嵌入式Linux下C語言編程maketools當開發(fā)一個大的工程時,需要多個人分工協(xié)作,共同完成,因此,工程被劃分為一個個的模塊。而每個模塊可能又有好幾個人共同開發(fā),形成多個程序,使得工程包含了由不同人開發(fā)的多個程序。如何對這些屬于同一個工程的、由不同人開發(fā)的程序進行管理,是一個難題。make是GNU推出的用來管理多個程序的工具,它依靠makefile文件中規(guī)那么的描述,獲取可執(zhí)行文件和各程序模塊間的關(guān)系,實現(xiàn)對屬于同一個工程的多個文件進行管理。make能夠根據(jù)文件的修改時間,判斷程序模塊是否修改正,然后僅對修改正的程序模塊進行編譯。makefile文件的預(yù)設(shè)文件名依次為GNUmakefile、makefile或者Makefile,如果不使用預(yù)設(shè)文件名,那么需要在執(zhí)行make命令時加參數(shù)“-f〞指明。二、知識儲藏2.3嵌入式Linux下C語言編程maketoolsmakefile文件中語句的語法是Shell語句語法的子集,以“#〞開頭的語句為注釋語句,內(nèi)容一般分為兩局部,前面局部由include和變量定義語句構(gòu)成,include語句能夠?qū)⒘硗庖粋€文件的內(nèi)容包含進來,變量定義語句定義后面局部要使用的變量。前面局部的內(nèi)容可以為空。makefile的后面局部內(nèi)容是文件的主要內(nèi)容,由一些規(guī)那么描述的語句塊組成,make執(zhí)行時將根據(jù)這些語句塊的描述執(zhí)行相應(yīng)的命令或者程序。規(guī)那么描述語句塊格式為:TARGET:PREREQUISITESCOMMAND二、知識儲藏2.3嵌入式Linux下C語言編程maketoolsTARGET為規(guī)那么的目標,通常是需要生成的文件名或者為了實現(xiàn)這個目的而必需的中間過程文件名。目標可以有多個,之間用空格進行分隔。另外,目標也可以是一個make執(zhí)行的動作的名稱,如“clean〞,這樣的目標稱為“偽目標〞,不生成文件,而只執(zhí)行相應(yīng)的命令。PREREQUISITES為規(guī)那么的依賴,表示要生成目標的先決條件為這些目標所依賴的文件必須先生成,依賴文件可以有多個,文件名之間用空格分隔?!皞文繕栓曇话銢]有依賴。COMMAND為規(guī)那么要執(zhí)行的命令行,可以是任意的shell命令或者是可在shell下執(zhí)行的程序,它表示make執(zhí)行這條規(guī)那么時所需要執(zhí)行的動作。一個規(guī)那么可以有多個命令行,每一條命令獨占一行,并且每一個命令行必須以[Tab]字符開始,[Tab]字符告訴make此行是一個命令行,這是編寫makefile文件時容易產(chǎn)生錯誤的地方,這種錯誤比較隱蔽,較難發(fā)現(xiàn)。二、知識儲藏2.3嵌入式Linux下C語言編程maketoolsmakefile文件中一般包含多組規(guī)那么描述的語句塊,這些規(guī)那么描述語句塊之間有依賴關(guān)系,成倒序形式排列,即最終目標的規(guī)那么描述語句塊在最前面,其后是以最終目標的依賴為目標的規(guī)那么描述語句塊,依此類推,直到依賴為源程序的規(guī)那么描述語句塊。makefile文件的末尾一般為“偽目標〞規(guī)那么描述語句塊。二、知識儲藏2.3嵌入式Linux下C語言編程maketools當目標文件已經(jīng)生成,且源文件沒有改變的情況下,執(zhí)行命令“make〞或者“makeall〞將提示make未執(zhí)行任何操作,這是因為make判斷到?jīng)]有文件發(fā)生改變,現(xiàn)在的目標文件已經(jīng)是最新文件。二、知識儲藏二、知識儲藏2.4Linux下多線程程序設(shè)計的根本原理進程(process):進程就是當前運行的應(yīng)用程序.進程由一個或多個線程以及程序在內(nèi)存中的代碼、數(shù)據(jù)和其他資源組成。程序資源通常有翻開的文件、信號燈和動態(tài)分配的內(nèi)存。線程(thread):線程是操作系統(tǒng)分配處理器時間的根本單元.每個線程都維護異常處理程序、調(diào)度優(yōu)先級和一組系統(tǒng)用于在調(diào)度該線程前保存線程上下文的結(jié)構(gòu)。線程上下文包括為使線程在線程的宿主進程地址空間中無縫地繼續(xù)執(zhí)行所需的所有信息,包括線程的CPU存放器組和堆棧。多線程程序作為一種多任務(wù)、并發(fā)的工作方式,有以下的優(yōu)點:提高應(yīng)用程序響應(yīng)。這對圖形界面的程序尤其有意義,當一個操作耗時很長時,整個系統(tǒng)都會等待這個操作,此時程序不會響應(yīng)鍵盤、鼠標、菜單的操作,而使用多線程技術(shù),將耗時長的操作〔timeconsuming〕置于一個新的線程,可以防止這種為難的情況。使多CPU系統(tǒng)更加有效。改善程序結(jié)構(gòu)。一個既長又復(fù)雜的進程可以考慮分為多個線程,成為幾個獨立或半獨立的運行局部,這樣的程序會利于理解和修改。LIBC中的pthread庫提供了大量的API函數(shù),為用戶編寫應(yīng)用程序提供支持。二、知識儲藏2.4Linux下多線程程序設(shè)計的根本原理主要線程函數(shù):線程的創(chuàng)立pthreads線程庫中提供的創(chuàng)立線程的函數(shù)是pthread_create()#include<pthread.h>intpthread_create(pthread_t*thread,pthread_attr_t*attr,void*(*start_routine)(void*),void*arg);線程的退出在線程的處理函數(shù)中,可以顯示的調(diào)用pthread_exit()結(jié)束線程執(zhí)行,也可以不調(diào)用pthread_exit(),而只是讓線程處理程序返回。除了pthread_exit()函數(shù),可以讓當前調(diào)用pthread_exit()的線程顯示地退出外,線程也可以使用pthread_cancel()函數(shù)終止其他線程的執(zhí)行。二、知識儲藏2.4Linux下多線程程序設(shè)計的根本原理主要線程函數(shù):等待線程結(jié)束pthread_join()函數(shù)會掛起創(chuàng)立線程的線程的執(zhí)行,直到等待到想要等待的子線程。intpthread_join(pthread_tth,void**thread_return);線程的別離主線程創(chuàng)立子線程,且子線程本身自己有自我回收內(nèi)存資源的能力。intpthread_detach(pthread_tth);獲得當前線程標志使用pthread_self()函數(shù)可以獲得當前線程的標志,pthread_self()的返回值就是當前線程的標志。pthread_tpthread_self(void);二、知識儲藏2.4Linux下多線程程序設(shè)計的根本原理經(jīng)典案例:生產(chǎn)者-消費者問題模型的實現(xiàn),主程序中分別啟動生產(chǎn)者線程和消費者線程。生產(chǎn)者線程不斷順序地將0到1000的數(shù)字寫入共享的循環(huán)緩沖區(qū),同時消費者線程不斷地從共享的循環(huán)緩沖區(qū)讀取數(shù)據(jù)。二、知識儲藏2.4Linux下多線程程序設(shè)計的根本原理生產(chǎn)者-消費者實驗源代碼結(jié)構(gòu)流程圖二、知識儲藏2.4Linux下多線程程序設(shè)計的根本原理生產(chǎn)者-消費者源程序分析#include<stdio.h>#include<stdlib.h>#include<time.h>#include"pthread.h"#defineBUFFER_SIZE16/*設(shè)置一個整數(shù)的圓形緩沖區(qū)*/structprodcons{intbuffer[BUFFER_SIZE];/*緩沖區(qū)數(shù)組*/pthread_mutex_tlock;/*互斥鎖*/intreadpos,writepos;/*讀寫的位置*/pthread_cond_tnotempty;/*緩沖區(qū)非空信號*/pthread_cond_tnotfull;/*緩沖區(qū)非滿信號*/};二、知識儲藏2.4Linux下多線程程序設(shè)計的根本原理生產(chǎn)者-消費者源程序分析/*初始化緩沖區(qū)*/voidinit(structprodcons*b){pthread_mutex_init(&b->lock,NULL);pthread_cond_init(&b->notempty,NULL);pthread_cond_init(&b->notfull,NULL);b->readpos=0;b->writepos=0;}二、知識儲藏2.4Linux下多線程程序設(shè)計的根本原理生產(chǎn)者-消費者源程序分析/*向緩沖區(qū)中寫入一個整數(shù)*/voidput(structprodcons*b,intdata){pthread_mutex_lock(&b->lock);/*等待緩沖區(qū)非滿*/while((b->writepos+1)%BUFFER_SIZE==b->readpos){printf("waitfornotfull\n");pthread_cond_wait(&b->notfull,&b->lock);}/*寫數(shù)據(jù)并且指針前移*/b->buffer[b->writepos]=data;b->writepos++;if(b->writepos>=BUFFER_SIZE)b->writepos=0;/*設(shè)置緩沖區(qū)非空信號*/pthread_cond_signal(&b->notempty);pthread_mutex_unlock(&b->lock);}二、知識儲藏2.4Linux下多線程程序設(shè)計的根本原理生產(chǎn)者-消費者源程序分析#defineOVER(-1)structprodconsbuffer;/*--------------------------------------------------------*/void*producer(void*data){intn;for(n=0;n<1000;n++){printf("put-->%d\n",n);put(&buffer,n);}put(&buffer,OVER);printf("producerstopped!\n");returnNULL;}二、知識儲藏2.4Linux下多線程程序設(shè)計的根本原理生產(chǎn)者-消費者源程序分析void*consumer(void*data){intd;while(1){d=get(&buffer);if(d==OVER)break;printf("%d-->get\n",d);}printf("consumerstopped!\n");returnNULL;}/*--------------------------------------------------------*/intmain(void){pthread_tth_a,th_b;void*retval;init(&buffer);pthread_create(&th_a,NULL,producer,0);pthread_create(&th_b,NULL,consumer,0);/*等待生產(chǎn)者和消費者結(jié)束*/pthread_join(th_a,&retval);pthread_join(th_b,&retval);return0;}二、知識儲藏2.4Linux下多線程程序設(shè)計的根本原理生產(chǎn)者寫入緩沖區(qū)和消費者從緩沖區(qū)讀數(shù)的具體流程,生產(chǎn)者首先要獲得互斥鎖,并且判斷寫指針+1后是否等于讀指針,如果相等那么進入等待狀態(tài),等候條件變量notfull;如果不等那么向緩沖區(qū)中寫一個整數(shù),并且設(shè)置條件變量為notempty,最后釋放互斥鎖。消費者線程與生產(chǎn)者線程類似。二、知識儲藏2.4Linux下多線程程序設(shè)計的根本原理生產(chǎn)消費流程圖:二、知識儲藏2.4Linux下多線程程序設(shè)計的根本原理在上述案例中用了線程函數(shù),如pthread_cond_signal、pthread_mutex_init、pthread_mutex_lock等等具體功能可以查閱多線程API三、工程實現(xiàn)3.1硬件設(shè)計原理圖仿真月球車的巡跡控制.sch三、工程實現(xiàn)3.2小車整體設(shè)計小車共有6塊電路板,線路板列表線路板簡介MoonCar-1.PCB主板MoonCar-2.PCB驅(qū)動板MoonCar-3.PCB紅外傳感器板MoonCar-5.PCB攝像頭接口板MoonCar-6.PCB測溫板(插在擴展板接口上)MoonCar-7.PCB萬能板(插在擴展板接口上)三、工程實現(xiàn)3.2小車整體設(shè)計目前小車共有四個驅(qū)動電機,左右各兩個,并且同一邊的兩個電機是共用一個PWM信號的,所以小車驅(qū)動起來只需要2路PWM信號。主板供電為+5V直流電源,通過跟驅(qū)動板的連接端口獲取電源,也可以在主板的輔助電源插座上接上+5V的直流電源,主板上配有一個紐扣電池為2440的實時時鐘供電;驅(qū)動板上有兩組電源,分別以+12V直流電源供電;核心板為3.3V直流電源,取自主板。三、工程實現(xiàn)3.2小車整體設(shè)計小車整體結(jié)構(gòu)圖:

三、工程實現(xiàn)3.2小車整體設(shè)計主板實物圖如下:三、工程實現(xiàn)3.2小車整體設(shè)計主板:主板的功能主要是根據(jù)小車的功能需求把S3C2440核心板的各種有用的接口引出來,并提供電源和一些輔助接口。月球車詳細主板說明三、工程實現(xiàn)3.2小車整體設(shè)計驅(qū)動實物圖如下:三、工程實現(xiàn)3.2小車整體設(shè)計驅(qū)動板:驅(qū)動板的主要功能是接收2440的命令,產(chǎn)生控制電機的PWM信號,采集當前電機編碼器的信息和能表示電機電流的模擬量,并通過串口發(fā)送給2440。驅(qū)動板詳細說明三、工程實現(xiàn)3.3主程序流程圖開 始初始化設(shè)置等待啟動命令小車尋跡是否停下?停車,關(guān)閉設(shè)備否是結(jié)束三、工程實現(xiàn)3.4月球車循跡子程序流程圖檢測傳感器信息采集傳感器數(shù)據(jù)計算黑色尋跡線與中間位置的偏差根據(jù)偏差利用PID控制算法,計算小車左右輪速度控制電機三、工程實現(xiàn)3.5源程序分析#include<fcntl.h>#include<sys/ioctl.h>#include<sys/types.h>#include<sys/stat.h>#include<sys/mman.h>#include<unistd.h>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<linux/types.h>#include<linux/fb.h>#include<stdio.h>#include<sys/wait.h>#include<pthread.h>#include<netinet/in.h>#include<sys/socket.h>#include<unistd.h>#include<time.h>#include<termios.h>#include<sys/select.h>#include<sys/time.h>#include<errno.h>三、工程實現(xiàn)3.5源程序分析intfd_track;//intpCamFb;intfd_pwm;intfd_MP;intfd_i2c;unsignedcharvalue[6]={0};//碼盤圈數(shù)intthreadOver=0;//進程結(jié)束表示,為結(jié)束intdeteFd;//?ìa?y?ˉsleep(5)intdeteFd2;intautofd;intdf;charcmd=0;intendT=1;longtmp=10;//=========傳感器信息=====================unsignedcharflagsearch[8]={0};unsignedcharsum=0;unsignedcharsearchData;//=========右轉(zhuǎn)信息============unsignedcharRturn=0;constunsignedcharRtable[]={0xf0,0xf8,0xfc};intsock;charbuff[128];socklen_taddr_len;structsockaddr_ins_addr;structsockaddr_inc_addr;char*sendc="end";三、工程實現(xiàn)3.5源程序分析constunsignedchartable[]={0x9f,0xcf,0xe7,0xf3,0xf9,0x8f,0xc7,0xe3,0xf1};//=======================PWM結(jié)構(gòu)體================================typedefstructPwmModel{ charen_pwm;//1:ONPWM0:OFFPWM intmotor_L;//LEFTspeed intmotor_R; charen_L_motor;//1:Enable0:OFF charen_R_motor; chardir_L;//0:resver1:forward chardir_R; //intpwm_fd;}PWMMODEL;typedefstructmotorModel{ intproportion; //斜率值,也即比例因子

intspeedNormal; //正常情況下的速度

intspeed; //要發(fā)送的速度}MOTORMODEL;//PWM指針structPwmModelp_pwm;structPwmModel*pPWM=&p_pwm;int_CMP_dat[5]={0};PWMMODELmotor={1,0,0,0,0,0,0};三、工程實現(xiàn)3.5源程序分析voidmotor_run(){ unsignedcharpwm_cmd[9]; if(motor.motor_R>=0){ motor.dir_R=0; motor.motor_R=motor.motor_R>399?399:motor.motor_R; }else{ motor.dir_R=1; motor.motor_R=399-(-motor.motor_R); motor.motor_R=motor.motor_R>399?399:motor.motor_R; }

if(motor.motor_L>=0){ motor.dir_L=0; motor.motor_L=motor.motor_L>399?399:motor.motor_L; }else{ motor.dir_L=1; motor.motor_L=399-(-motor.motor_L); motor.motor_L=motor.motor_L>399?399:motor.motor_L; }

pwm_cmd[0]=motor.en_pwm; pwm_cmd[1]=motor.motor_R/10; pwm_cmd[2]=motor.motor_R%10; pwm_cmd[3]=motor.motor_L/10; pwm_cmd[4]=motor.motor_L%10; pwm_cmd[5]=motor.en_L_motor; pwm_cmd[6]=motor.en_R_motor; pwm_cmd[7]=motor.dir_R; pwm_cmd[8]=motor.dir_L;

三、工程實現(xiàn)3.5源程序分析if((_CMP_dat[0]!=motor.en_pwm)||(_CMP_dat[1]!=motor.motor_L)||(_CMP_dat[2]!=motor.motor_R)||(_CMP_dat[3]!=motor.dir_L)||(_CMP_dat[4]!=motor.dir_R)) {_CMP_dat[0]=motor.en_pwm; _CMP_dat[1]=motor.motor_R; _CMP_dat[2]=motor.motor_L; _CMP_dat[3]=motor.dir_R; _CMP_dat[4]=motor.dir_L; ioctl(fd_pwm,sizeof(pwm_cmd),pwm_cmd); }}voidinit_Pwm(void){ motor.en_pwm=1; motor.motor_L=0; motor.motor_R=0; motor.dir_L=0; motor.dir_R=0; motor_run();}三、工程實現(xiàn)3.5源程序分析清零碼盤值=========================================================*/voidclrMP(){inti; for(i=0;i<6;i++)value[i]=0; write(fd_MP,value,6);}三、工程實現(xiàn)3.5源程序分析/*=================================================尋線,leixing=0找到任務(wù)點停車,leixing=1尋線過斑馬線speed尋線速度〔-399到〕,rate拐彎速率,ma=1清零碼盤==================================================*/intonLine(intleixing,intspeed,intrate,intmp){ //inttime=1en_R_motor0; unsignedcharcmd=-1; intcmd2=-1; inti; //floatspeedOld=0.5; unsignedcharsearchOld; unsignedcharsearchData2; unsignedcharsearchData1; intflat=0; intcs=0; inttemp=0; inttem=0,temb=0,temc=0; floatcorSpeed=0; floatpianyi=4.5; intbai=0; for(;;){ usleep(2000);

三、工程實現(xiàn)3.5源程序分析read(deteFd,&searchData,sizeof(searchData)); temp=0; sum=0; if(leixing==0){ if(searchData==0){searchData=searchOld;} else{searchOld=searchData;} } if(leixing==1){ if(searchData==255&&searchOld!=255){cs++;printf("quanhai!\n");} if(cs==1){pianyi=3.5;rate=90;} if(cs>=2)break; if(searchData!=0&&searchOld==0){ searchData2=searchData; printf("searchData2=%d\n",searchData2); } searchOld=searchData; if(searchData==0){searchData=searchData2;} if(cs==1&&searchData==0){pianyi==4.5;rate=90;} if(cs==1&&searchData==0x18){pianyi=3.5;} }

searchData1=searchData; for(i=0;i<8;i++) { flagsearch[i]=searchData1&0x01; searchData1>>=1; if(flagsearch[i]){sum++;temp+=(i+1);} if(searchData==table[i])flat=1; }

三、工程實現(xiàn)3.5源程序分析if(leixing==0&&flat==1){break;} if(sum!=0) corSpeed=temp*1.0/sum-pianyi; elsecorSpeed=0; if(mp==1){ for(i=0;i<sizeof(Rtable);i++){ if(searchData==Rtable[i]){ clrMP(); break; } } } motor.motor_R=(int)(-corSpeed*rate+speed); motor.motor_L=(int)(corSpeed*rate+speed); motor_run();

} motor.motor_R=0,motor.motor_L=0; motor_run(); return0;}三、工程實現(xiàn)3.5源程序分析/*=================================================任務(wù)結(jié)束,以一定速度離開任務(wù)點==================================================*/voidoutTask(intonL,intonR){ inti; unsignedcharsearchData; motor.motor_R=onR,motor.motor_L=onL; motor_run(); for(;;){ read(deteFd,&searchData,sizeof(searchData)); for(i=0;i<8;i++){ if(searchData==table[i])break; } if(i>=8)break; }}三、工程實現(xiàn)3.5源程序分析voidthread(void){ for(;;){ if(threadOver==1){break;} read(fd_MP,value,6); }

}/*========================================================設(shè)置電機速度-399~399,正數(shù)表示前進,負數(shù)表示后退=========================================================*/voidsetSpeed(intonL,intonR){ motor.motor_L=onL;//LEFTspee

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論