周 鵬
(撫順職業(yè)技術學院機械與電子工程系,遼寧 撫順 113122)
在進行嵌入式系統(tǒng)設計的過程中,系統(tǒng)軟件[1]是構成各種應用功能的重要環(huán)節(jié),若嵌入式系統(tǒng)沒有操作系統(tǒng)的植入,將無法實現(xiàn)更強大的功能。所以,當視頻監(jiān)控系統(tǒng)的功能變得復雜時,則需要各種軟件的配合及任務處理,如果依靠采用高性能的處理器來提升性能,依然無法實現(xiàn)多任務的協(xié)調,因此必須將嵌入式操作系統(tǒng)移植到處理器中。有了嵌入式操作系統(tǒng)的幫助,后期的硬件驅動開發(fā)、應用軟件設計會變得十分輕松和便捷。視頻監(jiān)控系統(tǒng)終端是一個需要完成多項任務的嵌入式系統(tǒng),它需要系統(tǒng)軟件來提供支撐,完成各種監(jiān)控任務和信息的處理。因此本文主要討論系統(tǒng)啟動代碼的設計、嵌入式Linux操作系統(tǒng)內核的實時性改造及其性能的測試。
系統(tǒng)啟動代碼(boot loader)是嵌入式系統(tǒng)開發(fā)的一個重要環(huán)節(jié),它把操作系統(tǒng)和硬件平臺銜接起來,對嵌入式系統(tǒng)開發(fā)的后繼軟件開發(fā)十分重要。系統(tǒng)啟動代碼是在操作系統(tǒng)內核之前運行的一段啟動程序[2],利用這部分程序,可以檢測啟動外圍設備、構建存儲空間的對應關系,實現(xiàn)設備的軟硬件協(xié)同配合,讓整個系統(tǒng)處于最佳狀態(tài),為后續(xù)啟用操作系統(tǒng)做好準備。系統(tǒng)啟動代碼的設計需要花費大量的精力,它是整個系統(tǒng)啟動的首要條件。
系統(tǒng)啟動代碼的設計種類很多,這是由嵌入式系統(tǒng)所采用的微處理器結構決定的,且它與外設關聯(lián)緊密,即使是基于同一種處理器構建的不同開發(fā)板,由于使用的擴展接口、功能設備不同,往往也需要重新進行啟動代碼的設計與移植操作。我們無法建立一個能為所有嵌入式系統(tǒng)服務的啟動代碼,所以本文主要設計一個用于遠程視頻監(jiān)控終端的,即以S3C2440微處理器為核心的系統(tǒng)啟動代碼。
本文采用U-Boot-1.3.3的版本進行啟動代碼設計,所需工作就是在U-Boot-1.3.3中添加監(jiān)控設備使用的硬件資源配置文件、操作選項,隨后進行編譯處理[3]。在準備進行移植操作之前,需要了解當前版本的U-Boot是否支持設計所用的硬件設備,如所使用的處理器體系結構是否一致,各種I/O端口、通信借口是否相同,然后再修改U-Boot-1.3.3相關代碼。本文將使用smdk2410源代碼為示例進行代碼修改,使其能夠驅動遠程視頻監(jiān)控終端使用的硬件設備。
當對源代碼修改完畢后,進入U-Boot目錄下依次運行以下命令:
make clobber
make clean
make smdk2440_config
make
之后會生成5個文件:U-Boot;U-Boot.bin;U-Boot.srec;U-Boot.map;System.map,通過JTAG將二進制文件U-Boot.bin燒入Flash中即可。
Linux操作系統(tǒng)的是一種開源操作系統(tǒng),在使用時可以對其根據實際的需求進行裁剪和修改,使其成為符合自己設計所需的嵌入式操作系統(tǒng)。但由于該系統(tǒng)是一種面向多任務服務的操作系統(tǒng),因此它的實時性較差,為了讓它能夠應用在遠程監(jiān)控終端上,就必須對其進行實時性改造[4]。下面本文針對Linux 2.6.26內核對其進行實時性改進。
Linux 2.6.26內核主要改善了內核虛擬機支持,增加了OLPC支持,更新了攝像頭驅動等。它在很多具體的嵌入式應用中也完成了多項改進,如自身內核可搶占特性等,在Linux 2.6.26之前的內核版本中,當操作系統(tǒng)執(zhí)行與內核有關的事件時,其無法實現(xiàn)中斷,經過修改后內核的互聯(lián)及響應得到了大大的提升;輸入、輸出端口系統(tǒng)也實現(xiàn)了性能的改善,因此它可以在所有的工作任務中均具有一定的響應特性。在Linux 2.6.26的內核中,部分核心程序在執(zhí)行時會自動停止中斷的處理模式,因此可以使進程快速地完成自己的處理任務。它實現(xiàn)了在響應外部設備中斷時不會重復進入內核,這段時間外部設備過來的所有中斷信息是不能響應的,這樣就會有中斷響應延遲的存在。
為了解決上述問題,本文采用中斷線程化[5]來進行有效的處理。
1)Linux 2.6.26的內核中斷在沒有被改進之前它的應答方式為:首先操作系統(tǒng)形成中斷,處理器在中斷控制器中得到中斷向量,隨后在中斷向量表中查找相應的中斷向量。在沒有進入中斷處理程序之前,CUP需要對其進行權限的比對,即檢查是否有權限進入服務程序。
2)Linux 2.6.26使用kthread_create()函數進行系統(tǒng)內核的線程建立,由于該線程運行的位置處于內核空間,所以在調用時無需在用戶與內核空間進行轉換,這樣其執(zhí)行的效果更好。通過建立中斷線程并形成中斷處理來實現(xiàn)中斷的線程化。利用kthread_create()函數在操作系統(tǒng)進行初始化運行時建立中斷線程。同時設定中斷的優(yōu)先級,最高實時優(yōu)先級為50,依次類推直到25,因此任何IRQ線程的最低實時優(yōu)先級為25。
3)標準Linux 2.6.26內核的中斷響應過程如上所述,可知任何的中斷均是以中斷處理程序進入到common_interrupt函數中的,通過在common_interrupt函數中放入相關程序,如SAVE_ALL,call do_IRQ_JUDGE,jmp ret_from_intr來進行改進,使得中斷發(fā)生后首先轉入do_IRQ_JUDGE。
這種改進是通過一個中斷服務進程來為所有的中斷服務,這樣就在一定程度上節(jié)省了系統(tǒng)資源。
對Linux 2.6.26內核進行了實時性改進后,需要對其進行測試來確定其是否符合應用的需要。實時性能測試為測試內核的中斷響應時間。
中斷響應時間為設備硬件發(fā)生中斷時到系統(tǒng)執(zhí)行中斷處理程序初始指令所需的時間。實時性測試的過程為:利用在不同時間登錄定時器計數據的方式來完成測試。系統(tǒng)檢測到外設中斷后立即登錄定時器內數據,在系統(tǒng)調用中斷處理程序后并執(zhí)行初始化程序開始時再登錄取定時計數據,將以上定時器的登錄數據進行相減得到的數值就是中斷相應時間。本文采用Linux Trace Toolkit工具進行測試,它能夠根據實際系統(tǒng)的設計及相應的時間設定來記錄固定時間的數據處理,性能測試良好是檢測嵌入式操作系統(tǒng)實時性能的有力工具。通過測試,得到平均中斷響應時間的測試結果(見表1)。
表1 三種內核平均中斷響應時間測試結果
通過測試結果可以看出,將標準Linux 2.6.26內核的中斷設置進行修改之后,對比3種不同內核的平均中斷相應時間,改進后的系統(tǒng)響應時間明顯提升,達到了預期效果。
本文首先設計了系統(tǒng)的啟動代碼;接著對嵌入式Linux 2.6.26的內核進行了實時性改進,并對改進后的內核進行了相應的實時性能測試,從結果中可以看到,系統(tǒng)的實時性有了一定的提高,為后續(xù)應用軟件的設計打下了基礎,更加適合于遠程視頻監(jiān)控系統(tǒng)的實時應用開發(fā)。