摘 要:linux作為嵌入式操作系統在嵌入式系統中應用越來越普及。linux若是作為一個實時操作系統,它無法滿足實時系統嚴格的實時性要求。rtlinux是在linux內核的下層實現所得的一個簡單的硬實時內核,但是rtlinux也存在一個很大的缺陷,那就是實時任務無法使用linux提供的服務,特別是它無法使用linux中的tcp/ip的網絡功能,在此介紹的iwip是一個可以運行在rtlinux并能被實時任務使用的嵌入式的輕量級tcp/ip協議棧。iwip還可以使實時任務與遠程實時任務或linux用戶進程通訊。根據這些特性,我們通過將linux,iwip和rtlinux3者合理的結合在一起,從而構成一個全新的實時系統框架。
關鍵詞:嵌入式系統;rtlinux;iwip;設備驅動程序
引 言
linux或經過簡單改進的linux都是不能運行實時任務,這是因為linux的“公平”時間分配的調度算法要保證分配給每一個用戶程序占用cpu時間,然而實時任務對執行時間要求很嚴格,如每隔200ns從傳感器取樣的實時任務。linux系統的虛擬內存的內存管理使得任何用戶進程的頁面在任何時刻都能被交換到硬盤或外存儲器中,這樣在linux中將需要的頁面返回到ram中也需要花費一段不確定的時間。另外,對任務執行的時間和任務完成時間都是沒有的可預知性的。linux操作系統的“天生”缺陷使得linux無法滿足實時嵌入式系統的實時系統要求。在本文中我們主要討論實時操作系統rtlinux和linux有機集成在一起,構成了一個全新的實時系統。
rtlinux的實現機理
rtlinux是美國新墨西哥州大學計算機科學系victoryodaiken和micae brannanov開發的。它在linux內核的下層實現了一個簡單的實時內核,而linux本身作為這個實時內核的優先級zui低的任務,所有的實時任務的優先級都高于linux系統本身的以及linux系統下的一般任務。rtlinux的體系結構如圖1所示。
rtlinux的設計思想是:應用硬件的實時約束將實時程序分割成短小簡單的部分,較大部分承擔較復雜的任務。根據這一原則,將應用程序分為硬實時和程序2個部分。硬件實時部分被作為實時任務來執行,并從外部設備拷貝數據到一個叫做實時有名管道(rtfifo)的特殊i/o端口;程序主要部分作為標準linux進程來執行。它將從rtfifo中讀取數據,然后顯示并存儲到文件中,實時部分將被寫入內核。設計實時有名管道是為了使實時任務在讀和寫數據時不被阻塞。圖2所示的是實時有名管道結構圖。
rtlinux通過對標準linux內核進行改造,將linux內核工作環境作了一些變化。如圖2所示,在linux進程和硬件中斷之間,本來由linux內核*控制,現在在linux內核和硬件中斷的地方加上了一個rtlinux內核的控制。linux的控制信號都要先交給rtlinux內核進行處理。在rtlinux內核中實現了一個虛擬中斷機制,linux本身永遠不能屏蔽中斷,它發出的中斷屏蔽信號和打開中斷信號都修改成向rtlinux發送一個信號。如在linux里面使用“si”和“cli”宏指令,讓rtlinux里面的某些標記做了修改。也就是說將所有的中斷分成linux中斷和實時中斷兩類。如果rtlinux內核接收到的中斷信號是普通linux中斷,那就設置一個標志位;如果是實時中斷,就繼續向硬件發出中斷。在rtlinux中執行sti將中斷打開之后,那些設置了標志位表示的linux中斷就繼續執行,因此,cli并不能禁止rtlinux內核的運行,卻可以用來中斷linux。linux不能中斷自己,而rtlinux可以。
這里體現了rtlinux設計過程中的原則:在實時模塊中的工作量盡量少,如果能在linux中完成而不影響實時性能的話,就盡量在linux中完成,因此,rtlinux內核可以盡量做得簡單。在rtlinux內核中,不應該等待資源,也不需要使用共享旋轉鎖。實時任務和linux進程之間的通信也是非阻塞的,從來不用等待進隊列和出隊列的數據。rtlinux將系統和設備的初始化交給了linux 完成,對動態資源的申請和分配也交給了linux。
rtlinux使用靜態分配的內存來完成硬件實時任務,因為在沒有內存資源的時候,被阻塞的線程是不可能具有實時能力的。
輕量級tcp/ip協議棧iwip向rtlinux的移植
iwip概述
lwip是瑞典計算機科學研究所(sics)的計算機與網絡結構實驗室(cna)的adamdunkel設計的一個小型的獨立的tcp/ip協議棧。lwiptcp/ip協議棧設計的思想是:在保持完整的tcp/ip協議棧的前提下zui大限度的降低其所需的資源,以適應只有十幾kbytesram和40kbytes左右的rom的嵌入式系統。iwip協議棧包含了ip,*6,icmp,udp和tcp等協議。
iwip協議棧不是像tcp/ip網絡協議那樣分不同層次,每一層分別負責不同的通訊功能。iwip設計的初衷是應用于嵌入式系統,嵌入式系統通常有較強的實時性和內存容量有限等特點,因此iwip在網絡協議棧中不是*遵守網絡協議棧的分層體系結構進行設計的。例如應用層為了提高實時性,它并沒有遵守“上層調用下層提供的服務,下層向上層提供服務”這個協議分層設計的原則,而是應用層和其下層共享系統內部的緩沖區,從而節省應用程序與下層協議之間的數據復制所需的系統開支。
iwip除了上面提到的tcp/ip協議棧外,它還包含了一些應用支撐模塊。這些支撐模塊是操作系統抽象層模塊(sys_archmodule)、內存管理模塊、網絡功能接口模塊和校驗和計算模塊。這些模塊中,除了操作系統抽象層外,其他模塊都是相互獨立的。iwip棧向rtlinux上的移植的關鍵點就是將它新增的對操作系統函數調用和數據結構添加或集成到操作系統抽象層模塊中。這樣,操作系統抽象層向其他調用它的模塊提供統一的api接口,使得系統的移植與具體的硬件系統無關,降低了系統移植的復雜性。操作系統抽象層提供的外部應用接口中包括了諸如線程管理、定時器管理以及中斷管理等系統資源管理接口。由于該部分內容在很多書籍和資料中都已經做了很詳盡的論述,在此不再做詳細闡述了。
rtlinux中的網絡驅動程序的設計
網絡驅動程序的功能主要是賦予本機網絡ip地址、掩碼、網關地址和收發網絡數據包等。iwip包含有網絡接口驅動程序,但是這些驅動程序是針對標準linux系統的,而非rtlinux的,因此我們有要將這些網絡接口驅動程序進行適當的改造以適用于rtlinux系統。在rtlinux系統中,我們是利用前面提到的rtfifo對網絡接口驅動程序進行功能擴展和性能改進。這樣,linux系統和rtlinux系統就像2個獨立的系統。
rtlinux中進程之間、內核與進程之間都是通過信號(signal)進行相互通信的。信號是基于pos2ix標準,rtlinux的設備驅動程序也是基于posix標準,它可以調用標準的文件操作函數如open,read,write,close等。但是基于posixb標準的信號存在一個問題,那就是每次進程只能接收一個信號,后續的信號無法被接收,網絡驅動程序的這種“串行”處理網絡數據包的方式和網絡上數據包傳輸的突發性的特點對嵌入式系統是一個很大的障礙和威脅。因為嵌入式系統的內存是極其有限的資源,上述那種處理方式很容易造成系統緩沖區滿負荷從而導致系統內存溢出,更壞的后果可能是導致整個系統的崩潰。在研究了上述問題后,筆者借鑒了標準linux系統中實時信號(linux內核沒有利用實時信號)的特點,提出了將數據包接收處理線程注冊到網絡驅動程序中,當有數據包到達時,網絡驅動程序即刻通知該線程去接收抵達的數據包。同時,在添加一個全程變量,用來跟蹤記錄當前被掛起的信號數目。這樣既可以提高系統的處理接收數據包的實時性能,同時又解決了posix標準中信號接收的問題。這個處理機制的代碼實現也是很簡單的,其部分主要代碼如下所示。
do{
read(fd,(void3)&receive,1546);
}while(dec_pendent_signals());
上面那段代碼中的dec_pendent_signals函數的功能流程大致如下:
intdec_pendent_signals()
{……
stop_interrupt(…);關中斷
if(pendent_signals==1)retval=0;
pendentsignals;接收并處理被掛起的信號對列里的一個信號allow_inerrupt(…);
開中斷
……}
中斷處理程序
網絡接口中斷處理程序也同樣存在前面提到的問題,即當驅動程序正在處理一個數據包接收中斷時,后續數據包到達時網卡產生的硬件中斷都無法被驅動程序接收到。筆者在此提出了一個較為合理的解決方案。在網卡驅動程序初始化時,驅動程序給網卡分配一個指向系統內存的指針,這個指針是個單循環指針鏈表。此設計的好處在于當有數據包到達時,網卡可以將數據包緩存在這片系統內存中,并將相應的標志位置位。當該數據包被上層應用成功接收后,該標志位也復位。下面這段代碼是用直觀的程序語言進行描述的。
while(next_upd->uppkstatus&uploaded){
receive_packet();}
代碼中的uploaded就是上面提到的標志位。我們可以用更直觀的圖例描述這個解決方案,如圖3所示(圖3中的upd表示接收包描述符,即upload packet desc-riptors)。
從圖3我們可以看出:系統能否zui大限度的降低丟包率,在很大程度上取決于接收數據緩沖區的容量。一方面,嵌入式系統的內存是很寶貴也很有限的資源,另一方面,系統能否正常工作以及性能穩定在很大程度上又決定于內存資源的合理布局與分配。就網絡接口而言,考慮到網絡中多播和組播數據包的存在,網絡接口需要把他們都接收下來,然后判斷該數據包是否是發給自己的。由于網絡中這樣的多播和組播數據包在所有傳輸的數據包中占有很大部分比例,因此,倘若網絡接口沒有及時處理收到的數據包,該數據包就可能被后續到達的數據所覆蓋。因此,如何從兩者中找到一個折衷的方案是在實踐過程中,針對具體的系統做不同的設計。
結束語
計算機與通信技術日新月異,尤其在因特網方面,將rtlinux應用在針對實時嵌入式系統的研究與開發也越來越受到人們的關注。本文中我們比較詳細的介紹了將iwip移植到rtlinx的過程,并就rtlinux下的網絡驅動程序設計作了比較深入的研究與實踐。實時嵌入式系統是當前的研究與實踐的一個熱點,有許多問題亟需解決,本文只是冰山上的一角,希望能拋磚引玉。
免責聲明
- 凡本網注明"來源:智能制造網"的所有作品,版權均屬于智能制造網,轉載請必須注明智能制造網,http://www.xashilian.com。違反者本網將追究相關法律責任。
- 企業發布的公司新聞、技術文章、資料下載等內容,如涉及侵權、違規遭投訴的,一律由發布企業自行承擔責任,本網有權刪除內容并追溯責任。
- 本網轉載并注明自其它來源的作品,目的在于傳遞更多信息,并不代表本網贊同其觀點或證實其內容的真實性,不承擔此類作品侵權行為的直接責任及連帶責任。其他媒體、網站或個人從本網轉載時,必須保留本網注明的作品來源,并自負版權等法律責任。
- 如涉及作品內容、版權等問題,請在作品發表之日起一周內與本網聯系,否則視為放棄相關權利。
2025長三角國際智能儀表/線纜產業博覽會
展會城市:滁州市展會時間:2025-11-11