嵌入式系統(tǒng)設計與開發(fā)-基于ARM Cortex-A9和Linux 課件 第10章 ARM-Linux軟件開發(fā)基礎_第1頁
嵌入式系統(tǒng)設計與開發(fā)-基于ARM Cortex-A9和Linux 課件 第10章 ARM-Linux軟件開發(fā)基礎_第2頁
嵌入式系統(tǒng)設計與開發(fā)-基于ARM Cortex-A9和Linux 課件 第10章 ARM-Linux軟件開發(fā)基礎_第3頁
嵌入式系統(tǒng)設計與開發(fā)-基于ARM Cortex-A9和Linux 課件 第10章 ARM-Linux軟件開發(fā)基礎_第4頁
嵌入式系統(tǒng)設計與開發(fā)-基于ARM Cortex-A9和Linux 課件 第10章 ARM-Linux軟件開發(fā)基礎_第5頁
已閱讀5頁,還剩143頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第十章ARM-Linux軟件開發(fā)流程北京航空航天大學電工電子中心2025年5月提綱ARM_Linux軟件開發(fā)流程嵌入式軟件開發(fā)工具嵌入式軟件的交叉開發(fā)環(huán)境嵌入式軟件的調(diào)試嵌入式開發(fā)環(huán)境搭建MakefileU-BootARM-Linux軟件開發(fā)流程.s:擴展名為.s的文件是匯編源文件,是嵌入式系統(tǒng)必不可少的文件。.c:擴展名為.c的文件是C源文件,是嵌入式系統(tǒng)文件最為常見形式。.cpp:擴展名為.cpp的文件是C++源文件,是面向?qū)ο缶幊坛R娢募问健?o:擴展名為.o的文件是目標文件,目標文件就是源代碼編譯后但未進行鏈接的那些中間文件(Windows的.obj和Linux下的.o)。在Linux下,.o文件也被稱為ELF(ExecutableLinkableFormat)文件。.axf:擴展名為.axf的文件是鏈接器處理后的文件,它是ARM芯片使用的文件格式,它除包含bin代碼外,還包括輸出給調(diào)試器的調(diào)試信息。.bin(.hex):ROMformat格式二進制文件的兩種形式是.bin和.hex。.a(.lib).a的文件在Linux系統(tǒng)下是靜態(tài)鏈接庫文件(Windows下稱為.lib文件),庫文件和目標文件一起生成可執(zhí)行文件。一段代碼或一個工程可以生成.a供別的工程調(diào)用,.a也可以是類似工程的源文件,作為鏈接器的輸入。文件擴展名armasm把匯編代碼生成.o文件armcc把C語言代碼生成.o文件armcpp把C++語言代碼生成.o文件armer是編譯器,把.o文件生成庫armlink是鏈接器,把.o文件變成.axf文件fromelf是一個處理工具,把.axf文件變成可運行的二進制文件,也可以直接處理.o文件,生成反匯編和調(diào)試信息DWARF2debugtables存放各種調(diào)試信息表開發(fā)流程中的各種軟件上述的源文件一步步編譯鏈接生成可執(zhí)行的ROMformat文件。使用了兩個工具:編譯器和鏈接器。編譯的過程就是把預處理完的文件進行一系列的詞法分析、語法分析、語義分析及優(yōu)化后生成相應的匯編代碼文件。鏈接是“組裝”,“組裝”的“原料”是編譯器生成的.o文件和擴展名為.a的庫文件。之所以會有這么多的.o文件,完全是因為程序的設計者追求代碼的小型化、模塊化以及多語言混合編程。鏈接的過程主要包括地址和空間分配(AddressandStorageAllocation)、符號決議(SymbolResolution)和重定位(Relocation)等步驟。在Linux系統(tǒng)中,編譯和鏈接是由Makefile文件完成的,Makefile文件編寫的依據(jù)是GNUMake。本章后面將有Makefile文件編寫的內(nèi)容。編譯器和鏈接器提綱ARM_Linux軟件開發(fā)流程嵌入式軟件開發(fā)工具嵌入式軟件的交叉開發(fā)環(huán)境嵌入式軟件的調(diào)試嵌入式開發(fā)環(huán)境搭建MakefileU-Boot與嵌入式OS無關的開發(fā)工具,用于開發(fā)板級測試軟件,輔助硬件調(diào)試基本的驅(qū)動程序系統(tǒng)軟件,如OS與嵌入式OS相關的開發(fā)工具,用于開發(fā)部分特定OS的驅(qū)動程序,BSP基于嵌入式OS的應用嵌入式軟件開發(fā)工具嵌入式軟件開發(fā)工具的分類根據(jù)不同的階段,嵌入式軟件開發(fā)工具可以分為需求分析工具(RequirementAnalysisTools)軟件設計工具(SoftwareDesignTools)編碼、調(diào)試工具(Coding&DebuggingTools)測試工具(TestingTools)配置管理工具、維護工具等嵌入式軟件開發(fā)工具的分類主要嵌入式軟件開發(fā)工具產(chǎn)品嵌入式軟件的編碼階段工具編碼階段,又稱為實現(xiàn)階段開發(fā)的三個步驟軟件的生成應用程序的編輯、交叉編譯和鏈接工具調(diào)試交叉調(diào)試工具、非交叉調(diào)試工具固化運行代碼燒寫工具嵌入式軟件的測試階段工具測試工具:一般都是通用工具常用測試工具內(nèi)存分析工具性能分析工具覆蓋分析工具缺陷跟蹤工具等測試階段工具—內(nèi)存分析工具

目的檢測動態(tài)內(nèi)存分配時產(chǎn)生的缺陷一些內(nèi)存錯誤難以再現(xiàn),不易追蹤內(nèi)存分析工具類型基于軟件的內(nèi)存分析工具:可能會對代碼的執(zhí)行性能帶來很大影響,從而影響系統(tǒng)的實時性;基于硬件的內(nèi)存分析工具:對系統(tǒng)性能影響小,但價格昂貴,并且只能在特定的環(huán)境中使用。測試階段工具—性能分析工具目的開發(fā)人員一般需要對系統(tǒng)的某些關鍵代碼進行優(yōu)化來改進性能。性能分析工具可以提供相關數(shù)據(jù),幫助確定哪些任務、代碼段消耗了過多的執(zhí)行時間,從而可以決定如何優(yōu)化軟件,以獲得更好的時間性能。引導開發(fā)人員發(fā)現(xiàn)在系統(tǒng)調(diào)用中存在的錯誤以及程序結(jié)構(gòu)上的缺陷。測試階段工具—覆蓋分析工具目的白盒測試追蹤哪些代碼被執(zhí)行過實現(xiàn)代碼插樁技術通過對插樁代碼執(zhí)行時反饋的數(shù)據(jù)進行分析總結(jié),可以確定哪些代碼被執(zhí)行過,哪些代碼被遺漏。功能覆蓋、分支覆蓋、條件覆蓋等信息覆蓋分析工具實例測試階段工具—邏輯分析儀工作機理在不打斷被測程序運行流程的基礎上,對程序運行中的相關信息進行采集,然后通過真實再現(xiàn)程序運行的邏輯流程和分析程序運行數(shù)據(jù),幫助用戶優(yōu)化系統(tǒng)設計和解決出現(xiàn)的問題。與調(diào)試工具的對比調(diào)試器:照相機邏輯分析儀:攝像機主要功能真實再現(xiàn)程序運行流程發(fā)現(xiàn)系統(tǒng)死鎖及軟件造成的死機發(fā)現(xiàn)系統(tǒng)內(nèi)存泄漏指導對任務的合理劃分指導關鍵路徑設計與驗證指導合理分配任務堆棧CPU使用率統(tǒng)計指導合理設計中斷服務程序測試階段工具—邏輯分析儀測試階段工具—邏輯分析儀向著開放的、集成化的方向發(fā)展具有系統(tǒng)設計、可視化建模、仿真和驗證功能自動生成代碼和文檔具有更高的靈活性嵌入式軟件開發(fā)工具發(fā)展趨勢提綱ARM_Linux軟件開發(fā)流程嵌入式軟件開發(fā)工具嵌入式軟件的交叉開發(fā)環(huán)境嵌入式軟件的調(diào)試嵌入式開發(fā)環(huán)境搭建MakefileU-Boot開發(fā)需要專門工具和特殊方法嵌入式交叉開發(fā)環(huán)境:宿主機、目標機、工具集采用交叉開發(fā)的方式進行嵌入式軟件開發(fā)宿主機(Host)

用于開發(fā)嵌入式系統(tǒng)的計算機。一般為PC機(或者工作站),具備豐富的軟硬件資源,為嵌入式軟件的開發(fā)提供全過程支持。目標機(Target)即面向應用所開發(fā)的嵌入式系統(tǒng),嵌入式軟件的運行環(huán)境。嵌入式軟件開發(fā)嵌入式軟件的交叉開發(fā)環(huán)境物理連接和邏輯連接物理連接是指宿主機與目標機通過物理線路連接在一起,連接方式主要有三種串口以太口JTAG、BDM等調(diào)試設備邏輯連接指宿主機與目標機間按某種通信協(xié)議建立起來的通信連接物理連接是邏輯連接的基礎。宿主機端的工具軟件集合文本編輯器交叉編譯器交叉調(diào)試器仿真器下載器等嵌入式軟件的交叉開發(fā)環(huán)境嵌入式軟件開發(fā)的實現(xiàn)階段,可分為三個步驟軟件的生成調(diào)試固化運行嵌入式軟件實現(xiàn)階段的開發(fā)過程嵌入式軟件的生成過程源代碼程序的編寫編譯成各個目標模塊鏈接成可供下載調(diào)試或固化的目標程序嵌入式軟件的編譯鏈接交叉編譯鏈接把在宿主機上編寫的高級語言程序編譯成可以運行在目標機上的代碼,即在宿主機上能夠編譯生成嵌入式微處理器上的二進制代碼。嵌入式軟件的調(diào)試交叉調(diào)試器是指調(diào)試程序和被調(diào)試程序運行在不同機器上的調(diào)試器調(diào)試器通過某種方式控制目標機上被調(diào)試程序的運行方式通過調(diào)試器能查看和修改目標機上的內(nèi)存、寄存器以及被調(diào)試程序中的變量等交叉調(diào)試與非交叉調(diào)試嵌入式軟件的調(diào)試交叉調(diào)試方式CrashandBurnRomMonitorRomEmulatorInCircuitEmulatorOnChipDebuggingSimulator方式(非交叉調(diào)試)嵌入式軟件的固化運行嵌入式軟件的固化運行?Boot模塊整個應用系統(tǒng)代碼的入口模塊?Boot模塊的主要功能初始化CPU環(huán)境,使目標機硬件初始化為已知的狀態(tài)初始化芯片的引腳初始化系統(tǒng)外部控制寄存器初始化基本輸入輸出設備初始化MMU,包括片選控制寄存器等執(zhí)行數(shù)據(jù)拷貝嵌入式軟件的固化運行提綱ARM_Linux軟件開發(fā)流程嵌入式軟件開發(fā)工具嵌入式軟件的交叉開發(fā)環(huán)境嵌入式軟件的調(diào)試嵌入式開發(fā)環(huán)境搭建MakefileU-Boot交叉調(diào)試方式CrashandBurnRomMonitorRomEmulatorInCircuitEmulatorOnChipDebugging非交叉調(diào)試方式--Simulator方式嵌入式軟件的調(diào)試方法CrashandBurn最早的嵌入式軟件調(diào)試方法ROM監(jiān)控程序被固化且運行在目標機上的一段程序負責監(jiān)控目標機上被調(diào)試程序的運行,與宿主機端的調(diào)試器一起完成對應用程序的調(diào)試。調(diào)試器與ROMMonitor之間的通信遵循遠程調(diào)試協(xié)議。ROMMonitorROMMonitor調(diào)試方式ROMMonitor初始化目標機初始化要求的外圍設備,如:最基本的串口和用于內(nèi)存刷新的系統(tǒng)計時器芯片;初始化用于下載目標代碼的內(nèi)存空間;初始化中斷控制器和安裝中斷處理程序。初始化自己的程序空間等待宿主機端調(diào)試器的命令ROMMonitor的初始化目標代碼下載對目標機系統(tǒng)內(nèi)存的讀寫對寄存器的讀寫設置和清除不同類型的斷點單步執(zhí)行指令復位系統(tǒng)…等調(diào)試功能ROMMonitor的功能啟動目標機,監(jiān)控器控制目標機,等待和調(diào)試器建立連接;啟動調(diào)試器,并和監(jiān)控器建立起通信連接;調(diào)試器將應用程序下載到目標機內(nèi)存空間中;調(diào)試器發(fā)出各種調(diào)試命令,監(jiān)控器解釋并執(zhí)行這些命令,通過目標機上的各種異常來獲取對目標機的控制,將命令執(zhí)行結(jié)果回傳給調(diào)試器;如果程序有問題,在調(diào)試器的幫助下定位錯誤;修改之后再重新編譯鏈接并下載程序,開始新的調(diào)試,如此反復直至程序正確運行為止。調(diào)試過程提高調(diào)試效率,縮短開發(fā)周期,降低成本簡單、方便可擴展性強,可支持許多高級調(diào)試功能成本低廉,不需專門的調(diào)試硬件支持幾乎所有的交叉調(diào)試器都支持這種方式優(yōu)點開發(fā)ROMMonitor采用CrashandBurn方法調(diào)試當ROMMonitor占用CPU時,應用程序不響應外部的中斷,因此不便調(diào)試有時間特性的程序。某些調(diào)試功能依賴于CPU硬件的支持(如硬件斷點功能)ROMMonitor占用目標機一定數(shù)量的資源,如CPU、RAM、ROM和通信設備等資源。調(diào)試環(huán)境不同于實際目標環(huán)境。缺點仿真開發(fā)缺少目標機環(huán)境、缺乏目標機芯片等資源的問題;利用仿真器件、仿真環(huán)境進行開發(fā)。硬件仿真開發(fā)ROMEmulatorICEOCD軟件模擬開發(fā)仿真開發(fā)方式

ROMEmulator是一種用于替代目標機上的ROM芯片的設備,即ROM仿真器。

原理目標機的CPU可以讀取ROMEmulator設備上ROM芯片的內(nèi)容;ROMEmulator設備上的ROM芯片的地址可以實時地映射到目標機的ROM地址空間,從而仿真目標機的ROM;ROMEmulator設備只是為目標機提供ROM芯片和在Target和Host間建立一條高速的通信通道;不完備的調(diào)試方式,需要結(jié)合ROMMonitor方式。ROMEmulator?優(yōu)點目標機可以沒有ROM芯片、可以使用ROMEmulator提供的ROM空間且不需要用別的工具來寫ROM。?缺點目標機必須能支持外部ROM存儲空間,而且由于其通常要和ROMMonitor配合使用,因此它擁有ROMMonitor的所有缺點ROMEmulatorICE(In-CircuitEmulator)

一種用于替代目標機上CPU的設備,即在線仿真器。原理比一般的CPU有更多的引出線,能夠?qū)?nèi)部的信號輸出到被控制的目標機。ICE上的Memory也可以被映射為目標代碼的程序空間,這樣即使在目標機不存在的情形下也可以進行代碼的調(diào)試。ICEICE功能特點同時支持軟件斷點和硬件斷點的設置軟件斷點:調(diào)試器實現(xiàn)的斷點,替換指令為斷點中斷指令來實現(xiàn),用于調(diào)試運行在RAM中的代碼。硬件斷點:CPU硬件支持實現(xiàn)的斷點,用于調(diào)試ROM/Flash中的程序和監(jiān)控程序?qū)ψ兞康脑L問。設置各種復雜的斷點和觸發(fā)器實時跟蹤目標程序的運行,并可實現(xiàn)選擇性的跟蹤支持“TimeStamp”允許用戶設置“Timer”提供“ShadowRAM”,能在不中斷被調(diào)試程序的運行下查看內(nèi)存和變量即非干擾調(diào)試查詢ICE優(yōu)點調(diào)試實時的應用系統(tǒng)調(diào)試設備驅(qū)動程序?qū)τ布M行功能和性能的測試支持實時性能分析缺點價格太昂貴,不利于團隊開發(fā)所仿CPU有限ICEOCD(OnChipDebugging)即片上調(diào)試,是CPU芯片提供的一種調(diào)試功能;可以認為是一種廉價的ICE功能;OCD的價格只有ICE的20%,但提供了ICE80%的功能。OCDOCD調(diào)試結(jié)構(gòu)調(diào)試原理CPU的工作模式分為一般模式和調(diào)試模式;一般模式下,CPU從內(nèi)存讀取指令執(zhí)行;調(diào)試模式下,CPU首先從調(diào)試端口讀取指令,通過調(diào)試端口可以控制CPU進入和退出調(diào)試模式;Host端的調(diào)試器可以直接向目標機發(fā)送要執(zhí)行的指令,讀寫目標機的內(nèi)存和各種寄存器,控制目標程序的運行以及完成各種復雜的調(diào)試功能。OCD優(yōu)點不占用目標機的資源調(diào)試環(huán)境和最終的程序運行環(huán)境基本一致支持軟硬斷點、Trace功能精確計量程序的執(zhí)行時間提供時序分析功能OCDOCD缺點調(diào)試的實時性不如ICE不支持非干擾調(diào)試查詢CPU必需具有OCD功能OCD存在各種實現(xiàn)JTAG(JointTestAccessGroup)(主流方式)BDM(BackgroundDebuggingMode)OnCE(OnChipEmulation)JTAG方式JTAG方式各種仿真器實例相關標準Simulator一種軟件模擬器,非交叉調(diào)試在宿主機上創(chuàng)建一個虛擬的目標機環(huán)境將應用代碼下載到這個虛擬目標機上運行/調(diào)試交叉調(diào)試方式存在如下缺點硬件支持必須有目標機或評估板易使用性普通編程人員不熟悉廉價性成本高可移植性、可擴展性不高團隊開發(fā)較難開發(fā)周期較長SimulatorSimulatorSimulator方式下應用開發(fā)程序環(huán)境示意圖SimulatorSimulator提綱ARM_Linux軟件開發(fā)流程嵌入式軟件開發(fā)工具嵌入式軟件的交叉開發(fā)環(huán)境嵌入式軟件的調(diào)試嵌入式開發(fā)環(huán)境搭建MakefileU-Boot開發(fā)環(huán)境的搭建包括兩部分的內(nèi)容:宿主機端軟件的安裝和目標機端軟件的安裝。宿主機端需要安裝的軟件包括虛擬機、Ubuntu,然后在Ubuntu平臺上安裝NFS網(wǎng)絡文件系統(tǒng),Samba軟件,tftp軟件,交叉編譯軟件。目標機方面,需要在宿主機Windows平臺上安裝Xshell軟件,在開發(fā)板上燒錄uboot、kernel和文件系統(tǒng)。開發(fā)環(huán)境搭建宿主機端軟件的安裝--安裝虛擬機在windows平臺安裝虛擬機,虛擬機使用VMware15,虛擬機下載鏈接https:///go/getworkstation-win。使用虛擬機,就可以擁有雙系統(tǒng),即可利用Windows資源的便利,又可在Linux環(huán)境下進行實驗和學習。VMware安裝完畢后的虛擬機界面如圖所示。宿主機端軟件的安裝--安裝Ubuntu有了虛擬機,就可以在上面安裝Linux系統(tǒng)了,本書在Linux的選取上選擇的是Ubantu,原因是Ubantu使用廣泛、開源、資料齊全。接下來在虛擬機中安裝ubuntu。ubuntu18.04下載鏈接https:///download/alternative-downloads。

安裝完ubuntu后的圖形界面如下圖所示。宿主機端軟件的安裝--安裝軟件NFSNFS網(wǎng)絡文件系統(tǒng),允許一個系統(tǒng)在網(wǎng)絡上與他人共享目錄和文件。這個軟件解決了宿主機和目標機之間文件共享的問題。NFS的安裝過程如下,安裝指令:sudoapt-getinstallnfs-kernel-server用vim指令打開配置文件:/etc/exports,在最后一行添加:/i.MX6*(rw,sync,no_root_squash,no_subtree_check)/i.MX6:與NFS服務客戶端共享的目錄。*:代表允許所有的網(wǎng)段訪問。rw:掛接此目錄的客戶端對該共享目錄具有讀/寫權(quán)限。sync:資料同步寫入內(nèi)存和硬盤。

no_root_squash:客戶機用root訪問該共享文件夾時,不映射root用戶。no_subtree_check:不檢查父目錄的權(quán)限。映射端口:

sudo/etc/init.d/rpcbindrestart重啟服務:

sudo/etc/init.d/nfs-kernel-serverrestart宿主機端軟件的安裝--安裝軟件sambaSamba在Linux和Windows系統(tǒng)之間實現(xiàn)文件共享。安裝指令:sudoapt-getinstallsamba配置文件:/etc/samba/smb.conf在最后一行添加以下代碼:

保存后退出。在虛擬機上設置虛擬機和宿主機在同一網(wǎng)段。在Windows桌面的左下角,在“搜索程序和文件”的地方輸入虛擬機的IP地址(例如,28),此時在主機上出現(xiàn)可以操作的共享文件夾,名字叫“print”。該文件夾用于在Linux和Windows系統(tǒng)之間進行文件共享。宿主機端軟件的安裝--安裝軟件tftptftp是在客戶機與服務器之間進行簡單文件傳輸?shù)膮f(xié)議。安裝指令:sudoapt-getinstalltftpd-hpa配置文件:/etc/default/tftpd-hpa添加:#/etc/default/tftpd-hpaTFTP_ΜSERNAME=“tftp”TFTP_DIRECTORY=“/tftpboot”TFTP_ADDRESS=“:69”TFTP_OPTIONS=“--secure”保存后退出。重啟服務:

sudoservicetftpd-hparestart宿主機端軟件的安裝--安裝軟件XshellXshell是在PC上安裝的軟件,供目標機使用,這是一個集成的超級終端,安裝完成后,PC的鍵盤和顯示器可供目標機使用。目標機端軟件的安裝目標機是北京博創(chuàng)智聯(lián)科技有限公司生產(chǎn)的實驗箱i.MX6Solo/6DL實驗科研平臺。核心部件是i.MX6Solo/6DL核心板。實驗箱左側(cè)有一個USB串口,用于下載燒錄目標機的可執(zhí)行代碼。到現(xiàn)在為止,目標機里的Flash存儲器還是空的,我們可通過宿主機把目標機要運行的代碼燒錄進去,要燒錄的程序包括U-boot、內(nèi)核、文件系統(tǒng)等。以下的操作在宿主機的Linux上完成。目標機端軟件的安裝--解壓源代碼到用戶目錄下uptech@uptech:~$tar-xzvf/home/now/fsl-6dl-source.tar.gzuptech@uptech:~$lsfsl-6dl-source/在fsl-6dl-source/目錄下出現(xiàn)四個文件夾:(1)u-boot2014,uboot源代碼目錄,完成系統(tǒng)引導啟動。(2)kernel-3.14.28,內(nèi)核源代碼目錄,目標機內(nèi)的操作系統(tǒng)內(nèi)核源碼。(3)rootfs,文件系統(tǒng)目錄,也稱根文件系統(tǒng),是操作系統(tǒng)的一部分。(4)sdk,交叉編譯器目錄,宿主機編譯目標機的工具,用于生成目標機運行的可執(zhí)行代碼。Linux系統(tǒng)將操作系統(tǒng)和用戶代碼分開編譯,分開下載燒錄,最大限度減少用戶代碼對操作系統(tǒng)運行安全的影響。目標機端軟件的安裝--安裝交叉編譯器uptech@uptech:~$sudoshfsl-6dl-source/sdk/poky-glibc-x86_64-meta-toolchain-qt5-cortexa9hf-vfp-neon-toolchain-1.7.sh這個交叉編譯器是在宿主機環(huán)境編譯目標機的i.MX6Solo/6DL芯片,編譯后的代碼只能在目標機上運行,不可以在宿主機上運行。目標機端軟件的安裝--單獨編譯uboot進入boot目錄:uptech@uptech:~$cduptech@uptech:~$cdfsl-6dl-source/u-boot2014/uptech@uptech:~/fsl-6dl-source/u-boot2014$exportARCH=armuptech@uptech:~/fsl-6dl-source/u-boot2014$source/opt/poky/1.7/environment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabiuptech@uptech:~/fsl-6dl-source/u-boot2014$make編譯完后會有u-boot.imx。我們把它復制到共享目錄uptech@uptech:~/fsl-6dl-source/u-boot2014$cpu-boot.imx/home/now/目標機端軟件的安裝--單獨編譯內(nèi)核進入kernel目錄:uptech@uptech:~/fsl-6dl-source/u-boot2014$cduptech@uptech:~$cdfsl-6dl-source/kernel-3.14.28/uptech@uptech:~/fsl-6dl-source/kernel-3.14.28$exportARCH=armuptech@uptech:~/fsl-6dl-source/kernel-3.14.28$source/opt/poky/1.7/environment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabi編譯內(nèi)核uptech@uptech:~/fsl-6dl-source/kernel-3.14.28$makezImage//zImage路徑在/arch/arm/boot目錄下目標機端軟件的安裝--編譯dtbuptech@uptech:~/fsl-6dl-source/kernel-3.14.28$makei.MX6dl-sabresd.dtb編譯完后會有arch/arm/boot/zImage和arch/arm/boot/dts/i.MX6dl-sabresd.dtb我們把它復制到共享目錄:uptech@uptech:~/fsl-6dl-source/kernel-3.14.28$cparch/arm/boot/zImage/home/now/uptech@uptech:~/fsl-6dl-source/kernel-3.14.28$cparch/arm/boot/dts/i.MX6dl-sabresd.dtb/home/now/目標機端軟件的安裝--文件系統(tǒng)直接復制到共享目錄:uptech@uptech:~/fsl-6dl-source/kernel-3.14.28$cd..uptech@uptech:~$cpfsl-6dl-source/rootfs/rootfs.tar.bz2/home/now/目標機端軟件的安裝--燒寫系統(tǒng)

撥碼開關設置如下,此處撥碼開關,on表示“1”

,off表示“0”。USBOTG模式:bit[1:8]=“00001100”,EMMC模式:bit[1:8]=“11010110”,燒寫程序是請按照USBOTG的方式撥動撥碼開關。燒寫完成之后,改回到運行EMMC模式。將USB線一端插入PC的USB接口,另一端接到i.MX6Solo/6DL平臺的USBOTG接口。給i.MX6Solo/6DL移動互聯(lián)網(wǎng)平臺插上12VDC電源,上電開機。運行Mfg-Tool軟件進行燒寫,這是博創(chuàng)智聯(lián)的一個批處理命令,文件名是mfgtool2-yocot-mx6-sabresd-emmc,下圖是燒錄下載界面。燒錄的文件包括uboot、內(nèi)核和文件系統(tǒng)。目標機端軟件的安裝--返回運行模式程序燒寫完畢,斷電關機,請按照EMMC(bit[1:8]=“11010110”)模式撥動撥碼開關,上電即可。提綱ARM_Linux軟件開發(fā)流程嵌入式軟件開發(fā)工具嵌入式軟件的交叉開發(fā)環(huán)境嵌入式軟件的調(diào)試嵌入式開發(fā)環(huán)境搭建MakefileU-BootmakefileARM-Linux開發(fā)中,源代碼生成可執(zhí)行代碼使用的工具是GNU的make。使用該工具編寫的文件叫makefile,有時也寫成Makefile。Linux操作的命令叫make,其作用是對庫和源程序編譯、鏈接。與此相對應的另外一個命令叫makeclean,其功能是刪除make生成的目標文件、可執(zhí)行文件和其他中間文件。GNUMake是一個控制計算機程序從代碼源文件到可執(zhí)行文件或其他非源文件生成過程的工具。控制命令通過稱為makefile的文件傳遞給make工具。makefile記錄了如何生成可執(zhí)行文件等命令。GNUmake的下載地址是https:///free-download/。makefile是一個配置文件,可以對程序編譯進行管理,其優(yōu)點是:避免復雜命令行編譯語句減少編譯所需時間讓編譯自動運行make是解釋makefile文件中指令的命令工具。makefile是一個配置文件,可以對程序編譯進行管理,其優(yōu)點是:避免復雜命令行編譯語句減少編譯所需時間讓編譯自動運行make是解釋makefile文件中指令的命令工具。makefile和makefile簡介makefile感性認識多文件的自動編譯makefile的工作原理makefile的操作規(guī)則如果工程沒有編譯過,所有的C文件都要編譯并被連接。如果工程的某幾個文件被修改,只需要編譯被修改的這幾個文件,并重新鏈接目標程序如果工程的頭文件被修改了,那么所有包含此頭文件的源文件都要重新編譯,并重新連接目標程序makefile的規(guī)則格式makefile和gccgcc編譯器完全可以滿足編譯c以及c++程序的需求,那么為什么還需要makefile呢?答案是makefile的作用是將gcc編譯的過程規(guī)則化,包括編譯順序,依賴關系,第二次進行增量編譯,編譯后的一些相關操作等。gcc的選項說明如下:-E只對源程序進行預處理,處理的結(jié)果會將源程序的注釋去掉。-S只輸出匯編代碼,不輸出目標代碼。-asm輸出目標文件的同時,也輸出相應的匯編代碼。-c用于把源碼文件編譯成.o對象文件,不進行鏈接過程。-o用于鏈接生成可執(zhí)行文件,在其后可以指定輸出文件的名稱。-g用于在生成的目標可執(zhí)行文件中,添加調(diào)試信息,可以使用GDB進行調(diào)試。-w關閉所有告警信息。-o表示編譯優(yōu)化選項,其后可跟優(yōu)化等級0\1\2\3,默認是0,不優(yōu)化。-fPIC用于生成位置無關的代碼。-v 顯示執(zhí)行編譯階段的命令,同時顯示編譯器驅(qū)動程序,預處理器,編譯器的版本號。-I<dir>用于把新目錄添加到include路徑上,可以使用相對路徑和絕對路徑。-l緊接著鏈接庫lpthread。-L指定鏈接庫的路徑。-shared編譯成動態(tài)鏈接庫。-Wall生成常見的所有警告信息,且停止編譯,具體是哪些警告信息,請參見gcc手冊,一般用這個足矣。對于一個簡單文件的流程,gcc命令如下:程序的運行過程:預處理->編譯->匯編->鏈接gcc-Ehello.c-ohello.i //預處理,生成代碼hello.igcc-Shello.i-ohello.s //編譯,生成匯編代碼hello.sgcc-chello.s-ohello.o //匯編,生成.o匯編文件hello.ogcchello.o-ohello //鏈接,生成可執(zhí)行文件hello閱讀Makefile文件時,時常會遇到以下三個變量:$@,$^,$<,它們所代表的含義分別是:$@--目標文件,$^--所有的依賴文件,$<--第一個依賴文件。Makefile實例分析Makefile實例分析—makefile命令執(zhí)行流程Makefile實例分析—makefile命令執(zhí)行流程Makefile實例分析—在makefile中使用變量Makefile實例分析—在makefile中使用變量Makefile實例分析—在make自動推導依賴關系Makefile實例分析—進一步簡化Makefile實例分析—在make自動推導依賴關系Makefile實例分析—在make自動推導依賴關系Makefile實例分析—進一步簡化Makefile實例分析—進一步簡化提綱ARM_Linux軟件開發(fā)流程嵌入式軟件開發(fā)工具嵌入式軟件的交叉開發(fā)環(huán)境嵌入式軟件的調(diào)試嵌入式開發(fā)環(huán)境搭建MakefileU-BootBootloader基礎—幾種常見的BootloaderU-BootBlobvivi嵌入式Linux系統(tǒng)中典型的分區(qū)結(jié)構(gòu)BootloaderKernelBootparametersRootfilesystemLinux系統(tǒng)中,“BootLoader”、“Bootparameters”、“Kernel”和“Rootfilesystem”在不同的分區(qū),分別編譯,獨立下載,便于管理。正常啟動過程(一般是上電開機)或硬復位,BootLoader首先運行,完成硬件設備的初始化和建立內(nèi)存空間映射圖,準備好傳遞給內(nèi)核的參數(shù),將系統(tǒng)硬軟件帶到一個合適的狀態(tài),為內(nèi)核運行做準備。Bootloader安裝地址和存儲介質(zhì)ARM上電復位從地址0x0000_0000取第一條指令。此時BootLoader存放的物理地址應該設置在0x0000_0000才能保證啟動代碼被啟動。當MMU啟動以后,需要完成地址重映射,將0x0000_0000交給中斷向量表使用??梢韵氲?,存儲BootLoader的介質(zhì)是非遺失存儲器,常常使用NORFlash,這部分代碼比較小,而且只執(zhí)行一次,沒有對時間特別苛刻的要求。串口是BootLoader的標配,串口配置參數(shù)通常是N,8,1,115200。通過觀察串口發(fā)送的數(shù)據(jù),可以了解啟動過程。考慮CPU的不同以及開發(fā)板硬件的差異性,幾乎沒有完全相同的兩個BootLoader,這要求設計者要對BootLoader做不同程度的修改,直到滿足要求為止。Bootloader的啟動的下載模式

該模式常用于第一次安裝內(nèi)核與根文件系統(tǒng)。此時的內(nèi)核和根文件系統(tǒng)在宿主機上,Bootloader在完成必要的初始化工作后,從宿主機上讀取內(nèi)核與根文件系統(tǒng)的映像文件,將其燒錄到相應的Linux分區(qū)的同時,將它們復制至RAM中運行。宿主機和開發(fā)板之間的通信,可以是串口,亦即使用上文提到的N,8,1,115200串口協(xié)議,也可以使用NFS和tftp的網(wǎng)絡協(xié)議。BootLoader的啟動加載模式啟動加載模式:這是產(chǎn)品發(fā)布后Bootloader的工作模式。無須人工干預,Bootloader在完成必要的初始化工作后,將固態(tài)存儲器的內(nèi)核和根文件系統(tǒng)加載到RAM中運行。U-Boot同時支持下載模式和啟動加載模式,允許用戶在兩種模式下切換。比如,U-Boot在啟動時處于正常的啟動加載模式,但是它會延長若干秒(可以在宿主機上設置),等待終端用戶按下任意鍵,而將U-Boot切換到下載模式。如果在指定時間內(nèi)沒有用戶按鍵,則U-Boot繼續(xù)啟動Linux內(nèi)核和根文件系統(tǒng)。當產(chǎn)品發(fā)布時,可將設定等待時間改為0,這樣可節(jié)省啟動時間。Flash和RAM的地址空間

按照BootLoader實現(xiàn)的功能不同,可將其代碼分為兩個部分,也稱兩個階段。劃分的目的是便于維護代碼。BootLoader第一階段代碼量比較小,一般用匯編語言編寫,編寫和CPU相關的代碼,完成硬件初始化,為第二階段準備RAM空間,復制BootLoader第二階段代碼到RAM空間。BootLoader第二階段的工作是,初始化本階段要使用的設備,檢測內(nèi)存映射,將內(nèi)核和根文件系統(tǒng)復制到RAM,為內(nèi)核設置啟動參數(shù),啟動內(nèi)核。BootLoader的二階段劃分基本硬件初始化。包括屏蔽所有中斷,關看門狗,設置CPU速度和時鐘頻率,RAM初始化,點亮對應的LED指示燈。為加載第二階段準備RAM空間。復制第二階段代碼到RAM中。設置堆棧指針。跳轉(zhuǎn)到第二階段的入口。Bootloader第一階段調(diào)入C庫。第二階段的代碼使用C語言編寫,首先要調(diào)入C語言的函數(shù)庫。用C語言編寫初始化階段要使用的硬件設備。串口打印相應的信息到終端表明已進入BootLoader的第二階段。檢測系統(tǒng)的內(nèi)存映射,同時將內(nèi)存映射的結(jié)果打印到串口。加載內(nèi)核映像和根文件系統(tǒng)映像。這部分工作要考慮這兩個文件的大小,為了避免文件覆蓋,一般各取1MB的RAM分別給內(nèi)核和根文件系統(tǒng)。設置內(nèi)核啟動參數(shù)。BootLoader設置的常見啟動參數(shù)有ATAG_CORE、ATAG_MEM、ATAG_CMDLINE、ATAG_RAMDISK、ATAG_INITRD等。調(diào)用內(nèi)核。這部分內(nèi)容包括CPU寄存器設置,CPU模式設置,Cache和MMU的設置。完成這部分工作后,打印串口,表明BootLoader第二階段工作結(jié)束。Bootloader第二階段U-Boot代碼結(jié)構(gòu)U-Boot代碼結(jié)構(gòu)--物理層物理層,平臺相關的或開發(fā)板相關的。board:開發(fā)板相關文件,根據(jù)不同開發(fā)板定制的代碼,主要包含SDRAM、Flash驅(qū)動。有一些經(jīng)典的開發(fā)板,board目錄下是一些和開發(fā)板相關的文件,如果采用和開發(fā)板完全相同的硬件設計,這部分可以直接使用,尚若設計有所改動,設計軟件要做相應的修改。arch:與體系結(jié)構(gòu)相關的代碼全部放在這里,包括arm、x86、powerpc、mipc等主流CPU。i.MX6Solo/6DL相關文件所在目錄是\UBoot\u-boot2014\arch\arm\cpu\armv7,說明i.MX6Solo/6DL是armv7架構(gòu)。該目錄下主要的幾個文件是:cpu.s、interrupt.c、startup.S。startup.S是U-Boot啟動的第一個文件,也是系統(tǒng)啟動的第一個文件。include:U-Boot頭文件,尤其在configs子目錄下與開發(fā)板相關的配置頭文件是移植過程中經(jīng)常要修改的文件。lib:通用庫文件。U-Boot代碼結(jié)構(gòu)--設備驅(qū)動層設備驅(qū)動層,通用的設備驅(qū)動程序。disk:磁盤分區(qū)相關代碼。dts:設備樹相關代碼。nand_spl:采用spl模式的nandboot代碼。drivers:通用設備驅(qū)動,如CFIFlash驅(qū)動(目前對INTELFlash支持較好)。U-Boot代碼結(jié)構(gòu)--文件層文件層,文件相關。post:上電自檢文件目錄。net:與網(wǎng)絡功能相關的文件目錄,如bootp,NFS,tftp。fs:文件系統(tǒng),支持嵌入式開發(fā)板常見的文件系統(tǒng)。disk:驅(qū)動的分區(qū)處理代碼。U-Boot代碼結(jié)構(gòu)--應用層應用層,U-Boot工具、示例程序、文檔。(common:獨立于處理器體系結(jié)構(gòu)的通用代碼,如內(nèi)存大小探測與故障檢測。doc:U-Boot的說明文檔。examples:可在U-Boot下運行的示例程序;如hello_world.c,timer.c。tools:用于創(chuàng)建U-BootS-RECORD和BIN鏡像文件的工具。api:U-Boot提供給外部應用的API函數(shù)。test:U-Boot測試代碼。License:U-Boot是自由軟件。scripts:腳本語言支持。利用U-Boot中的autoscr命令,可以在U-Boot中運行“腳本”。首先在文本文件中輸入需要執(zhí)行的命令,然后用tools/mkimage封裝,然后下載到開發(fā)板上,用autoscr執(zhí)行就可以了。U-Boot代碼分析--查找鏈接配置文件GNUgcc編譯器對代碼進行編譯后,由鏈接器決定目標程序在存儲器將如何存放。鏈接器的這個文件名是u-boot.lds,也叫鏈接腳本文件。U-Boot頂層的Makefile在變量名LDSCRIPT指定鏈接腳本文件。U-Boot代碼分析--鏈接器配置文件u-boot.ldsu-boot.lds的部分代碼如下:其中,OUTPUT_FORMAT:指定鏈接器輸出文件是elf格式,32位ARM指令,小端存儲。OUTPUT_ARCH:指定輸出文件平臺是ARM。ENTRY(_start):指定輸出文件起始代碼段為start。.=0x00000000:程序的入口地址是0x00000000。.text:是程序段定義,大括號內(nèi)的三句是程序的目標文件存放順序,本書的U-Boot文件不涉及__image_copy_start。因此,start.o存放在0x00000000位置。CPUDIR/start.o(.text*):這個start.o是start.s編譯得到的目標文件。*(.text*)是所有程序。.rodata:是只讀數(shù)據(jù)段,例如查用的正弦表。.data:數(shù)據(jù)段,例如棧、堆、變量。U-Boot代碼分析--鏈接器配置文件u-boot.lds(續(xù))U-Boot代碼分析--

start.s代碼分析上述的一段代碼就是異常中斷向量表,b是跳轉(zhuǎn)指令。ldrpc同樣是跳轉(zhuǎn)指令,通過給PC寄存器(R15)賦值實現(xiàn)跳轉(zhuǎn)。異常中斷向量表共8行,每行占4個字節(jié),共占用存儲器起始部分的32個字節(jié)(0x00000000~0x0000001f)。后面的7行是7個中斷源的入口跳轉(zhuǎn)地址。程序的第一行breset是跳轉(zhuǎn)代碼,跳轉(zhuǎn)到reset標號處。這個異常中斷向量表特別重要,程序會經(jīng)常進入這些地方。即便是操作系統(tǒng)內(nèi)核已經(jīng)接管了CPU的控制權(quán),一旦發(fā)生異常中斷,ARM處理器便強制把PC指針指向異常中斷向量表中對應中斷類型的地址值,然后從中斷向量表里取出對應的中斷服務子程序的地址,并賦給PC,PC得到地址,實現(xiàn)跳轉(zhuǎn),去執(zhí)行中斷程序。U-Boot代碼分析--

start.s代碼分析在U-Boot的開始階段,程序只會執(zhí)行第一句代碼,因為其他中斷或者異常處理的條件都不具備,例如中斷堆棧。這部分工作在哪里做呢?在接下來的reset開始的代碼段。上述代碼是復位處理常用的形式,由匯編語言書寫,關看門狗、關FIQ、關IRQ、設置SVC管理模式,save_boot_params是個子程序,根據(jù)需要可以在該子程序中保存boot參數(shù)。在這里中斷源是必須關閉的,此時中斷處理的條件依舊不具備。U-Boot代碼分析--

start.s代碼分析U-Boot代碼分析--

start.s代碼分析再次修改異常向量表入口地址為0x0,調(diào)用cpu_init_cp15和cpu_init_crit,轉(zhuǎn)到_main,至此,start.s代碼結(jié)束。U-Boot代碼分析--

start.s代碼分析cpu_init_cp15函數(shù)是配置cp15協(xié)處理器相關寄存器,來設置處理器的MMU,cache以及TLB。如果沒有定義CONFIG_SYS_ICACHE_OFF,則會打開icache。關掉MMU以及TLB。具體配置過程可以對照cp15寄存器,這里不詳細說了。

接下來看cpu_init_crit:U-Boot代碼分析--

start.s代碼分析U-Boot代碼分析--

start.s代碼分析cpu_init_crit調(diào)用的lowlevel_init函數(shù)是與特定開發(fā)板相關的初始化函數(shù),在這個函數(shù)里首先解決堆棧的問題,指定堆棧的地址,為函數(shù)的調(diào)用做準備。會做一些pll初始化,如果不是從mem啟動,則會做memory初始化,方便后續(xù)復制到mem中運行。從cpu_init_crit返回后,_start的工作就完成了,接下來就要調(diào)用_main,_main開始的部分任然是BootLoader代碼,是BootLoader的第二階段代碼。U-Boot代碼分析--

start.s代碼分析總結(jié)一下_start工作:初始化異常向量表,設置svc模式,關中斷。配置cp15,初始化MMU、cache、TLB。處理堆棧指針,調(diào)用C庫,板級初始化,pll、memory初始化。U-Boot代碼分析--

_main部分代碼分析_main在arch\arm\lib\crt0.S中定義,部分代碼如下_main處理U-Boot啟動過程中需要C運行時環(huán)境的與目標無關的階段。完成如下工作:⑴

調(diào)用board_init_f()前的準備工作。設置GD(全局數(shù)據(jù))和SP(堆棧指針),為CONSTANT數(shù)據(jù)提供地址空間,而BSS(BlockStartedbySymbol)則不行。⑵

調(diào)用board_init_f()。這個函數(shù)為從系統(tǒng)RAM執(zhí)行準備硬件。由于系統(tǒng)RAM可能還不可用,因此board_init_f()必須使用當前的GD來存儲必須傳遞到后面階段的任何數(shù)據(jù)。這些數(shù)據(jù)包括重新定位目的地、未來的堆棧和未來的GD位置。⑶~⑹用于non-SPLbuilds模式。U-Boot代碼分析--

_main部分代碼分析⑶設置中間環(huán)境。其中堆棧和GD是由board_init_f()在系統(tǒng)RAM中分配的,但是BSS和初始化的非常量數(shù)據(jù)仍然不可用。⑷調(diào)用relocate_code()。這個函數(shù)將U-Boot從當前位置重新定位到由board_init_f()計算的重新定位目標。⑸設置調(diào)用board_init_r()的最終環(huán)境。這個環(huán)境有BSS(初始化為0)、初始化非常量數(shù)據(jù)(初始化為它們的預期值)systemRAM中的堆棧。GD保留了由board_init_f()設置的值。此時,一些cpu在內(nèi)存方面還有一些工作要做,因此調(diào)用c_runtime_cpu_setup。⑹跳轉(zhuǎn)到board_init_r()。U-Boot代碼分析--

_main部分代碼分析board_init_r函數(shù)目錄:\u-boot2014\common\board_r.c。在board_init_r函數(shù)中調(diào)用initcall_run_list(init_sequence_r),進行初始化序列工作,初始化的最后一個函數(shù)是run_main_loop,進入死循環(huán)階段。run_main_loop函數(shù)調(diào)用\u-boot2014\common\main.c的main_loop函數(shù),init_sequence_r序列函數(shù)中的第二個函數(shù)是initr_reloc,用于向重定位后的代碼中全局變量gd→flag設置gd→flags|=GD_FLG_RELOC|GD_FLG_FULL_MALLOC_INIT標志位,該標志指示現(xiàn)處于重定位地址段執(zhí)行uboot函數(shù),這樣在每次循環(huán)執(zhí)行函數(shù)前都會提示重定位信息。init_sequence_r序列中的函數(shù)主要是板級的初始化函數(shù),與具體的硬件相關。接下來啟動Linux內(nèi)核。至此,BootLoader啟動完畢。U-Boot代碼分析--

_main部分代碼分析1.Makefile修改進入u-boot主目錄,打開Makefileroot@uptech:~$cd/home/uptech/fsl-6dl-source/u-boot2014/root@uptech:~/fsl-6dl-source/u-boot2014$vimMakefile前幾行可以看到u-boot的信息:版本2014,補丁04。在文件下(200行下面為交叉編譯器的安裝路徑)ifeq($(HOSTARCH),$(ARCH))CROSS_COMPILE?=endifCROSS_COMPILE?=/opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-其中CROSS_COMPILE為交叉編譯器的默認絕對路徑,根據(jù)自己的安裝路徑,直接在這修改即可。U-Boot移植--Makefile修改2.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論