天天看點

Linux嵌入式系統與硬體平台的關系

一、 Linux嵌入式系統

作業系統是一種在計算機上運作的軟體,它的主要任務是管理計算機上的系統資源,為使用者提供使用計算機及其外部裝置的接口。它存在的目的是為了管理所有硬體資源,并且提供應用軟體一個合适的操作環境。嵌入式系統由于硬體的先天限制,經常隻具有極稀少的硬體資源,如 時脈較少的 CPU、較少的記憶體、常不具有磁盤而用小容量的DiskOnChip或DiskOnModule。而在使用電池的系統中,它還要實作節省電池消耗,延長電池使用時間的功能。

    Linux 作為嵌入式作業系統是完全可行的,因為Linux提供了完成嵌入功能的基本的核心和你所需要的所有使用者界面,它是多面的。它能處理嵌入式任務和使用者界面。将Linux看作是連續的統一體,從一個具有記憶體管理、任務切換和時間服務及其他的分拆的微核心到完整的伺服器,支援所有的檔案系統和網絡服務。Linux作為嵌入式系統是一個帶有很多優勢的新成員,它對許多CPU和硬體平台都是易移植的、穩定、功能強大、易于開發。

         Application program

         API  

         X-server Java virtual machine

         Device driver  

         Linux Kernel  

         Boot load  

    嵌入式Linux系統需要下面三個基本元素:

        1. 引導工具

        2. Linux微核心:記憶體管理、 程式管理

        3. 初始化程序

    如果要它成為完整的作業系統且繼續保持小型化,還得加上:

        1.硬體驅動程式

        2.硬體接口程式

        3.應用程式組

    談到作業系統就一定要說一說它的開發環境,Linux是基于GNU的C編譯器,作為GNU工具鍊的一部分,與gdb源調試器一起工作。它提供了開發嵌入式Linux系統的所有軟體工具。以下是一個典型的開發工具的使用流程:

        1.寫入或植入引導碼

        2.向序列槽列印字元串的編碼

        3.将gdb目标碼移植工作序列槽,這可與另一台運作gdb程式的Linux  主機系統對話

        4.利用gdb讓硬體和軟體初始化碼在Linux核心啟動時工作

        5.Linux核心啟動,序列槽成為Linux控制口并可用于後續開發

       6.如果在你的目标硬體上運作了完整的Linux核心,你可以調試你的應用程序

二、硬體平台

    研發人員在選擇最好的硬體時,往往由于缺乏完整或精确的資訊而使選擇硬體成為複雜且困難的工作。硬體成本經常是關鍵的議題,當考慮成本時、需要确信你在考慮産品的整個成本而不僅是CPU的成本;因為好的CPU一旦加上總線邏輯和延時電路使之與外設一起工作,硬體系統可能變成非常昂貴的産品。如果你正在尋找嵌入式軟體系統,那麼應首先确定了硬體平台即确定了微處理器CPU的型号。

    現在比較流行的硬體平台有Intel公司的Strong Arm 系列,Motorola公司的DragonBall系列,NEC公司的VR系列,Hitachi公司SH3,SH4系列等等,都可選為硬體平台。但最好在標明前先要确定所做系統的應用功能和所需的速度,并且制定好外接裝置和接口标準。這樣可準确的定位所需要的硬體方案,得到成本效益最高的系統。 下圖是以Intel公司的StrongArm為例來說明硬體平台:

三、Linux嵌入式系統與硬體的關系

    對初學者而言,可以将核心與任務分開,标準的Linux核心通常駐留在記憶體中,每一個應用程式程式都是從磁盤運到記憶體上執行。當程式結束後,它所占用的記憶體就被釋放,程式就被下載下傳了。在一個嵌入式系統裡,可能沒有磁盤。有兩種途徑可以消除對磁盤的依賴,這要看系統的複雜性和硬體的設計。在一個簡單的系統裡,當系統啟動後,核心和所有的應用程式都在記憶體裡。這就是大多數傳統的嵌入式系統工作模式,它同樣可以被Linux支援。有了Linux,就有了第二種可能性。因為Linux已經有能力"加載"和"解除安裝"程式,一個嵌入式系統就可以利用它來節省記憶體。試想一個典型的包括一個大概8MB到16MB的Flash Memory和8MB記憶體的系統。Flash Memory可以作為一個檔案系統。Flash Memory驅動程式用來連接配接Flash Memory和檔案系統。作為替代也可使用Flash Disk,用工具軟體可把Flash Memory仿真為磁盤或部分。其中一個例子是Intel 公司可提供Flash Memory 管理軟體IPSM -Intel Persistent Storage Manager, 詳情見 [url]http://developer.intel.com/design/builder/flbldr/swb/swb.htm[/url]

    所有的程式都以檔案形式存儲在Flash檔案中,需要時可以裝入記憶體。這種動态的、"根據需要加載"的能力是支援其它一系列功能的重要特征:

    1. 它使初始化代碼在系統引導後被釋放。Linux同樣有很多核心外運作的公用程式。這些通常程式在初始化時運作一次,以後就不再運作。而且,這些公用程式可以用它們互相共有的方式,一個接一個按順序運作。這樣,相同記憶體空間可以被反複使用以"調入"每一個程式,就象系統引導一樣。這的确可以節省記憶體,特别是那些配置一次以後就不再更改的網絡堆棧。如果Linux可加載子產品的功能包括在核心裡,驅動程式和應用程式就都可以被加載。它可以檢查硬體環境并且為硬體裝上相應的軟體。這就消除了用一個程式占用許多Flash Memory來處理多種硬體的複雜性。

    2. 軟體的更新更子產品化。你可以在系統運作的時候在Flash上更新應用程式和可加載驅動程式。

    3. 配置資訊和運作時間參數可以作為資料檔案儲存在Flash上。

虛拟記憶體

    标準Linux的另一個特征是虛拟記憶體的能力。正是這種神奇的特征使應用程式員可以狂熱的編寫代碼而不計後果,不管程式有多大。在嵌入式系統裡不需要這種強大的功能。實際上,因為它會帶來無法控制的時間因素,你可能不希望它在實時的系統裡。這個軟體必須設計得更加精悍,以适合硬體平台上的實體記憶體,就象其它嵌入式系統一樣。注意由于CPU的原因,通常在Linux中儲存虛拟記憶體代碼是明智的,因為将它清除很費事;而且還有另外一個原因--它支援共享文本,這樣就可以使許多程式共享一個軟體。

    虛拟記憶體的調入功能可以被關掉,隻要将交換空間的大小設定為零。如果你寫的程式比實際的記憶體大,系統就會當作你的運作用盡了交換空間來處理;這個程式将不會運作,或者malloc将會失靈。在許多CPU上,虛拟記憶體提供的記憶體管理可以将不同程式分開,防止它們寫到其它位址的空間上。這在嵌入式系統上通常不可能,因為它隻支援一個簡單、扁平的位址空間。Linux的這種功能有助于其發展。它減少了胡亂的編寫程式造成系統崩潰的可能性。許多嵌入式系統基于效率方面的原因有意識使用程式間可以共享的"全局"資料。這也可以通過Linux共享記憶體功能來支援,共享的隻是指定的記憶體部分。

檔案系統

   許多嵌入式系統沒有磁盤或者檔案系統。Linux不需要它們也能運作。實際上,許多商業性嵌入式系統提供檔案系統作為選項。Linux提供   MS-DOS-Compatible檔案系統,同時還有其它多種選擇。之是以提供其它選擇是因為它們更加強大而且具有容錯功能。Linux還具有檢查和維護的功能,商業性供應商往往不提供這些。這對于Flash系統來說尤其重要,因為它是通過網絡更新的。如果系統在更新過程中失去了能力,那它就沒有用了。維護的功能通常可以解決這類問題。

    檔案系統可以被放在傳統的磁盤驅動器、Flash Memory或其它這類的媒體上。而且,用于暫時儲存檔案,一個小RAM盤就足夠了。Flash Memories被分割成塊。這些塊中也許包括一個含有當CPU啟動時運作的最初的軟體的引導塊。這可能包括Linux 引導代碼。剩餘的Flash可以用作檔案系統。Linux的核心可以通過引導代碼從Flash複制到RAM,或者還有一個選擇,核心可以被存儲在Flash的一個獨立部分,并且直接從那裡執行。另外對于一些系統來說還有一個有趣的選擇,那就是将一個便宜的CD-ROM包含在内。這比Flash Memory 便宜,而且通過交換CD-ROM支援簡單的更新。有了這個,Linux 隻要從 CD-ROM上引導,類似從硬碟上一樣從CD-ROM上獲得所有的程式。

最後,對于聯網的嵌入式系統來說,Linux 支援NFS(Network File system)。這為實作聯網系統的許多增值功能打開了大門。第一,它允許通過網絡上加載應用程式。這是控制軟體修改的基礎,因為每一個嵌入式系統的軟體都可以在一個普通的伺服器上加載。它在運作的時候也可以用來輸入或輸出大量的資料、配置和狀态資訊。這對使用者監督和控制來說是一個非常強大的功能。舉例來說,嵌入式系統可以建立一個小的RAM磁盤,包含的檔案中有與目前狀态資訊同步的内容。其它系統可以簡單的把這個RAM磁盤設定為基于網絡的遠端磁盤,并且空中存取狀态檔案。這就允許另一個機器上的Web伺服器通過簡單的CGI Script存取狀态資訊。在其它電腦上運作的其它應用程式包可以很容易的存取資料。

引導--LILO和BIOS在哪裡

    當一個微處理器第一次啟動的時候,它開始在預先設定的位址上執行指令。通常在那裡有一些隻讀記憶體,包括初始化或引導代碼。類似于在PC上的BIOS。它執行了一些低水準的CPU初始化和其它硬體的配置檔案。BIOS繼續辨認哪個磁盤裡有作業系統,把作業系統複制到RAM并且轉向它。實際上,這非常複雜,但對我們的目标來說也非常重要。在PC上運作的Linux依靠PC的BIOS來提供這些配置和OS加載功能。

    在一個嵌入式系統裡經常沒有這種BIOS。這樣你就要提供同等的啟動代碼。幸運的是,嵌入式系統并不需要象PC機上的 BIOS引導程式那樣的靈活性,因為它通常隻需要處理一個硬體的配置。這個代碼更簡單也更枯燥。它隻是個指令清單,将固定的數字塞到硬體寄存器中去。然而,這是關鍵的代碼,因為這些數值要與你的硬體相符而且要按照特定的順序進行。是以在大多數情況下,一個最小的通電自檢子產品,可以檢查記憶體的正常運作、讓LED閃爍,并且驅動其它必須的硬體以使主Linux OS啟動和運作。這些啟動代碼完全根據硬體決定,不可随意移動。幸運的是,許多系統都有為核心微處理器和記憶體所定制的菜單式硬體設計。典型的是,晶片制造商有一個樣本主機闆,可以用來作為設計的參考--或多或少與新設計相同。通常這些菜單式設計的啟動代碼是可以獲得的,它可以根據你的需要輕易的修改。在少數情況下,啟動代碼需要重新編寫.為了測試這些代碼,你可以使用一個包含模拟記憶體的電路内置模拟器,它可以代替目标記憶體。你把代碼裝到模拟器上并通過模拟器調試。如果這樣不行,你可以跳過這一步,但這樣就要一個更長的調試周期。這個代碼最終要在較為穩定的記憶體上運作,通常是Flash或EPROM晶片。你需要使用一些方法将代碼放在晶片上。怎麼做,要根據"目标"硬體和工具來定。

    一種流行的方法是把Flash或EPROM晶片插入EPROM或Flash燒制器。這将把你的程式"燒"(存)入晶片。然後,把晶片插入你的目标闆的插座,打開電源。這個方法需要闆上配有插座,但有些裝置是不能配插座的。

另一個方法是通過一個JTAG界面。一些晶片有JTAG界面可以用來對晶片進行程式設計。這是最友善的方法。晶片可以永遠被焊在主機闆上,一個小電纜從闆上的JTAG連接配接器,通常是一個PC卡,聯到JTAG界面。下面是PC運作JTAG界面所需的一些慣用程式。這個裝置還可以用來小量生産。

穩定性

    對大多數微處理器來說,Linux非常好。移植到新微處理器家族的Linux核心運作起來與原來的微處理器一樣穩定。它經常被移植到一個或多個特定的主機闆上。這些闆包括特定的外圍裝置和CPU。幸運的是,許多代碼是與處理器的特性不相關的,是以移植集中在處理器的差異上,其中大多數是在記憶體管理和中斷控制領域。一旦成功移植,它們就非常穩定。

引導政策廣泛依賴于硬體要求,而且你必須有計劃地做一些定制的工作。裝置驅動程式更加混亂:有些穩定有些不穩定。而且選擇很有限;一旦你離開了通用的PC平台,你需要自己編寫。幸運的是,周圍有許多驅動程式,你可能可以找到一個與你的需求相近的修改一下。這種驅動程式界面已定義好。許多類似的驅動程式都非常相近,是以把磁盤、網絡或一系列的端口驅動程式從一個裝置移植到另一個裝置上通常并不難。你可能發現許多驅動程式都寫得很好,很容易了解,但你還是要準備一本關于核心結構的書在手頭。

    總之,這些作業系統和Linux的問題在于對工作過程微小之處的誤解,而不在于代碼的難度或基本的設計錯誤。任何作業系統都有很多争論不休的故事,這裡不需要重複。Linux的優勢在于源代碼是公開、注釋清晰和文檔齊全的。這樣,你就可以控制和處理所出現的任何問題。

三、嵌入式Linux作業系統将如何發展

    嵌入式Linux的确有它的缺陷。比如,雖然它并不比某些競争對手差多少,但它的确是個需要占用存儲器的作業系統。這可以通過減少一些不必要的功能來彌補,但這可能會花很長的時間,而且如果不仔細的話,還可能帶來很大的困擾。許多Linux的應用程式都要用到虛拟記憶體,在許多嵌入式系統中,是沒有價值的,是以不要以為一個沒有磁盤的Linux嵌入式系統可以運作任何Linux應用程式。

    綜上所述,Linux嵌入式作業系統在嵌入式系統中的應用才剛剛開始,但它所具有的技術優勢和獨特的運開發模式給業界以新異,有理由相信在不久的将來Linux嵌入式作業系統一定會成為綻放在作業系統中美麗的奇葩。 

2:                守護程序在嵌入式Linux系統中的使用 

引言:

在嵌入式Linux系統中,因為經常會碰到要讓一些應用(程序)在啟動的時候就執行,并且永遠執行到系統結束為止的問題,是以,對一個合格的嵌入式Linux工程師而言,必須學會守護程序的編寫。

由來:

在Linux中,每一個系統與使用者進行交流的界面稱為終端,每一個從此終端開始運作的程序都會依附于這個終端,這個終端就稱為這些程序的控制終端,當控制終端被關閉時,相應的程序都會被自動關閉。但是守護程序卻能夠突破這種限制,它從被執行開始運轉,直到整個系統關閉才會退出。如果想讓某個程序不因為使用者或終端或其他的變化而受到影響,就必須把這個程序變成一個守護程序 

編寫步驟:

–建立子程序,父程序退出 

–在子程序中建立新會話 

–改變目前目錄為根目錄 

–重設檔案權限掩碼 

–關閉檔案描述符 

原理分析:

由于守護程序是脫離控制終端的,是以,完成第一步後就會在Shell終端裡造成一程式已經運作完畢的假象。之後的所有後續工作都在子程序中完成,而使用者在Shell終端裡則可以執行其他的指令,進而在形式上做到了與控制終端的脫離 

由于父程序已經先于子程序退出,會造成子程序沒有父程序,進而變成一個孤兒程序。在Linux中,每當系統發現一個孤兒程序,就會自動由1号程序(也就是init程序)收養它,這樣,原先的子程序就會變成init程序的子程序了?

pid=fork();

     if(pid>0){

   exit(0);

———————————————————————————————————————

我們做了一個示範的例子,下面解釋一下例子中用到的概念:

程序組:

–程序組是一個或多個程序的集合。程序組由程序組ID來唯一辨別。除了程序号(PID)之外,程序組ID也一個程序的必備屬性之一。

–每個程序組都有一個組長程序,其組長程序的程序号等于程序組ID。且該程序ID不會因為組長程序的退出而影響。

會話期:

–會話組是一個或多個程序組的集合

–通常,一個會話開始于使用者登入,終止于使用者退出,在此期間該使用者運作的所有程序都屬于這個會話期 

setsid函數作用 

–setsid函數用于建立一個新的會話,并自任該會話組的組長

–讓程序擺脫原會話的控制

–讓程序擺脫原程序組的控制

–讓程序擺脫原控制終端的控制

由于調用fork函數時,子程序全盤拷貝了父程序的進會話期、程序組、控制終端等,雖然之後父程序退出了,但原先的會話期、程序組、控制終端等并沒有改變,是以,還沒有真正意義上獨立開來,而setsid函數能夠使程序完全獨立出來,進而脫離所有其他程序的控制。

代碼中其他部分的解釋:

同檔案權限掩碼一樣,用fork建立的子程序會從父程序那裡繼承一些已經打開了的檔案。這些被打開的檔案可能永遠不會被守護程序讀或寫,但它們一樣消耗系統資源,而且可能導緻所在的檔案系統無法卸下 

在上面的第二步後,守護程序已經與所屬的控制終端失去了聯系。是以從終端輸入的字元不可能達到守護程序,守護程序中用正常的方法(如printf)輸出的字元也不可能在終端上顯示出來。是以,檔案描述符為0、1和2的三個檔案(常說的輸入、輸出和報錯這三個檔案)已經失去了存在的價值,也應被關閉 

for(i=0;i<MAXFILE;i++)

 close(i);

 由于經濟下滑損及開發預算減少,嵌入系統設計者正在轉向FPGA(現場可程式設計門陣列)技術,以縮減開發周期、對抗裝置老化以及簡化産品更新。通過采用數量龐大且不斷增加的FPGA開發工具、可重用邏輯單元以及市售商用子產品,設計者可以構思出高性能嵌入系統,并且能夠根據需求變化作重新配置,進而盡量減少對工程和制造的影響。過去,電路闆設計者使用這些器件作系統元件之間的互連,但最新的高密度産品也可以替代一個典型嵌入項目中的處理器、記憶體、定制邏輯及很多外設。盡管它有能力改變嵌入架構,設計者仍應分析性能、功率和成本局限,以确定FPGA技術最适用的地方。

  自20世紀70年代可程式設計邏輯陣列出現以來,随着領先者Xilinx和Altera融入到更多的專業供應商(如Actel、Cypress和Lattice)中,FPGA技術已發展成為一個興旺的市場。盡管每家供應商FPGA的精确結構不同,但基本FPGA架構都包含了有電可程式設計互連的邏輯塊陣列,使用者或設計者可以在制造以後作配置。早期的器件有數千個等效門,但今天這一數量已增長到數百萬。這種互連靈活性使設計者能夠建立準确比對于特定嵌入應用需求的硬體功能。除了邏輯塊以外,最新器件還在矽片中嵌入專用處理器,使設計者能夠作出軟硬體權衡,滿足性能的需求。

  在相符合的嵌入應用中,FPGA技術為開發人員提供了多種針對分立實作或定制邏輯實作的優勢。很多有經驗的設計者在說到自己采用FPGA的主要原因時,都會提到較短的開發日程、更低的非重複成本以及量産後合并改動的能力。在高性能應用中,設計者可以建立多個并行的計算結構,其性能超過專用處理器。FPGA有一個經常被提及的缺點,那就是與通用處理器或定制ASIC相比需要更多的功耗。同樣,由于存在多個導通半導體和連接配接路徑的電阻,采用FPGA的産品也慢于相比的普通設計。雖然沒有考慮其他方案的開發時間,但FPGA技術的重複成本高于普通電路或定制電路。

  FPGA采用多種技術作互連和邏輯塊的程式設計。例如,反熔絲矽結構(antifuse-silicon)在其兩端施加一個高電壓時,會建立一個低電阻的連結。其優點包括低串聯電阻和低寄生電容,但主要缺點是采用反熔絲的FPGA是一次寫入器件,是以無法重新配置。最常見的程式設計技術是靜态RAM單元,通過使能和禁止導通半導體而對FPGA結構程式設計。雖然要多個半導體才能實作一個存儲單元,但SRAM有快速的可重程式設計能力,并且可以用正常的矽CMOS技術來實作。基于SRAM的FPGA還需要一個外部引導器件,在上電時設定存儲器。另外也可以用EPROM、EEPROM和閃存技術作FPGA程式設計,優點也是可重複程式設計能力,而無需外接引導器件。

  制造商也創造出多種對FPGA電路作描述和程式設計的方法。最常見的方法是采用一種HDL(硬體描述語言),如Verilog或VHDL(超高速內建電路HDL),描述一個設計的功能和結構。一旦定義了架構,就可以用另外的工具在一款規定的FPGA上實作這個結構。這個過程包括了電源與結構優化,然後是硬體分區、布局以及互連的布線。最後階段是将設計裝入目标FPGA,在真實的硬體環境中作測試。

   單片機、嵌入式和DSP企業無須因經濟蕭條煩惱 

   根據市場研究機構Semicast的報告,盡管目前動蕩的經濟情勢使美國、歐洲和日本等地市場信心受到沖擊,但32/64位微控制器(MCU)、嵌入式微處理器(eMPU)和通用訊号處理器(DSP)市場将繼續穩步成長。該機構預測,上述産品的整體銷售額在2008年将達86億美元,高于2007年的81億美元,并以10%的年複合成長率在2013年達到142億美元。 

  “這些産品的應用廣泛,而且依賴工業、醫療、汽車和通訊基礎裝置等發展穩定的市場,将使它們成為未來處境艱難的半導體産業中,為數不多的亮點。”撰寫上述報告的Semicast首席分析師ColinBarnden表示。 

  該報告指出,2009年消費性電子産業可能出現嚴重下滑,因為經濟風暴沖擊将從美國華爾街擴散到其它廣泛領域,消費者将必須面對失業率上升、可支配收入減少、貸款利率升高以及儲蓄和養老金價值縮水等困境。但Semicast認為,與半導體産業中的其它領域不同,消費性電子市場與消費者信心的動蕩,對32/64位MCU/eMPU以及DSP短期前景的影響較小。 

  Semicast的報告顯示,與汽車、工業/醫療和通訊基礎裝置領域相較,上述元件産品在消費性電子領域的銷售額相對較小;前者占其總銷售額的四分之三左右,而産業榮衰周期對這些領域的影響較小,是以32/64位MCU/eMPU和DSP銷售額可望在2009年之前保持穩定。 

  以下是32/64位MCU/eMPU和DSP幾個具成長潛力的應用領域: 

  醫療電子──許多已開發國家的政府,尤其是美國、日本和歐盟,将繼續面臨人口老化的長期社會影響。盡管面臨全球經濟衰退,這些政府在醫療保障方面的支出可能持平甚至下降,但醫療領域仍可被視為半導體供貨商最安全的長期成長市場之一,而且是32/64位MCU/eMPU和DSP的成長機會。 

  能量效率與節能──許多已開發國家以及污染嚴重的國家,已宣布相關計劃或者法令以降低對石化燃料的依賴。Semicast認為,汽車控制将是推動整體産業領域中半導體銷售成長的主要動力,而且該領域幾乎肯定能在未來10年多數時間内,為32/64位MCU/eMPU和DSP供貨商提供穩定成長的機會。 

  晶片卡與支付處理──預計到2013年,與晶片卡及支付處理相關的裝置支出,将從2007年的250億美元左右成長到400億美元以上,晶片卡、EPOS、卡片閱讀機和交易終端,将引領32/64位MCU/eMPU和DSP成長。 

  通訊基礎裝置──全球市場對家用DSL/纜線網絡服務的需求穩步成長,無線網絡的資料流量也不斷上升。雖然短期内32/64位MCU/eMPU和DSP在該領域中的需求可能走軟,但出現2001年那樣的市場崩潰狀況可能性極小。 

  汽車電子──雖然汽車市場面臨石油價格飙漲以及消費者購車習慣改變等因素影響,但根據曆史經驗判斷,汽車産業雖有出現低于趨勢水準的中期成長,并不會出現急遽的短期下滑。此外,由于駕駛輔助、嵌入式導航、安全氣囊和儀表盤等系統,對32/64位MCU/eMPU和DSP的需求穩定上升,這些元件在汽車領域中仍可實作短期成長。

  Semicast指出,雖然32/64位MCU/eMPU和DSP市場隻占總體半導體産業的3%左右,但憑借其80億美元的營業額和接近10%的成長率,仍然可以為飛思卡爾(Freescale)、瑞薩科技(Renesas)和德州儀器(TI)等主要供貨商提供一個穩定的平台。

繼續閱讀