![微處理器系統結構與嵌入式系統設計課件_第1頁](http://file4.renrendoc.com/view/9670fbd51eacfda7de8dd5903543f16e/9670fbd51eacfda7de8dd5903543f16e1.gif)
![微處理器系統結構與嵌入式系統設計課件_第2頁](http://file4.renrendoc.com/view/9670fbd51eacfda7de8dd5903543f16e/9670fbd51eacfda7de8dd5903543f16e2.gif)
![微處理器系統結構與嵌入式系統設計課件_第3頁](http://file4.renrendoc.com/view/9670fbd51eacfda7de8dd5903543f16e/9670fbd51eacfda7de8dd5903543f16e3.gif)
![微處理器系統結構與嵌入式系統設計課件_第4頁](http://file4.renrendoc.com/view/9670fbd51eacfda7de8dd5903543f16e/9670fbd51eacfda7de8dd5903543f16e4.gif)
![微處理器系統結構與嵌入式系統設計課件_第5頁](http://file4.renrendoc.com/view/9670fbd51eacfda7de8dd5903543f16e/9670fbd51eacfda7de8dd5903543f16e5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
2022/11/181第十一章
基于ARM的軟件系統設計1、嵌入式軟件系統結構及工作流程2、嵌入式軟件系統的引導和加載
S3C2440啟動過程、BootLoader基本概念、
U-boot的分析與移植3、嵌入式Linux操作系統
嵌入式操作系統、嵌入式Linux內核4、Linux下驅動程序設計示例
打開串口、設置串口、讀寫串口、關閉串口2022/11/101第十一章基于ARM的軟件系統設計1第十一章結束第十一章結束2022/11/183嵌入式軟件系統結構簡單的嵌入式應用
若嵌入式系統的功能需求比較簡單,嵌入式系統軟件只需完成較簡單的監(jiān)控、驅動和處理功能,則不需要嵌入式操作系統的支持。如基于8051的應用:玩具、家電、汽車等的控制系統復雜的嵌入式應用
若嵌入式系統的功能需求比較復雜,需要圖形用戶界面、網絡管理、存儲管理、進程/線程管理或需要支持二次開發(fā)等,則通過嵌入式操作系統的幫助,可以加快嵌入式系統軟件的開發(fā)進度和可靠性。如基于ARM的應用:手機、PDA2022/11/103嵌入式軟件系統結構簡單的嵌入式應用2022/11/184簡單嵌入式系統軟件結構不需要使用操作系統,基于裸機開發(fā)典型單任務程序架構(1)從CPU復位時的指定地址開始執(zhí)行;(2)跳轉至匯編代碼startup處執(zhí)行;(3)跳轉至用戶主程序main執(zhí)行,在main中完成:a.初試化各硬件設備;b.初始化各軟件模塊;c.進入死循環(huán)(無限循環(huán)),調用各模塊的處理函數2022/11/104簡單嵌入式系統軟件結構不需要使用操作系2022/11/185用戶主程序和各模塊的處理函數都以C語言完成。用戶主程序最后都進入了一個死循環(huán),直到系統停電或者出現重大錯誤。voidmain(void){ ……//變量、參數等的定義及說明
X_init(); //系統初始化,一般為匯編代碼
While(1)X();//超級循環(huán)}2022/11/105用戶主程序和各模塊的處理函數都以C語言2022/11/186復雜嵌入式系統軟件的一般結構ARM+M+I/OHAL、底層封裝、部分由OS提供BOOTLOAD2022/11/106復雜嵌入式系統軟件的一般結構ARM+M2022/11/187復雜嵌入式系統軟件工作流程2022/11/107復雜嵌入式系統軟件工作流程2022/11/188S3C2440啟動方式
三星公司的S3C2440支持NorFlash和NandFlash啟動,可以通過硬件跳線(引腳OM[1:0])設置啟動方式。具體含義如下:OM[1:0]=00時,處理器從NANDFlash啟動OM[1:0]=01時,處理器從16位寬度的NorFlash啟動OM[1:0]=10時,處理器從32位寬度的NorFlash啟動OM[1:0]=11時,處理器從TestMode啟動2022/11/108S3C2440啟動方式 三星公司2022/11/189S3C2440NandFlashS3C2440NandFlash啟動過程
在系統上電后,NandFlash控制器會自動的把NandFlash上的前4KU-BOOT數據搬移到內部SRAM的地址最低端(此SRAM被稱為Steppingstone); CPU從內部RAM的0x00000000位置開始啟動并在uboot啟動代碼的前4K里完成S3C2440的核心配置,然后把U-BOOT剩余部分搬到RAM中運行;2022/11/109S3C2440NandFlash2022/11/1810引導程序BootLoader是嵌入式系統在加電啟動后執(zhí)行的第一段代碼,功能類似pc機的BIOS和OSLoader,通常需要固化在目標板中;主要負責CPU、存儲器及相關硬件的初始化,以及將裝載操作系統映像到內存中,然后跳轉到規(guī)定的地址啟動操作系統運行。Bootloader是嚴重依賴硬件而實現的,每一種不同體系結構的處理器都有不同的Bootloader,甚至同一種處理器的外圍硬件配置不同,其Bootloader也有差別。因此開發(fā)特定的Bootloader是構建嵌入式linux系統之前的一項必要的基礎工作。2022/11/1010引導程序BootLoader是嵌入式2022/11/1811Bootloader的運行步驟Stage1(匯編實現)基本硬件設備初始化:CPU時鐘頻率,寄存器,存儲器數據寬度、訪問周期、刷新周期,中斷系統,I/O端口等;為第二階段準備RAM空間,設置堆棧;復制第二階段代碼到RAM中,并跳轉到第二階段入口點Stage2(C實現)初始化本階段要使用的硬件設備,實現對板級驅動的支持;檢測系統內存映射;將內核鏡像和根文件系統鏡像從flash讀到RAM中;為內核設置啟動參數;將PC指針指向內核的入口處,調用內核。掛載文件系統;2022/11/1011Bootloader的運行步驟Sta2022/11/1812Linux環(huán)境下BootLoader種類BootloaderMonitor描
述x86ARMPowerPCLILO否Linux磁盤引導程序是否否GRUB否GNU的LILO替代程序是否否Loadlin否從DOS引導Linux是否否ROLO否從ROM引導Linux而不需要BIOS是否否Etherboot否通過以太網卡啟動Linux系統的固件是否否LinuxBIOS否完全替代BUIS的Linux引導程序是否否BLOB否LART等硬件平臺引導程序否是否U-boot是通用引導程序是是是RedBoot是基于eCos的引導程序是是是2022/11/1012Linux環(huán)境下BootLoade2022/11/1813U-boot的分析與移植 U-boot全稱UniversalBootLoader,支持ARM體系等多種處理器,包含常見的外設的驅動,是一個開源的、功能強大的板極支持包;由德國DENX軟件工程中心的WolfgangDenk維護。 U-boot啟動時處于正常的啟動加載模式,但是它會延時指定時間(單位秒)等待終端用戶按下任意鍵而切換到下載模式,如果在指定時間內用戶沒有按鍵,則繼續(xù)啟動操作系統。2022/11/1013U-boot的分析與移植 U-bo2022/11/1814U-boot主要包括以下目錄board:該目錄存放了U-Boot支持的一些已有開發(fā)板的信息。每一個開發(fā)板都以一個子目錄出現在當前目錄中,如SMDK2410子目錄中存放與2410開發(fā)板相關的配置文件,但由于自行設計的目標板即使與已有開發(fā)板使用相同處理器,但其他硬件配置不一定相同,所以需要參考該目錄下的內容來進行修改,例如根據使用的Flash存儲器的寬度和容量,可以修改flash.c中對應的參數。common:該目錄存放的是U-Boot命令行界面下支持的各條命令的實現源碼。每一條命令都對應一個文件,例如bootm命令對應就是cmd_bootm.c。通常主要關心與內核引導有關的cmd_boot.c和cmd_bootm.c等代碼。cpu:該目錄存放了U-Boot支持的CPU類型。每一款U-Boot下支持的CPU在該目錄下對應一個子目錄,比如S3C2440A采用的是ARM920T內核,則子目錄arm920t下即是對該處理器核的支持源碼。CPU相關的文件主要是初始化一個執(zhí)行環(huán)境,包括中斷的初始化。其中有一個重要文件start.s,該文件是一個匯編源文件,它是整個U-Boot執(zhí)行的第一段代碼,它的功能是將整個U-Boot目標代碼重定位,也就是將U-Boot轉移至內存中去運行。2022/11/1014U-boot主要包括以下目錄boar2022/11/1815U-boot主要包括以下目錄drivers:U-Boot支持的各種設備驅動程序都放在該目錄,比如各種網卡、支持CFI的Flash、串口和USB等。fs:該目錄存放U-Boot支持的文件系統,例如fat、fdos、jffs2、cramfs、ext2和reiserfs等。include:U-Boot使用的頭文件,還有對各種硬件平臺支持的匯編文件,系統的配置文件和對文件系統支持的文件。該目錄下configs目錄有與開發(fā)板相關的配置頭文件。該目錄下的asm目錄有與CPU體系結構相關的頭文件,ARM對應的是asm-arm。lib_xxx:與體系結構相關的庫文件。與ARM相關的庫放在lib_arm中。net:與網絡協議棧相關的代碼,BOOTP協議、TFTP協議、RARP協議和NFS文件系統的實現。tools:生成U-Boot的工具,如:mkimage,crc等等。doc:文檔目錄。U-Boot有非常完善的文檔,推薦參考閱讀。2022/11/1015U-boot主要包括以下目錄driv2022/11/1816U-boot的運行過程分析 U-Boot的階段一代碼通常放在start.s文件中,用匯編語言寫成,其主要功能是設置處理器狀態(tài)、初始化中斷和內存時序、對整個U-Boot目標代碼進行重新定位。階段一剛開始的代碼是處理器的異常處理向量表:.globl_start ;系統復位的位置,由U-Boot.ld決定_start:breset ;0x00000000,各個異常向量對應的跳轉代碼 ldrpc,_undefined_instruction;0x00000004,未定義指令異常 ldr pc,_software_interrupt ;0x00000008,軟件中斷異常 ldr pc,_prefetch_abort ;0x0000000c,預取中止異常 ldr pc,_data_abort ;0x00000010,數據中止異常 ldr pc,_not_used ;0x00000014,未使用 ldr pc,_irq ;0x00000018,中斷異常 ldr pc,_fiq ;0x0000001c,快速中斷異常 …………當發(fā)生各類異常時,CPU將執(zhí)行interrupts.c中對應定義的中斷處理函數。2022/11/1016U-boot的運行過程分析 U-Bo2022/11/1817U-boot的運行過程分析reset /*setthecputoSVC32mode*/ mrs r0,cpsr bic r0,r0,#0x1f orr r0,r0,#0xd3 msr cpsr,r0 ;進入SVC管理模式,關閉中斷和快速中斷
…………
;關閉看門狗、禁止中斷、配置處理器內部時鐘、配置內存區(qū)控制寄;存器、
代碼搬移 ldr pc,_start_armboot ;轉C代碼,stage1結束的_start_armboot:.wordstart_armboot階段二:start_armboot()在board.c中定義,是Bootloader中的C語言開始的函數,也是整個啟動代碼中C語言的主函數,它類似于Linux內核的start_kernel(),是一種系統初始化的接口函數:調用一系列初始化函數完成CPU的基本設置、開發(fā)板初始化、中斷向量初始化、環(huán)境變量初始化、串口初始化等;配置可用的Flash區(qū);內存初始化;I2C、LCD、video、音頻等外圍設備初始化;網絡設備初始化等等,最后進入U-Boot命令行。2022/11/1017U-boot的運行過程分析reset2022/11/1818嵌入式操作系統2022/11/1018嵌入式操作系統2022/11/1819嵌入式實時操作系統RTlinux及其他嵌入式實時LinuxuC/OSIIeCOSVxworks(windriversystems公司)QNX(QNXsoftwaresystems公司)pSOSOS/9VRTXThreadX嵌入式非實時操作系統一些嵌入inux系統WindowsCE、Embeddedwindowsxp(Microsoft公司)PalmOS(Palm公司)EPOC(Symbian公司)2022/11/1019嵌入式實時操作系統2022/11/1820Linux嵌入式操作系統 Linux是一個類Unix(Unix-like)的、免費的、源代碼開放的、符合POSIX(PortableOperatingSystemInterfaceStandard)標準規(guī)范的操作系統;
嚴格來說,Linux指由LinuxTorvalds維護的(及通過主要鏡像網站發(fā)布的)內核,而整個Linux系統的其它大部分都建立在GNU軟件之上;嵌入式Linux內核為特殊的硬件配置、或為了支持特別的應用而經過特別的裁剪的修改過的Linux內核;通常具有不同于工作站與服務器的內核配置;嵌入式Linux系統基于Linux內核的嵌入式系統;嵌入式Linux發(fā)行套件開發(fā)嵌入式Linux系統的平臺;各種為了在嵌入式系統中使用而剪裁過的應用軟件;2022/11/1020Linux嵌入式操作系統 Linux2022/11/1821Linux內核的發(fā)展歷史1991年11月,芬蘭赫爾辛基大學的學生LinusTorvalds寫了個小程序,取名為Linux,放在互聯網上。他表達了一個愿望,希望借此搞出一個操作系統的“內核”來,這完全是一個偶然事件;1993,在一批高水平黑客的參與下,誕生了Linux1.0版;1994年,Linux的第一個商業(yè)發(fā)行版Slackware問世;1996年,美國國家標準技術局的計算機系統實驗室確認Linux版本1.2.13(由OpenLinux公司打包)符合POSIX標準;2001年,Linux2.4版內核發(fā)布;2003年,Linux2.6版內核發(fā)布;……Linux內核版本號由3位數字組成r.x.y第1位數字r為主版本號
第2位數字x為說明版本類型的次版本號,如果x為偶數,則表示為產品化版本,為奇數時表示為實驗版本第3位數字y為修改號,表示錯誤修補的次數2022/11/1021Linux內核的發(fā)展歷史1991年12022/11/1822幾種流行的LinuxOS發(fā)行版本2022/11/1022幾種流行的LinuxOS發(fā)行版本2022/11/1823嵌入式Linux系統結構圖
嵌入式Linux具有分層的體系結構,一般可分為3小層及內核空間和用戶空間兩大塊,每一層模塊都屏蔽了其以下各層的具體細節(jié),只對上層提供功能接口或圖形界面。上層模塊不需要知道其以下各層模塊的實現方式,只需要利用下層提供的接口完成相應功能即可。這樣的層次模型大大增加了嵌入式Linux的安全性、穩(wěn)定性、裁減或增添模塊的便利性。2022/11/1023嵌入式Linux系統結構圖2022/11/1824Linux內核的各子系統之間的關系
嵌入式Linux內核一般可以分為4個部分:進程調度管理、內存管理、文件系統和設備驅動程序,它們之間的關系如上圖所示。進程調度處于中心位置,其他所有子系統都依賴于它。在嵌入式系統中,嵌入式Linux的實時性能改造與進程調度有很大的關系,調度策略的算法直接關系到系統的實時性能。2022/11/1024Linux內核的各子系統之間的關系2022/11/1825嵌入式Linux中的文件系統結構
嵌入式Linux的文件系統建立在塊設備上,不采用驅動器號或驅動器名稱來標識,而是采用了樹形結構,每個獨立文件系統為一個子樹,組成樹形的層次化的結構。當引入新的文件系統時,嵌入式Linux通過掛載方式將其連接到某個目錄,從而使不同的文件系統組合成一個整體成為可能。2022/11/1025嵌入式Linux中的文件系統結構2022/11/1826嵌入式Linux內核移植如果一個系統是可以在不同的硬件平臺上運行,那么這個系統就是可移植的。Linux內核移植指根據自己的硬件平臺對內核源代碼進行修改,同時對內核進行裁剪,編譯出適合自己硬件平臺的內核鏡像文件。Linux內核源代碼包括多個目錄:(1)arch:包括硬件特定內核代碼,如arm、mips等;(2)drivers:包含硬件驅動代碼;(3)include:通用頭文件及針對不同平臺的特定頭文件;(4)init:內核初始化代碼;(5)ipc:進程間通信代碼;(6)kernel:內核核心代碼;(7)mm:內存管理代碼;(8)net:與網絡協議棧相關的代碼;(9)fs:文件系統相關代碼,如nfs、vfat等;(10)lib:庫文件,與平臺無關的strlen、strcpy等2022/11/1026嵌入式Linux內核移植如果一個系統2022/11/1827Linux下驅動程序設計示例Linux操作系統對串口有著很好的支持,其中的串口驅動程序對用戶屏蔽了底層硬件的相關信息,而且為用戶提供了一系列的標準調用函數,極大的方便了串口通信的操作。用戶編寫串口應用程序的時候不需要考慮硬件相關的問題,只需要根據Linux操作系統提供的調用函數來實現自己需要的功能。在Linux操作系統下,串口是被當做文件來對待的,因此對它進行數據收發(fā)等效于對文件進行讀寫操作。對串口的操作一般分為四個步驟:打開串口、設置串口、讀寫串口和關閉串口。2022/11/1027Linux下驅動程序設計示例Linu2022/11/1828(1)打開串口在ARM平臺中Linux操作系統下的串口設備文件為/dev/ttySAC0。
intfd;
fd=open("/dev/ttySAC0",O_RDWR) ; /*以讀寫方式打開串口*/ if(fd==-1) ;/*如果打開串口錯誤則輸出提示信息*/ {
perror("Can'tOpenSerialPort"); }2022/11/1028(1)打開串口在ARM平臺中Linu2022/11/1829(2)設置串口與無操作系統的情況下對串口進行初始化設置類似,在Linux下最基本的串口設置工作主要包括波特率、校驗位和停止位的設置,其設置方式主要是對structtermios結構體各成員值進行設置。在不同應用中通常需要設置的波特率及數據格式等參數都不一樣,可以將結構體成員賦值的功能編寫成函數,通過對該函數入口參數的修改,即可方便的實現不同的設置。2022/11/1029(2)設置串口與無操作系統的情況下對2022/11/1830波特率設置函數voidset_speed(intfd,intspeed){ inti; intstatus;
structtermios Opt;
tcgetattr(fd,&Opt); /*得到機器原端口的默認設置*/ for(i=0;i<sizeof(speed_arr)/sizeof(int);i++){ if(speed==name_arr[i]){
tcflush(fd,TCIOFLUSH);
cfsetispeed(&Opt,speed_arr[i]);
cfsetospeed(&Opt,speed_arr[i]); status=tcsetattr(fd,TCSANOW,&Opt); if(status!=0){ perror("tcsetattrfd1"); return; }
tcflush(fd,TCIOFLUSH); } }}2022/11/1030波特率設置函數voidset_sp2022/11/1831數據格式設置函數intset_Parity(intfd,intdatabits,intstopbits,intparity){
structtermiosoptions; if(tcgetattr(fd,&options)!=0){ perror("SetupSerial1"); return(FALSE); }options.c_cflag&=~CSIZE;switch(databits) //設置數據位個數 {case7:options.c_cflag|=CS7; //設置數據位為7位
break;case8:options.c_cflag|=CS8; //設置數據位為8位
break;default:fprintf(stderr,"Unsupporteddatasizen");return(FALSE); }2022/11/1031數據格式設置函數intset_Pa2022/11/1832數據格式設置函數switch(stopbits) //設置停止位個數 {case1:options.c_cflag&=~CSTOPB; //設置停止位為1位
break;
case2:options.c_cflag|=CSTOPB; //設置停止位為2位
break;default:fprintf(stderr,"Unsupportedstopbitsn");return(FALSE); }}2022/11/1032數據格式設置函數switch(st2022/11/1833switch(parity) //設置校驗位屬性{case'n':case'N':options.c_cflag&=~PARENB;//關閉奇偶校驗options.c_iflag&=~INPCK;//關閉輸入奇偶校驗檢測
break;
case'o':case'O':options.c_cflag|=(PARODD|PARENB);//設置為奇效驗options.c_iflag|=INPCK; //打開輸入奇偶校驗檢測
break;
case'e':case'E':options.c_cflag|=PARENB; //打開奇偶校驗options.c_cflag&=~PARODD; //設置為偶效驗options.c_iflag|=INPCK; //打開輸入奇偶校驗檢測
break;default:fprintf(stderr,"Unsupportedparityn");//不能識別的校驗類型return(FALSE);}2022/11/1033switch(parity) 2022/11/1834(3)讀寫串口實現數據傳輸從串口發(fā)送數據:使用文件操作write函數實現數據發(fā)送,示例程序如下: char buffer[1024]; int Length; int writeByte; writeByte=write(fd,buffer,Length);功能:將發(fā)送緩沖區(qū)buffer中Length大小的數據從串口發(fā)出。從串口接收數據:使用文件操作read函數實現數據接收,示例程序如下: char buffer[1024]; int Length; int readByte; readByte=read(fd,buffer,Length);功能:讀取串口接收到的Length大小的數據,并放到接收緩沖區(qū)buffer中。2022/11/1034(3)讀寫串口實現數據傳輸從串口發(fā)送2022/11/1835(4)關閉串口
關閉串口就是關閉設備文件,使用文件操作close函數實現。 close(fd);2022/11/1035(4)關閉串口 關閉串口就是關閉設備2022/11/1836第十一章
基于ARM的軟件系統設計1、嵌入式軟件系統結構及工作流程2、嵌入式軟件系統的引導和加載
S3C2440啟動過程、BootLoader基本概念、
U-boot的分析與移植3、嵌入式Linux操作系統
嵌入式操作系統、嵌入式Linux內核4、Linux下驅動程序設計示例
打開串口、設置串口、讀寫串口、關閉串口2022/11/101第十一章基于ARM的軟件系統設計1第十一章結束第十一章結束2022/11/1838嵌入式軟件系統結構簡單的嵌入式應用
若嵌入式系統的功能需求比較簡單,嵌入式系統軟件只需完成較簡單的監(jiān)控、驅動和處理功能,則不需要嵌入式操作系統的支持。如基于8051的應用:玩具、家電、汽車等的控制系統復雜的嵌入式應用
若嵌入式系統的功能需求比較復雜,需要圖形用戶界面、網絡管理、存儲管理、進程/線程管理或需要支持二次開發(fā)等,則通過嵌入式操作系統的幫助,可以加快嵌入式系統軟件的開發(fā)進度和可靠性。如基于ARM的應用:手機、PDA2022/11/103嵌入式軟件系統結構簡單的嵌入式應用2022/11/1839簡單嵌入式系統軟件結構不需要使用操作系統,基于裸機開發(fā)典型單任務程序架構(1)從CPU復位時的指定地址開始執(zhí)行;(2)跳轉至匯編代碼startup處執(zhí)行;(3)跳轉至用戶主程序main執(zhí)行,在main中完成:a.初試化各硬件設備;b.初始化各軟件模塊;c.進入死循環(huán)(無限循環(huán)),調用各模塊的處理函數2022/11/104簡單嵌入式系統軟件結構不需要使用操作系2022/11/1840用戶主程序和各模塊的處理函數都以C語言完成。用戶主程序最后都進入了一個死循環(huán),直到系統停電或者出現重大錯誤。voidmain(void){ ……//變量、參數等的定義及說明
X_init(); //系統初始化,一般為匯編代碼
While(1)X();//超級循環(huán)}2022/11/105用戶主程序和各模塊的處理函數都以C語言2022/11/1841復雜嵌入式系統軟件的一般結構ARM+M+I/OHAL、底層封裝、部分由OS提供BOOTLOAD2022/11/106復雜嵌入式系統軟件的一般結構ARM+M2022/11/1842復雜嵌入式系統軟件工作流程2022/11/107復雜嵌入式系統軟件工作流程2022/11/1843S3C2440啟動方式
三星公司的S3C2440支持NorFlash和NandFlash啟動,可以通過硬件跳線(引腳OM[1:0])設置啟動方式。具體含義如下:OM[1:0]=00時,處理器從NANDFlash啟動OM[1:0]=01時,處理器從16位寬度的NorFlash啟動OM[1:0]=10時,處理器從32位寬度的NorFlash啟動OM[1:0]=11時,處理器從TestMode啟動2022/11/108S3C2440啟動方式 三星公司2022/11/1844S3C2440NandFlashS3C2440NandFlash啟動過程
在系統上電后,NandFlash控制器會自動的把NandFlash上的前4KU-BOOT數據搬移到內部SRAM的地址最低端(此SRAM被稱為Steppingstone); CPU從內部RAM的0x00000000位置開始啟動并在uboot啟動代碼的前4K里完成S3C2440的核心配置,然后把U-BOOT剩余部分搬到RAM中運行;2022/11/109S3C2440NandFlash2022/11/1845引導程序BootLoader是嵌入式系統在加電啟動后執(zhí)行的第一段代碼,功能類似pc機的BIOS和OSLoader,通常需要固化在目標板中;主要負責CPU、存儲器及相關硬件的初始化,以及將裝載操作系統映像到內存中,然后跳轉到規(guī)定的地址啟動操作系統運行。Bootloader是嚴重依賴硬件而實現的,每一種不同體系結構的處理器都有不同的Bootloader,甚至同一種處理器的外圍硬件配置不同,其Bootloader也有差別。因此開發(fā)特定的Bootloader是構建嵌入式linux系統之前的一項必要的基礎工作。2022/11/1010引導程序BootLoader是嵌入式2022/11/1846Bootloader的運行步驟Stage1(匯編實現)基本硬件設備初始化:CPU時鐘頻率,寄存器,存儲器數據寬度、訪問周期、刷新周期,中斷系統,I/O端口等;為第二階段準備RAM空間,設置堆棧;復制第二階段代碼到RAM中,并跳轉到第二階段入口點Stage2(C實現)初始化本階段要使用的硬件設備,實現對板級驅動的支持;檢測系統內存映射;將內核鏡像和根文件系統鏡像從flash讀到RAM中;為內核設置啟動參數;將PC指針指向內核的入口處,調用內核。掛載文件系統;2022/11/1011Bootloader的運行步驟Sta2022/11/1847Linux環(huán)境下BootLoader種類BootloaderMonitor描
述x86ARMPowerPCLILO否Linux磁盤引導程序是否否GRUB否GNU的LILO替代程序是否否Loadlin否從DOS引導Linux是否否ROLO否從ROM引導Linux而不需要BIOS是否否Etherboot否通過以太網卡啟動Linux系統的固件是否否LinuxBIOS否完全替代BUIS的Linux引導程序是否否BLOB否LART等硬件平臺引導程序否是否U-boot是通用引導程序是是是RedBoot是基于eCos的引導程序是是是2022/11/1012Linux環(huán)境下BootLoade2022/11/1848U-boot的分析與移植 U-boot全稱UniversalBootLoader,支持ARM體系等多種處理器,包含常見的外設的驅動,是一個開源的、功能強大的板極支持包;由德國DENX軟件工程中心的WolfgangDenk維護。 U-boot啟動時處于正常的啟動加載模式,但是它會延時指定時間(單位秒)等待終端用戶按下任意鍵而切換到下載模式,如果在指定時間內用戶沒有按鍵,則繼續(xù)啟動操作系統。2022/11/1013U-boot的分析與移植 U-bo2022/11/1849U-boot主要包括以下目錄board:該目錄存放了U-Boot支持的一些已有開發(fā)板的信息。每一個開發(fā)板都以一個子目錄出現在當前目錄中,如SMDK2410子目錄中存放與2410開發(fā)板相關的配置文件,但由于自行設計的目標板即使與已有開發(fā)板使用相同處理器,但其他硬件配置不一定相同,所以需要參考該目錄下的內容來進行修改,例如根據使用的Flash存儲器的寬度和容量,可以修改flash.c中對應的參數。common:該目錄存放的是U-Boot命令行界面下支持的各條命令的實現源碼。每一條命令都對應一個文件,例如bootm命令對應就是cmd_bootm.c。通常主要關心與內核引導有關的cmd_boot.c和cmd_bootm.c等代碼。cpu:該目錄存放了U-Boot支持的CPU類型。每一款U-Boot下支持的CPU在該目錄下對應一個子目錄,比如S3C2440A采用的是ARM920T內核,則子目錄arm920t下即是對該處理器核的支持源碼。CPU相關的文件主要是初始化一個執(zhí)行環(huán)境,包括中斷的初始化。其中有一個重要文件start.s,該文件是一個匯編源文件,它是整個U-Boot執(zhí)行的第一段代碼,它的功能是將整個U-Boot目標代碼重定位,也就是將U-Boot轉移至內存中去運行。2022/11/1014U-boot主要包括以下目錄boar2022/11/1850U-boot主要包括以下目錄drivers:U-Boot支持的各種設備驅動程序都放在該目錄,比如各種網卡、支持CFI的Flash、串口和USB等。fs:該目錄存放U-Boot支持的文件系統,例如fat、fdos、jffs2、cramfs、ext2和reiserfs等。include:U-Boot使用的頭文件,還有對各種硬件平臺支持的匯編文件,系統的配置文件和對文件系統支持的文件。該目錄下configs目錄有與開發(fā)板相關的配置頭文件。該目錄下的asm目錄有與CPU體系結構相關的頭文件,ARM對應的是asm-arm。lib_xxx:與體系結構相關的庫文件。與ARM相關的庫放在lib_arm中。net:與網絡協議棧相關的代碼,BOOTP協議、TFTP協議、RARP協議和NFS文件系統的實現。tools:生成U-Boot的工具,如:mkimage,crc等等。doc:文檔目錄。U-Boot有非常完善的文檔,推薦參考閱讀。2022/11/1015U-boot主要包括以下目錄driv2022/11/1851U-boot的運行過程分析 U-Boot的階段一代碼通常放在start.s文件中,用匯編語言寫成,其主要功能是設置處理器狀態(tài)、初始化中斷和內存時序、對整個U-Boot目標代碼進行重新定位。階段一剛開始的代碼是處理器的異常處理向量表:.globl_start ;系統復位的位置,由U-Boot.ld決定_start:breset ;0x00000000,各個異常向量對應的跳轉代碼 ldrpc,_undefined_instruction;0x00000004,未定義指令異常 ldr pc,_software_interrupt ;0x00000008,軟件中斷異常 ldr pc,_prefetch_abort ;0x0000000c,預取中止異常 ldr pc,_data_abort ;0x00000010,數據中止異常 ldr pc,_not_used ;0x00000014,未使用 ldr pc,_irq ;0x00000018,中斷異常 ldr pc,_fiq ;0x0000001c,快速中斷異常 …………當發(fā)生各類異常時,CPU將執(zhí)行interrupts.c中對應定義的中斷處理函數。2022/11/1016U-boot的運行過程分析 U-Bo2022/11/1852U-boot的運行過程分析reset /*setthecputoSVC32mode*/ mrs r0,cpsr bic r0,r0,#0x1f orr r0,r0,#0xd3 msr cpsr,r0 ;進入SVC管理模式,關閉中斷和快速中斷
…………
;關閉看門狗、禁止中斷、配置處理器內部時鐘、配置內存區(qū)控制寄;存器、
代碼搬移 ldr pc,_start_armboot ;轉C代碼,stage1結束的_start_armboot:.wordstart_armboot階段二:start_armboot()在board.c中定義,是Bootloader中的C語言開始的函數,也是整個啟動代碼中C語言的主函數,它類似于Linux內核的start_kernel(),是一種系統初始化的接口函數:調用一系列初始化函數完成CPU的基本設置、開發(fā)板初始化、中斷向量初始化、環(huán)境變量初始化、串口初始化等;配置可用的Flash區(qū);內存初始化;I2C、LCD、video、音頻等外圍設備初始化;網絡設備初始化等等,最后進入U-Boot命令行。2022/11/1017U-boot的運行過程分析reset2022/11/1853嵌入式操作系統2022/11/1018嵌入式操作系統2022/11/1854嵌入式實時操作系統RTlinux及其他嵌入式實時LinuxuC/OSIIeCOSVxworks(windriversystems公司)QNX(QNXsoftwaresystems公司)pSOSOS/9VRTXThreadX嵌入式非實時操作系統一些嵌入inux系統WindowsCE、Embeddedwindowsxp(Microsoft公司)PalmOS(Palm公司)EPOC(Symbian公司)2022/11/1019嵌入式實時操作系統2022/11/1855Linux嵌入式操作系統 Linux是一個類Unix(Unix-like)的、免費的、源代碼開放的、符合POSIX(PortableOperatingSystemInterfaceStandard)標準規(guī)范的操作系統;
嚴格來說,Linux指由LinuxTorvalds維護的(及通過主要鏡像網站發(fā)布的)內核,而整個Linux系統的其它大部分都建立在GNU軟件之上;嵌入式Linux內核為特殊的硬件配置、或為了支持特別的應用而經過特別的裁剪的修改過的Linux內核;通常具有不同于工作站與服務器的內核配置;嵌入式Linux系統基于Linux內核的嵌入式系統;嵌入式Linux發(fā)行套件開發(fā)嵌入式Linux系統的平臺;各種為了在嵌入式系統中使用而剪裁過的應用軟件;2022/11/1020Linux嵌入式操作系統 Linux2022/11/1856Linux內核的發(fā)展歷史1991年11月,芬蘭赫爾辛基大學的學生LinusTorvalds寫了個小程序,取名為Linux,放在互聯網上。他表達了一個愿望,希望借此搞出一個操作系統的“內核”來,這完全是一個偶然事件;1993,在一批高水平黑客的參與下,誕生了Linux1.0版;1994年,Linux的第一個商業(yè)發(fā)行版Slackware問世;1996年,美國國家標準技術局的計算機系統實驗室確認Linux版本1.2.13(由OpenLinux公司打包)符合POSIX標準;2001年,Linux2.4版內核發(fā)布;2003年,Linux2.6版內核發(fā)布;……Linux內核版本號由3位數字組成r.x.y第1位數字r為主版本號
第2位數字x為說明版本類型的次版本號,如果x為偶數,則表示為產品化版本,為奇數時表示為實驗版本第3位數字y為修改號,表示錯誤修補的次數2022/11/1021Linux內核的發(fā)展歷史1991年12022/11/1857幾種流行的LinuxOS發(fā)行版本2022/11/1022幾種流行的LinuxOS發(fā)行版本2022/11/1858嵌入式Linux系統結構圖
嵌入式Linux具有分層的體系結構,一般可分為3小層及內核空間和用戶空間兩大塊,每一層模塊都屏蔽了其以下各層的具體細節(jié),只對上層提供功能接口或圖形界面。上層模塊不需要知道其以下各層模塊的實現方式,只需要利用下層提供的接口完成相應功能即可。這樣的層次模型大大增加了嵌入式Linux的安全性、穩(wěn)定性、裁減或增添模塊的便利性。2022/11/1023嵌入式Linux系統結構圖2022/11/1859Linux內核的各子系統之間的關系
嵌入式Linux內核一般可以分為4個部分:進程調度管理、內存管理、文件系統和設備驅動程序,它們之間的關系如上圖所示。進程調度處于中心位置,其他所有子系統都依賴于它。在嵌入式系統中,嵌入式Linux的實時性能改造與進程調度有很大的關系,調度策略的算法直接關系到系統的實時性能。2022/11/1024Linux內核的各子系統之間的關系2022/11/1860嵌入式Linux中的文件系統結構
嵌入式Linux的文件系統建立在塊設備上,不采用驅動器號或驅動器名稱來標識,而是采用了樹形結構,每個獨立文件系統為一個子樹,組成樹形的層次化的結構。當引入新的文件系統時,嵌入式Linux通過掛載方式將其連接到某個目錄,從而使不同的文件系統組合成一個整體成為可能。2022/11/1025嵌入式Linux中的文件系統結構2022/11/1861嵌入式Linux內核移植如果一個系統是可以在不同的硬件平臺上運行,那么這個系統就是可移植的。Linux內核移植指根據自己的硬件平臺對內核源代碼進行修改,同時對內核進行裁剪,編譯出適合自己硬件平臺的內核鏡像文件。Linux內核源代碼包括多個目錄:(1)arch:包括硬件特定內核代碼,如arm、mips等;(2)drivers:包含硬件驅動代碼;(3)include:通用頭文件及針對不同平臺的特定頭文件;(4)init:內核初始化代碼;(5)ipc:進程間通信代碼;(6)kernel:內核核心代碼;(7)mm:內存管理代碼;(8)net:與網絡協議棧相關的代碼;(9)fs:文件系統相關代碼,如nfs、vfat等;(10)lib:庫文件,與平臺無關的strlen、strcpy等2022/11/1026嵌入式Linux內核移植如果一個系統2022/11/1862Linux下驅動程序設計示例Linux操作系統對串口有著很好的支持,其中的串口驅動程序對用戶屏蔽了底層硬件的相關信息,而且為用戶提供了一系列的標準調用函數,極大的方便了串口通信的操作。用戶編寫串口應用程序的時候不需要考慮硬件相關的問題,只需要根據Linux操作系統提供的調用函數來實現自己需要的功能。在Linux操作系統下,串口是被當做文件來對待的,因此對它進行數據收發(fā)等效于對文件進行讀寫操作。對串口的操作一般分為四個步驟:打開串口、設置串口、讀寫串口和關閉串口。2022/11/1027Linux下驅動程序設計示例Linu2022/11/1863(1)打開串口在ARM平臺中Linux操作系統下的串口設備文件為/dev/ttySAC0。
intfd;
fd=open("/dev/ttySAC0",O_RDWR) ; /*以讀寫方式打開串口*/ if(fd==-1) ;/*如果打開串口錯誤則輸出提示信息*/ {
perror("Can'tOpenSerialPort"); }2022/11/1028(1)打開串口在ARM平臺中Linu2022/11/1864(2)設置串口與無操作系統的情況下對串口進行初始化設置類似,在Linux下最基本的串口設置工作主要包括波特率、校驗位和停止位的設置,其設置方式主要是對structtermios結構體各成員值進行設置。在不同應用中通常需要設置的波特率及數據格式等參數都不一樣,可以將結構體成員賦值的功能編寫成函數,通過對該函數入口參數的修改,即可方便的實現不同的設置。2022/11/1029(2)設置串口與無操作系統的情況下對2022/11/1865波特率設置函數voidset_speed(intfd,intspeed){ inti; intstatus;
structtermios Opt;
tcgetattr(fd,&Opt); /*得到機器原端口的默認設置*/ for(i=0;i<sizeof(speed_arr)/sizeof(int);i++){ if(speed==name_arr[i]){
tcflush(fd,TCIOFLUSH);
cfsetispeed(&Opt,speed_arr[i]);
cfsetospeed(&Opt,speed_arr[i]); status=tcsetattr(fd,TCSANOW,&Opt); if(status!=0){ perror("tcsetattrfd1"); return; }
tcflush(fd,TCIOFLUSH); } }}2022/11/1030波特率設置函數voidset_sp2022/11/1866數據格式設置函數intset_Parity(intfd,intdatabits,intstopbits,int
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教部編版歷史九年級下冊:第11課 《蘇聯的社會主義建設》 聽課評課記錄
- 《溝通中外文明的“絲綢之路”》名師聽課評課記錄(新部編人教版七年級上冊歷史)
- 生物醫(yī)藥產業(yè)園監(jiān)理合同(2篇)
- 電力價格調整合同(2篇)
- 五年級上冊數學聽評課記錄《7.1 誰先走》(3)-北師大版
- 部編人教版歷史九年級上冊第15課《探尋新航路》聽課評課記錄
- 湘教版數學八年級上冊《小結練習》聽評課記錄5
- 人教版數學七年級上冊3.2《解一元一次方程(一)-合并同類項與移項》聽評課記錄1
- 五年級上冊數學聽評課記錄-總復習2-北師大版
- 新版湘教版秋八年級數學上冊第二章三角形課題三角形的內角和定理聽評課記錄
- 必修3《政治與法治》 選擇題專練50題 含解析-備戰(zhàn)2025年高考政治考試易錯題(新高考專用)
- 二零二五版電商企業(yè)兼職財務顧問雇用協議3篇
- 課題申報參考:流視角下社區(qū)生活圈的適老化評價與空間優(yōu)化研究-以沈陽市為例
- 《openEuler操作系統》考試復習題庫(含答案)
- 17J008擋土墻(重力式、衡重式、懸臂式)圖示圖集
- 2024-2025學年人教版生物八年級上冊期末綜合測試卷
- 大數據背景下網絡輿情成因及治理
- 道教系統諸神仙位寶誥全譜
- 中國經濟轉型導論-政府與市場的關系課件
- 新視野大學英語讀寫教程 第三版 Book 2 unit 8 教案 講稿
- 村務公開表格
評論
0/150
提交評論