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