




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第十章ARM-Linux軟件開發流程北京航空航天大學電工電子中心2025年5月提綱ARM_Linux軟件開發流程嵌入式軟件開發工具嵌入式軟件的交叉開發環境嵌入式軟件的調試嵌入式開發環境搭建MakefileU-BootARM-Linux軟件開發流程.s:擴展名為.s的文件是匯編源文件,是嵌入式系統必不可少的文件。.c:擴展名為.c的文件是C源文件,是嵌入式系統文件最為常見形式。.cpp:擴展名為.cpp的文件是C++源文件,是面向對象編程常見文件形式。.o:擴展名為.o的文件是目標文件,目標文件就是源代碼編譯后但未進行鏈接的那些中間文件(Windows的.obj和Linux下的.o)。在Linux下,.o文件也被稱為ELF(ExecutableLinkableFormat)文件。.axf:擴展名為.axf的文件是鏈接器處理后的文件,它是ARM芯片使用的文件格式,它除包含bin代碼外,還包括輸出給調試器的調試信息。.bin(.hex):ROMformat格式二進制文件的兩種形式是.bin和.hex。.a(.lib).a的文件在Linux系統下是靜態鏈接庫文件(Windows下稱為.lib文件),庫文件和目標文件一起生成可執行文件。一段代碼或一個工程可以生成.a供別的工程調用,.a也可以是類似工程的源文件,作為鏈接器的輸入。文件擴展名armasm把匯編代碼生成.o文件armcc把C語言代碼生成.o文件armcpp把C++語言代碼生成.o文件armer是編譯器,把.o文件生成庫armlink是鏈接器,把.o文件變成.axf文件fromelf是一個處理工具,把.axf文件變成可運行的二進制文件,也可以直接處理.o文件,生成反匯編和調試信息DWARF2debugtables存放各種調試信息表開發流程中的各種軟件上述的源文件一步步編譯鏈接生成可執行的ROMformat文件。使用了兩個工具:編譯器和鏈接器。編譯的過程就是把預處理完的文件進行一系列的詞法分析、語法分析、語義分析及優化后生成相應的匯編代碼文件。鏈接是“組裝”,“組裝”的“原料”是編譯器生成的.o文件和擴展名為.a的庫文件。之所以會有這么多的.o文件,完全是因為程序的設計者追求代碼的小型化、模塊化以及多語言混合編程。鏈接的過程主要包括地址和空間分配(AddressandStorageAllocation)、符號決議(SymbolResolution)和重定位(Relocation)等步驟。在Linux系統中,編譯和鏈接是由Makefile文件完成的,Makefile文件編寫的依據是GNUMake。本章后面將有Makefile文件編寫的內容。編譯器和鏈接器提綱ARM_Linux軟件開發流程嵌入式軟件開發工具嵌入式軟件的交叉開發環境嵌入式軟件的調試嵌入式開發環境搭建MakefileU-Boot與嵌入式OS無關的開發工具,用于開發板級測試軟件,輔助硬件調試基本的驅動程序系統軟件,如OS與嵌入式OS相關的開發工具,用于開發部分特定OS的驅動程序,BSP基于嵌入式OS的應用嵌入式軟件開發工具嵌入式軟件開發工具的分類根據不同的階段,嵌入式軟件開發工具可以分為需求分析工具(RequirementAnalysisTools)軟件設計工具(SoftwareDesignTools)編碼、調試工具(Coding&DebuggingTools)測試工具(TestingTools)配置管理工具、維護工具等嵌入式軟件開發工具的分類主要嵌入式軟件開發工具產品嵌入式軟件的編碼階段工具編碼階段,又稱為實現階段開發的三個步驟軟件的生成應用程序的編輯、交叉編譯和鏈接工具調試交叉調試工具、非交叉調試工具固化運行代碼燒寫工具嵌入式軟件的測試階段工具測試工具:一般都是通用工具常用測試工具內存分析工具性能分析工具覆蓋分析工具缺陷跟蹤工具等測試階段工具—內存分析工具
目的檢測動態內存分配時產生的缺陷一些內存錯誤難以再現,不易追蹤內存分析工具類型基于軟件的內存分析工具:可能會對代碼的執行性能帶來很大影響,從而影響系統的實時性;基于硬件的內存分析工具:對系統性能影響小,但價格昂貴,并且只能在特定的環境中使用。測試階段工具—性能分析工具目的開發人員一般需要對系統的某些關鍵代碼進行優化來改進性能。性能分析工具可以提供相關數據,幫助確定哪些任務、代碼段消耗了過多的執行時間,從而可以決定如何優化軟件,以獲得更好的時間性能。引導開發人員發現在系統調用中存在的錯誤以及程序結構上的缺陷。測試階段工具—覆蓋分析工具目的白盒測試追蹤哪些代碼被執行過實現代碼插樁技術通過對插樁代碼執行時反饋的數據進行分析總結,可以確定哪些代碼被執行過,哪些代碼被遺漏。功能覆蓋、分支覆蓋、條件覆蓋等信息覆蓋分析工具實例測試階段工具—邏輯分析儀工作機理在不打斷被測程序運行流程的基礎上,對程序運行中的相關信息進行采集,然后通過真實再現程序運行的邏輯流程和分析程序運行數據,幫助用戶優化系統設計和解決出現的問題。與調試工具的對比調試器:照相機邏輯分析儀:攝像機主要功能真實再現程序運行流程發現系統死鎖及軟件造成的死機發現系統內存泄漏指導對任務的合理劃分指導關鍵路徑設計與驗證指導合理分配任務堆棧CPU使用率統計指導合理設計中斷服務程序測試階段工具—邏輯分析儀測試階段工具—邏輯分析儀向著開放的、集成化的方向發展具有系統設計、可視化建模、仿真和驗證功能自動生成代碼和文檔具有更高的靈活性嵌入式軟件開發工具發展趨勢提綱ARM_Linux軟件開發流程嵌入式軟件開發工具嵌入式軟件的交叉開發環境嵌入式軟件的調試嵌入式開發環境搭建MakefileU-Boot開發需要專門工具和特殊方法嵌入式交叉開發環境:宿主機、目標機、工具集采用交叉開發的方式進行嵌入式軟件開發宿主機(Host)
用于開發嵌入式系統的計算機。一般為PC機(或者工作站),具備豐富的軟硬件資源,為嵌入式軟件的開發提供全過程支持。目標機(Target)即面向應用所開發的嵌入式系統,嵌入式軟件的運行環境。嵌入式軟件開發嵌入式軟件的交叉開發環境物理連接和邏輯連接物理連接是指宿主機與目標機通過物理線路連接在一起,連接方式主要有三種串口以太口JTAG、BDM等調試設備邏輯連接指宿主機與目標機間按某種通信協議建立起來的通信連接物理連接是邏輯連接的基礎。宿主機端的工具軟件集合文本編輯器交叉編譯器交叉調試器仿真器下載器等嵌入式軟件的交叉開發環境嵌入式軟件開發的實現階段,可分為三個步驟軟件的生成調試固化運行嵌入式軟件實現階段的開發過程嵌入式軟件的生成過程源代碼程序的編寫編譯成各個目標模塊鏈接成可供下載調試或固化的目標程序嵌入式軟件的編譯鏈接交叉編譯鏈接把在宿主機上編寫的高級語言程序編譯成可以運行在目標機上的代碼,即在宿主機上能夠編譯生成嵌入式微處理器上的二進制代碼。嵌入式軟件的調試交叉調試器是指調試程序和被調試程序運行在不同機器上的調試器調試器通過某種方式控制目標機上被調試程序的運行方式通過調試器能查看和修改目標機上的內存、寄存器以及被調試程序中的變量等交叉調試與非交叉調試嵌入式軟件的調試交叉調試方式CrashandBurnRomMonitorRomEmulatorInCircuitEmulatorOnChipDebuggingSimulator方式(非交叉調試)嵌入式軟件的固化運行嵌入式軟件的固化運行?Boot模塊整個應用系統代碼的入口模塊?Boot模塊的主要功能初始化CPU環境,使目標機硬件初始化為已知的狀態初始化芯片的引腳初始化系統外部控制寄存器初始化基本輸入輸出設備初始化MMU,包括片選控制寄存器等執行數據拷貝嵌入式軟件的固化運行提綱ARM_Linux軟件開發流程嵌入式軟件開發工具嵌入式軟件的交叉開發環境嵌入式軟件的調試嵌入式開發環境搭建MakefileU-Boot交叉調試方式CrashandBurnRomMonitorRomEmulatorInCircuitEmulatorOnChipDebugging非交叉調試方式--Simulator方式嵌入式軟件的調試方法CrashandBurn最早的嵌入式軟件調試方法ROM監控程序被固化且運行在目標機上的一段程序負責監控目標機上被調試程序的運行,與宿主機端的調試器一起完成對應用程序的調試。調試器與ROMMonitor之間的通信遵循遠程調試協議。ROMMonitorROMMonitor調試方式ROMMonitor初始化目標機初始化要求的外圍設備,如:最基本的串口和用于內存刷新的系統計時器芯片;初始化用于下載目標代碼的內存空間;初始化中斷控制器和安裝中斷處理程序。初始化自己的程序空間等待宿主機端調試器的命令ROMMonitor的初始化目標代碼下載對目標機系統內存的讀寫對寄存器的讀寫設置和清除不同類型的斷點單步執行指令復位系統…等調試功能ROMMonitor的功能啟動目標機,監控器控制目標機,等待和調試器建立連接;啟動調試器,并和監控器建立起通信連接;調試器將應用程序下載到目標機內存空間中;調試器發出各種調試命令,監控器解釋并執行這些命令,通過目標機上的各種異常來獲取對目標機的控制,將命令執行結果回傳給調試器;如果程序有問題,在調試器的幫助下定位錯誤;修改之后再重新編譯鏈接并下載程序,開始新的調試,如此反復直至程序正確運行為止。調試過程提高調試效率,縮短開發周期,降低成本簡單、方便可擴展性強,可支持許多高級調試功能成本低廉,不需專門的調試硬件支持幾乎所有的交叉調試器都支持這種方式優點開發ROMMonitor采用CrashandBurn方法調試當ROMMonitor占用CPU時,應用程序不響應外部的中斷,因此不便調試有時間特性的程序。某些調試功能依賴于CPU硬件的支持(如硬件斷點功能)ROMMonitor占用目標機一定數量的資源,如CPU、RAM、ROM和通信設備等資源。調試環境不同于實際目標環境。缺點仿真開發缺少目標機環境、缺乏目標機芯片等資源的問題;利用仿真器件、仿真環境進行開發。硬件仿真開發ROMEmulatorICEOCD軟件模擬開發仿真開發方式
ROMEmulator是一種用于替代目標機上的ROM芯片的設備,即ROM仿真器。
原理目標機的CPU可以讀取ROMEmulator設備上ROM芯片的內容;ROMEmulator設備上的ROM芯片的地址可以實時地映射到目標機的ROM地址空間,從而仿真目標機的ROM;ROMEmulator設備只是為目標機提供ROM芯片和在Target和Host間建立一條高速的通信通道;不完備的調試方式,需要結合ROMMonitor方式。ROMEmulator?優點目標機可以沒有ROM芯片、可以使用ROMEmulator提供的ROM空間且不需要用別的工具來寫ROM。?缺點目標機必須能支持外部ROM存儲空間,而且由于其通常要和ROMMonitor配合使用,因此它擁有ROMMonitor的所有缺點ROMEmulatorICE(In-CircuitEmulator)
一種用于替代目標機上CPU的設備,即在線仿真器。原理比一般的CPU有更多的引出線,能夠將內部的信號輸出到被控制的目標機。ICE上的Memory也可以被映射為目標代碼的程序空間,這樣即使在目標機不存在的情形下也可以進行代碼的調試。ICEICE功能特點同時支持軟件斷點和硬件斷點的設置軟件斷點:調試器實現的斷點,替換指令為斷點中斷指令來實現,用于調試運行在RAM中的代碼。硬件斷點:CPU硬件支持實現的斷點,用于調試ROM/Flash中的程序和監控程序對變量的訪問。設置各種復雜的斷點和觸發器實時跟蹤目標程序的運行,并可實現選擇性的跟蹤支持“TimeStamp”允許用戶設置“Timer”提供“ShadowRAM”,能在不中斷被調試程序的運行下查看內存和變量即非干擾調試查詢ICE優點調試實時的應用系統調試設備驅動程序對硬件進行功能和性能的測試支持實時性能分析缺點價格太昂貴,不利于團隊開發所仿CPU有限ICEOCD(OnChipDebugging)即片上調試,是CPU芯片提供的一種調試功能;可以認為是一種廉價的ICE功能;OCD的價格只有ICE的20%,但提供了ICE80%的功能。OCDOCD調試結構調試原理CPU的工作模式分為一般模式和調試模式;一般模式下,CPU從內存讀取指令執行;調試模式下,CPU首先從調試端口讀取指令,通過調試端口可以控制CPU進入和退出調試模式;Host端的調試器可以直接向目標機發送要執行的指令,讀寫目標機的內存和各種寄存器,控制目標程序的運行以及完成各種復雜的調試功能。OCD優點不占用目標機的資源調試環境和最終的程序運行環境基本一致支持軟硬斷點、Trace功能精確計量程序的執行時間提供時序分析功能OCDOCD缺點調試的實時性不如ICE不支持非干擾調試查詢CPU必需具有OCD功能OCD存在各種實現JTAG(JointTestAccessGroup)(主流方式)BDM(BackgroundDebuggingMode)OnCE(OnChipEmulation)JTAG方式JTAG方式各種仿真器實例相關標準Simulator一種軟件模擬器,非交叉調試在宿主機上創建一個虛擬的目標機環境將應用代碼下載到這個虛擬目標機上運行/調試交叉調試方式存在如下缺點硬件支持必須有目標機或評估板易使用性普通編程人員不熟悉廉價性成本高可移植性、可擴展性不高團隊開發較難開發周期較長SimulatorSimulatorSimulator方式下應用開發程序環境示意圖SimulatorSimulator提綱ARM_Linux軟件開發流程嵌入式軟件開發工具嵌入式軟件的交叉開發環境嵌入式軟件的調試嵌入式開發環境搭建MakefileU-Boot開發環境的搭建包括兩部分的內容:宿主機端軟件的安裝和目標機端軟件的安裝。宿主機端需要安裝的軟件包括虛擬機、Ubuntu,然后在Ubuntu平臺上安裝NFS網絡文件系統,Samba軟件,tftp軟件,交叉編譯軟件。目標機方面,需要在宿主機Windows平臺上安裝Xshell軟件,在開發板上燒錄uboot、kernel和文件系統。開發環境搭建宿主機端軟件的安裝--安裝虛擬機在windows平臺安裝虛擬機,虛擬機使用VMware15,虛擬機下載鏈接https:///go/getworkstation-win。使用虛擬機,就可以擁有雙系統,即可利用Windows資源的便利,又可在Linux環境下進行實驗和學習。VMware安裝完畢后的虛擬機界面如圖所示。宿主機端軟件的安裝--安裝Ubuntu有了虛擬機,就可以在上面安裝Linux系統了,本書在Linux的選取上選擇的是Ubantu,原因是Ubantu使用廣泛、開源、資料齊全。接下來在虛擬機中安裝ubuntu。ubuntu18.04下載鏈接https:///download/alternative-downloads。
安裝完ubuntu后的圖形界面如下圖所示。宿主機端軟件的安裝--安裝軟件NFSNFS網絡文件系統,允許一個系統在網絡上與他人共享目錄和文件。這個軟件解決了宿主機和目標機之間文件共享的問題。NFS的安裝過程如下,安裝指令:sudoapt-getinstallnfs-kernel-server用vim指令打開配置文件:/etc/exports,在最后一行添加:/i.MX6*(rw,sync,no_root_squash,no_subtree_check)/i.MX6:與NFS服務客戶端共享的目錄。*:代表允許所有的網段訪問。rw:掛接此目錄的客戶端對該共享目錄具有讀/寫權限。sync:資料同步寫入內存和硬盤。
no_root_squash:客戶機用root訪問該共享文件夾時,不映射root用戶。no_subtree_check:不檢查父目錄的權限。映射端口:
sudo/etc/init.d/rpcbindrestart重啟服務:
sudo/etc/init.d/nfs-kernel-serverrestart宿主機端軟件的安裝--安裝軟件sambaSamba在Linux和Windows系統之間實現文件共享。安裝指令:sudoapt-getinstallsamba配置文件:/etc/samba/smb.conf在最后一行添加以下代碼:
保存后退出。在虛擬機上設置虛擬機和宿主機在同一網段。在Windows桌面的左下角,在“搜索程序和文件”的地方輸入虛擬機的IP地址(例如,28),此時在主機上出現可以操作的共享文件夾,名字叫“print”。該文件夾用于在Linux和Windows系統之間進行文件共享。宿主機端軟件的安裝--安裝軟件tftptftp是在客戶機與服務器之間進行簡單文件傳輸的協議。安裝指令: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的鍵盤和顯示器可供目標機使用。目標機端軟件的安裝目標機是北京博創智聯科技有限公司生產的實驗箱i.MX6Solo/6DL實驗科研平臺。核心部件是i.MX6Solo/6DL核心板。實驗箱左側有一個USB串口,用于下載燒錄目標機的可執行代碼。到現在為止,目標機里的Flash存儲器還是空的,我們可通過宿主機把目標機要運行的代碼燒錄進去,要燒錄的程序包括U-boot、內核、文件系統等。以下的操作在宿主機的Linux上完成。目標機端軟件的安裝--解壓源代碼到用戶目錄下uptech@uptech:~$tar-xzvf/home/now/fsl-6dl-source.tar.gzuptech@uptech:~$lsfsl-6dl-source/在fsl-6dl-source/目錄下出現四個文件夾:(1)u-boot2014,uboot源代碼目錄,完成系統引導啟動。(2)kernel-3.14.28,內核源代碼目錄,目標機內的操作系統內核源碼。(3)rootfs,文件系統目錄,也稱根文件系統,是操作系統的一部分。(4)sdk,交叉編譯器目錄,宿主機編譯目標機的工具,用于生成目標機運行的可執行代碼。Linux系統將操作系統和用戶代碼分開編譯,分開下載燒錄,最大限度減少用戶代碼對操作系統運行安全的影響。目標機端軟件的安裝--安裝交叉編譯器uptech@uptech:~$sudoshfsl-6dl-source/sdk/poky-glibc-x86_64-meta-toolchain-qt5-cortexa9hf-vfp-neon-toolchain-1.7.sh這個交叉編譯器是在宿主機環境編譯目標機的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/目標機端軟件的安裝--單獨編譯內核進入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編譯內核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/目標機端軟件的安裝--文件系統直接復制到共享目錄:uptech@uptech:~/fsl-6dl-source/kernel-3.14.28$cd..uptech@uptech:~$cpfsl-6dl-source/rootfs/rootfs.tar.bz2/home/now/目標機端軟件的安裝--燒寫系統
撥碼開關設置如下,此處撥碼開關,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移動互聯網平臺插上12VDC電源,上電開機。運行Mfg-Tool軟件進行燒寫,這是博創智聯的一個批處理命令,文件名是mfgtool2-yocot-mx6-sabresd-emmc,下圖是燒錄下載界面。燒錄的文件包括uboot、內核和文件系統。目標機端軟件的安裝--返回運行模式程序燒寫完畢,斷電關機,請按照EMMC(bit[1:8]=“11010110”)模式撥動撥碼開關,上電即可。提綱ARM_Linux軟件開發流程嵌入式軟件開發工具嵌入式軟件的交叉開發環境嵌入式軟件的調試嵌入式開發環境搭建MakefileU-BootmakefileARM-Linux開發中,源代碼生成可執行代碼使用的工具是GNU的make。使用該工具編寫的文件叫makefile,有時也寫成Makefile。Linux操作的命令叫make,其作用是對庫和源程序編譯、鏈接。與此相對應的另外一個命令叫makeclean,其功能是刪除make生成的目標文件、可執行文件和其他中間文件。GNUMake是一個控制計算機程序從代碼源文件到可執行文件或其他非源文件生成過程的工具??刂泼钔ㄟ^稱為makefile的文件傳遞給make工具。makefile記錄了如何生成可執行文件等命令。GNUmake的下載地址是https:///free-download/。makefile是一個配置文件,可以對程序編譯進行管理,其優點是:避免復雜命令行編譯語句減少編譯所需時間讓編譯自動運行make是解釋makefile文件中指令的命令工具。makefile是一個配置文件,可以對程序編譯進行管理,其優點是:避免復雜命令行編譯語句減少編譯所需時間讓編譯自動運行make是解釋makefile文件中指令的命令工具。makefile和makefile簡介makefile感性認識多文件的自動編譯makefile的工作原理makefile的操作規則如果工程沒有編譯過,所有的C文件都要編譯并被連接。如果工程的某幾個文件被修改,只需要編譯被修改的這幾個文件,并重新鏈接目標程序如果工程的頭文件被修改了,那么所有包含此頭文件的源文件都要重新編譯,并重新連接目標程序makefile的規則格式makefile和gccgcc編譯器完全可以滿足編譯c以及c++程序的需求,那么為什么還需要makefile呢?答案是makefile的作用是將gcc編譯的過程規則化,包括編譯順序,依賴關系,第二次進行增量編譯,編譯后的一些相關操作等。gcc的選項說明如下:-E只對源程序進行預處理,處理的結果會將源程序的注釋去掉。-S只輸出匯編代碼,不輸出目標代碼。-asm輸出目標文件的同時,也輸出相應的匯編代碼。-c用于把源碼文件編譯成.o對象文件,不進行鏈接過程。-o用于鏈接生成可執行文件,在其后可以指定輸出文件的名稱。-g用于在生成的目標可執行文件中,添加調試信息,可以使用GDB進行調試。-w關閉所有告警信息。-o表示編譯優化選項,其后可跟優化等級0\1\2\3,默認是0,不優化。-fPIC用于生成位置無關的代碼。-v 顯示執行編譯階段的命令,同時顯示編譯器驅動程序,預處理器,編譯器的版本號。-I<dir>用于把新目錄添加到include路徑上,可以使用相對路徑和絕對路徑。-l緊接著鏈接庫lpthread。-L指定鏈接庫的路徑。-shared編譯成動態鏈接庫。-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 //鏈接,生成可執行文件hello閱讀Makefile文件時,時常會遇到以下三個變量:$@,$^,$<,它們所代表的含義分別是:$@--目標文件,$^--所有的依賴文件,$<--第一個依賴文件。Makefile實例分析Makefile實例分析—makefile命令執行流程Makefile實例分析—makefile命令執行流程Makefile實例分析—在makefile中使用變量Makefile實例分析—在makefile中使用變量Makefile實例分析—在make自動推導依賴關系Makefile實例分析—進一步簡化Makefile實例分析—在make自動推導依賴關系Makefile實例分析—在make自動推導依賴關系Makefile實例分析—進一步簡化Makefile實例分析—進一步簡化提綱ARM_Linux軟件開發流程嵌入式軟件開發工具嵌入式軟件的交叉開發環境嵌入式軟件的調試嵌入式開發環境搭建MakefileU-BootBootloader基礎—幾種常見的BootloaderU-BootBlobvivi嵌入式Linux系統中典型的分區結構BootloaderKernelBootparametersRootfilesystemLinux系統中,“BootLoader”、“Bootparameters”、“Kernel”和“Rootfilesystem”在不同的分區,分別編譯,獨立下載,便于管理。正常啟動過程(一般是上電開機)或硬復位,BootLoader首先運行,完成硬件設備的初始化和建立內存空間映射圖,準備好傳遞給內核的參數,將系統硬軟件帶到一個合適的狀態,為內核運行做準備。Bootloader安裝地址和存儲介質ARM上電復位從地址0x0000_0000取第一條指令。此時BootLoader存放的物理地址應該設置在0x0000_0000才能保證啟動代碼被啟動。當MMU啟動以后,需要完成地址重映射,將0x0000_0000交給中斷向量表使用。可以想到,存儲BootLoader的介質是非遺失存儲器,常常使用NORFlash,這部分代碼比較小,而且只執行一次,沒有對時間特別苛刻的要求。串口是BootLoader的標配,串口配置參數通常是N,8,1,115200。通過觀察串口發送的數據,可以了解啟動過程。考慮CPU的不同以及開發板硬件的差異性,幾乎沒有完全相同的兩個BootLoader,這要求設計者要對BootLoader做不同程度的修改,直到滿足要求為止。Bootloader的啟動的下載模式
該模式常用于第一次安裝內核與根文件系統。此時的內核和根文件系統在宿主機上,Bootloader在完成必要的初始化工作后,從宿主機上讀取內核與根文件系統的映像文件,將其燒錄到相應的Linux分區的同時,將它們復制至RAM中運行。宿主機和開發板之間的通信,可以是串口,亦即使用上文提到的N,8,1,115200串口協議,也可以使用NFS和tftp的網絡協議。BootLoader的啟動加載模式啟動加載模式:這是產品發布后Bootloader的工作模式。無須人工干預,Bootloader在完成必要的初始化工作后,將固態存儲器的內核和根文件系統加載到RAM中運行。U-Boot同時支持下載模式和啟動加載模式,允許用戶在兩種模式下切換。比如,U-Boot在啟動時處于正常的啟動加載模式,但是它會延長若干秒(可以在宿主機上設置),等待終端用戶按下任意鍵,而將U-Boot切換到下載模式。如果在指定時間內沒有用戶按鍵,則U-Boot繼續啟動Linux內核和根文件系統。當產品發布時,可將設定等待時間改為0,這樣可節省啟動時間。Flash和RAM的地址空間
按照BootLoader實現的功能不同,可將其代碼分為兩個部分,也稱兩個階段。劃分的目的是便于維護代碼。BootLoader第一階段代碼量比較小,一般用匯編語言編寫,編寫和CPU相關的代碼,完成硬件初始化,為第二階段準備RAM空間,復制BootLoader第二階段代碼到RAM空間。BootLoader第二階段的工作是,初始化本階段要使用的設備,檢測內存映射,將內核和根文件系統復制到RAM,為內核設置啟動參數,啟動內核。BootLoader的二階段劃分基本硬件初始化。包括屏蔽所有中斷,關看門狗,設置CPU速度和時鐘頻率,RAM初始化,點亮對應的LED指示燈。為加載第二階段準備RAM空間。復制第二階段代碼到RAM中。設置堆棧指針。跳轉到第二階段的入口。Bootloader第一階段調入C庫。第二階段的代碼使用C語言編寫,首先要調入C語言的函數庫。用C語言編寫初始化階段要使用的硬件設備。串口打印相應的信息到終端表明已進入BootLoader的第二階段。檢測系統的內存映射,同時將內存映射的結果打印到串口。加載內核映像和根文件系統映像。這部分工作要考慮這兩個文件的大小,為了避免文件覆蓋,一般各取1MB的RAM分別給內核和根文件系統。設置內核啟動參數。BootLoader設置的常見啟動參數有ATAG_CORE、ATAG_MEM、ATAG_CMDLINE、ATAG_RAMDISK、ATAG_INITRD等。調用內核。這部分內容包括CPU寄存器設置,CPU模式設置,Cache和MMU的設置。完成這部分工作后,打印串口,表明BootLoader第二階段工作結束。Bootloader第二階段U-Boot代碼結構U-Boot代碼結構--物理層物理層,平臺相關的或開發板相關的。board:開發板相關文件,根據不同開發板定制的代碼,主要包含SDRAM、Flash驅動。有一些經典的開發板,board目錄下是一些和開發板相關的文件,如果采用和開發板完全相同的硬件設計,這部分可以直接使用,尚若設計有所改動,設計軟件要做相應的修改。arch:與體系結構相關的代碼全部放在這里,包括arm、x86、powerpc、mipc等主流CPU。i.MX6Solo/6DL相關文件所在目錄是\UBoot\u-boot2014\arch\arm\cpu\armv7,說明i.MX6Solo/6DL是armv7架構。該目錄下主要的幾個文件是:cpu.s、interrupt.c、startup.S。startup.S是U-Boot啟動的第一個文件,也是系統啟動的第一個文件。include:U-Boot頭文件,尤其在configs子目錄下與開發板相關的配置頭文件是移植過程中經常要修改的文件。lib:通用庫文件。U-Boot代碼結構--設備驅動層設備驅動層,通用的設備驅動程序。disk:磁盤分區相關代碼。dts:設備樹相關代碼。nand_spl:采用spl模式的nandboot代碼。drivers:通用設備驅動,如CFIFlash驅動(目前對INTELFlash支持較好)。U-Boot代碼結構--文件層文件層,文件相關。post:上電自檢文件目錄。net:與網絡功能相關的文件目錄,如bootp,NFS,tftp。fs:文件系統,支持嵌入式開發板常見的文件系統。disk:驅動的分區處理代碼。U-Boot代碼結構--應用層應用層,U-Boot工具、示例程序、文檔。(common:獨立于處理器體系結構的通用代碼,如內存大小探測與故障檢測。doc:U-Boot的說明文檔。examples:可在U-Boot下運行的示例程序;如hello_world.c,timer.c。tools:用于創建U-BootS-RECORD和BIN鏡像文件的工具。api:U-Boot提供給外部應用的API函數。test:U-Boot測試代碼。License:U-Boot是自由軟件。scripts:腳本語言支持。利用U-Boot中的autoscr命令,可以在U-Boot中運行“腳本”。首先在文本文件中輸入需要執行的命令,然后用tools/mkimage封裝,然后下載到開發板上,用autoscr執行就可以了。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:是程序段定義,大括號內的三句是程序的目標文件存放順序,本書的U-Boot文件不涉及__image_copy_start。因此,start.o存放在0x00000000位置。CPUDIR/start.o(.text*):這個start.o是start.s編譯得到的目標文件。*(.text*)是所有程序。.rodata:是只讀數據段,例如查用的正弦表。.data:數據段,例如棧、堆、變量。U-Boot代碼分析--鏈接器配置文件u-boot.lds(續)U-Boot代碼分析--
start.s代碼分析上述的一段代碼就是異常中斷向量表,b是跳轉指令。ldrpc同樣是跳轉指令,通過給PC寄存器(R15)賦值實現跳轉。異常中斷向量表共8行,每行占4個字節,共占用存儲器起始部分的32個字節(0x00000000~0x0000001f)。后面的7行是7個中斷源的入口跳轉地址。程序的第一行breset是跳轉代碼,跳轉到reset標號處。這個異常中斷向量表特別重要,程序會經常進入這些地方。即便是操作系統內核已經接管了CPU的控制權,一旦發生異常中斷,ARM處理器便強制把PC指針指向異常中斷向量表中對應中斷類型的地址值,然后從中斷向量表里取出對應的中斷服務子程序的地址,并賦給PC,PC得到地址,實現跳轉,去執行中斷程序。U-Boot代碼分析--
start.s代碼分析在U-Boot的開始階段,程序只會執行第一句代碼,因為其他中斷或者異常處理的條件都不具備,例如中斷堆棧。這部分工作在哪里做呢?在接下來的reset開始的代碼段。上述代碼是復位處理常用的形式,由匯編語言書寫,關看門狗、關FIQ、關IRQ、設置SVC管理模式,save_boot_params是個子程序,根據需要可以在該子程序中保存boot參數。在這里中斷源是必須關閉的,此時中斷處理的條件依舊不具備。U-Boot代碼分析--
start.s代碼分析U-Boot代碼分析--
start.s代碼分析再次修改異常向量表入口地址為0x0,調用cpu_init_cp15和cpu_init_crit,轉到_main,至此,start.s代碼結束。U-Boot代碼分析--
start.s代碼分析cpu_init_cp15函數是配置cp15協處理器相關寄存器,來設置處理器的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調用的lowlevel_init函數是與特定開發板相關的初始化函數,在這個函數里首先解決堆棧的問題,指定堆棧的地址,為函數的調用做準備。會做一些pll初始化,如果不是從mem啟動,則會做memory初始化,方便后續復制到mem中運行。從cpu_init_crit返回后,_start的工作就完成了,接下來就要調用_main,_main開始的部分任然是BootLoader代碼,是BootLoader的第二階段代碼。U-Boot代碼分析--
start.s代碼分析總結一下_start工作:初始化異常向量表,設置svc模式,關中斷。配置cp15,初始化MMU、cache、TLB。處理堆棧指針,調用C庫,板級初始化,pll、memory初始化。U-Boot代碼分析--
_main部分代碼分析_main在arch\arm\lib\crt0.S中定義,部分代碼如下_main處理U-Boot啟動過程中需要C運行時環境的與目標無關的階段。完成如下工作:⑴
調用board_init_f()前的準備工作。設置GD(全局數據)和SP(堆棧指針),為CONSTANT數據提供地址空間,而BSS(BlockStartedbySymbol)則不行。⑵
調用board_init_f()。這個函數為從系統RAM執行準備硬件。由于系統RAM可能還不可用,因此board_init_f()必須使用當前的GD來存儲必須傳遞到后面階段的任何數據。這些數據包括重新定位目的地、未來的堆棧和未來的GD位置。⑶~⑹用于non-SPLbuilds模式。U-Boot代碼分析--
_main部分代碼分析⑶設置中間環境。其中堆棧和GD是由board_init_f()在系統RAM中分配的,但是BSS和初始化的非常量數據仍然不可用。⑷調用relocate_code()。這個函數將U-Boot從當前位置重新定位到由board_init_f()計算的重新定位目標。⑸設置調用board_init_r()的最終環境。這個環境有BSS(初始化為0)、初始化非常量數據(初始化為它們的預期值)systemRAM中的堆棧。GD保留了由board_init_f()設置的值。此時,一些cpu在內存方面還有一些工作要做,因此調用c_runtime_cpu_setup。⑹跳轉到board_init_r()。U-Boot代碼分析--
_main部分代碼分析board_init_r函數目錄:\u-boot2014\common\board_r.c。在board_init_r函數中調用initcall_run_list(init_sequence_r),進行初始化序列工作,初始化的最后一個函數是run_main_loop,進入死循環階段。run_main_loop函數調用\u-boot2014\common\main.c的main_loop函數,init_sequence_r序列函數中的第二個函數是initr_reloc,用于向重定位后的代碼中全局變量gd→flag設置gd→flags|=GD_FLG_RELOC|GD_FLG_FULL_MALLOC_INIT標志位,該標志指示現處于重定位地址段執行uboot函數,這樣在每次循環執行函數前都會提示重定位信息。init_sequence_r序列中的函數主要是板級的初始化函數,與具體的硬件相關。接下來啟動Linux內核。至此,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為交叉編譯器的默認絕對路徑,根據自己的安裝路徑,直接在這修改即可。U-Boot移植--Makefile修改2.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 北京安全生產試題及答案
- 機械制造企業服務化轉型數字化轉型與智能化升級報告001
- 如何培訓企業直播課件
- 安全運輸試題及答案
- 職業技能培訓在農村公共文化服務體系建設中的應用報告
- 2025年工業污染場地修復技術方案評估與成本效益分析報告
- 電器火災消防培訓課件
- 安全警示活動試題及答案
- 安全核查試題及答案
- 2025年線下演出市場演出市場細分領域市場研究預測研究報告
- TSG ZF001-2006《安全閥安全技術監察規程》
- 高中 思想政治 必修1 第一課 社會主義從空想到科學、從理論到實踐的發展《課時1 原始社會的解體和階級社會的演進》課件
- 自動尋優控制系統在生料立磨中的應用實踐
- 土地延期合同范本
- 四川省綿陽市涪城區2024-2025學年七年級上學期開學考試語文試題(解析版)
- DL∕T 796-2012 風力發電場安全規程
- 部編版八年級升九年級歷史暑假預習知識清單(填空+答案)
- 四川省自貢市2023-2024學年七年級下學期期末數學試題(解析版)
- (正式版)JB∕T 11108-2024 建筑施工機械與設備 筒式柴油打樁錘
- 大型分析儀器原理與應用智慧樹知到期末考試答案章節答案2024年山東第一醫科大學
- 企業員工保密協議書范本
評論
0/150
提交評論