嵌入式系統(tǒng)休眠喚醒自動(dòng)運(yùn)行程序的方法設(shè)計(jì)
為了提高系統(tǒng)的啟動(dòng)速度,通常采用基于休眠技術(shù)的方式來(lái)實(shí)現(xiàn)嵌入式系統(tǒng)的快速啟動(dòng)[1]。例如,在一些數(shù)字電視中,采用休眠技術(shù)以后的啟動(dòng)時(shí)間要比原來(lái)的啟動(dòng)時(shí)間約快1/3[2]。但基于休眠技術(shù)的啟動(dòng)方法有其不足之處:在保存內(nèi)存內(nèi)容時(shí)只能把內(nèi)存中的信息以快照的形式保存到磁盤(pán)或其他外部存儲(chǔ)設(shè)備,原來(lái)系統(tǒng)內(nèi)某些正在運(yùn)行的動(dòng)態(tài)進(jìn)程及進(jìn)程本身的執(zhí)行過(guò)程不能被完全保存下來(lái),從而導(dǎo)致系統(tǒng)重新啟動(dòng)后此部分進(jìn)程不能正常運(yùn)行;基于休眠技術(shù)的啟動(dòng)方式一旦以快照的形式保存后其里面的內(nèi)容將無(wú)法改動(dòng)。基于此,本文運(yùn)用一種新方法,實(shí)現(xiàn)了基于休眠的嵌入式操作系統(tǒng)啟動(dòng)后,可自動(dòng)運(yùn)行任何形式的目標(biāo)腳本和應(yīng)用程序。
1 休眠喚醒后程序自動(dòng)運(yùn)行的方法
最新的Linux2.6內(nèi)核都支持休眠和待機(jī)機(jī)制,PC系統(tǒng)中的實(shí)現(xiàn)方式有suspend2、swsusp、TuxOnIce等技術(shù),既可以把鏡像文件保存到交換分區(qū),也可以保存到一個(gè)文件[3]。Linux中這些休眠的具體實(shí)現(xiàn)方式有內(nèi)核方式和軟件方式兩種,但兩種方式都把休眠過(guò)程分為兩個(gè)階段:(1)SUSPEND階段:保存當(dāng)前系統(tǒng)各種狀態(tài)到非易失性存儲(chǔ)設(shè)備并關(guān)機(jī);(2)RESUME階段:系統(tǒng)重新啟動(dòng),引導(dǎo)后恢復(fù)已保存的狀態(tài)[4]。一般嵌入式操作系統(tǒng)的休眠過(guò)程如圖1所示,休眠后恢復(fù)過(guò)程如圖2所示。
本文提出一種基于休眠開(kāi)關(guān)如圖3所示的喚醒后程序自動(dòng)運(yùn)行方法。此方法的系統(tǒng)整體框架分為自動(dòng)執(zhí)行引擎、開(kāi)關(guān)控制進(jìn)程、休眠開(kāi)關(guān)和配置文件4個(gè)部分。
1.1 自動(dòng)執(zhí)行引擎
自動(dòng)執(zhí)行引擎采用守護(hù)進(jìn)程實(shí)現(xiàn)的方式。所謂守護(hù)進(jìn)程就是Daemon進(jìn)程,是Linux中的后臺(tái)服務(wù)程序,是一個(gè)生存期較長(zhǎng)的進(jìn)程,通常獨(dú)立于控制終端并且周期性地執(zhí)行某種任務(wù)或等待處理某些事件的發(fā)生[5]。守護(hù)進(jìn)程常常在系統(tǒng)引導(dǎo)裝入時(shí)啟動(dòng),在系統(tǒng)關(guān)閉時(shí)終止。把要運(yùn)行的目標(biāo)腳本和應(yīng)用程序放到守護(hù)進(jìn)程中,并定義一個(gè)全局變量Autoflg作為標(biāo)志位。運(yùn)用此模塊的目的是讓其在操作系統(tǒng)后臺(tái)運(yùn)行,通過(guò)標(biāo)志位實(shí)時(shí)監(jiān)控目標(biāo)腳本和應(yīng)用程序的運(yùn)行狀態(tài)。守護(hù)進(jìn)程的整體結(jié)構(gòu)圖如圖4所示。
守護(hù)進(jìn)程模塊分主調(diào)函數(shù)生成守護(hù)進(jìn)程的Daemon程序和主調(diào)函數(shù)程序兩部分,通過(guò)執(zhí)行這兩個(gè)程序最終生成在操作系統(tǒng)后臺(tái)一直運(yùn)行的守護(hù)進(jìn)程。其執(zhí)行的程序框圖如圖5所示。
1.2 開(kāi)關(guān)控制模塊
此模塊的功能是控制守護(hù)進(jìn)程中的Autoflg標(biāo)志位,此標(biāo)志位是在守護(hù)進(jìn)程中的主調(diào)函數(shù)程序中設(shè)置的,用來(lái)控制目標(biāo)腳本和應(yīng)用程序的運(yùn)行狀態(tài)。其具體程序框圖如圖6所示。
1.3 休眠模塊
此模塊實(shí)現(xiàn)守護(hù)進(jìn)程和控制模塊之間的通信,采用系統(tǒng)調(diào)用的方式,目的是通過(guò)控制模塊的執(zhí)行來(lái)控制守護(hù)進(jìn)程中標(biāo)志位的變化,而這種控制是通過(guò)在內(nèi)核中插入信號(hào)傳遞模塊來(lái)實(shí)現(xiàn)。
1.4 配置文件
配置文件(即方法執(zhí)行)過(guò)程:
(1)執(zhí)行時(shí)首先運(yùn)行守護(hù)進(jìn)程,但要通過(guò)Autoflg標(biāo)志位保證目標(biāo)腳本和應(yīng)用程序處于不運(yùn)行狀態(tài)。
(2)運(yùn)行控制標(biāo)志位函數(shù)修改Autoflg,讓其保證目標(biāo)腳本和應(yīng)用程序可以運(yùn)行。
(3)執(zhí)行快速啟動(dòng),系統(tǒng)執(zhí)行快速啟動(dòng)程序同時(shí)確保保存到磁盤(pán)或其他存儲(chǔ)設(shè)備中的標(biāo)志位是處于可以使目標(biāo)腳本和應(yīng)用程序運(yùn)行的狀態(tài)。
(4)因?yàn)榛谛菝叩目焖賳?dòng)方法是以快照的方式把內(nèi)存內(nèi)容保存到磁盤(pán)或其他存儲(chǔ)設(shè)備中,并且一旦執(zhí)行,里面的內(nèi)容將無(wú)法修改,所以以后每次操作系統(tǒng)啟動(dòng)時(shí)都能保證守護(hù)進(jìn)程的正常運(yùn)行,同時(shí)也能保證守護(hù)進(jìn)程中的標(biāo)志位處于能夠使目標(biāo)腳本和應(yīng)用程序處于運(yùn)行的狀態(tài),從而使目標(biāo)腳本和應(yīng)用程序能夠正常運(yùn)行。
(5)為了提高CPU的運(yùn)行速度和整個(gè)系統(tǒng)的使用效率,本方法設(shè)置守護(hù)進(jìn)程在每次啟動(dòng)目標(biāo)腳本和應(yīng)用程序后都自動(dòng)退出。因?yàn)樵O(shè)置守護(hù)進(jìn)程的目的就是在每次操作系統(tǒng)啟動(dòng)時(shí),使其啟動(dòng)目標(biāo)腳本和應(yīng)用程序,待這項(xiàng)工作完成以后,它的使命也隨之完成(即從系統(tǒng)的運(yùn)行速度和運(yùn)行效率角度來(lái)看,已沒(méi)有其存在的必要性)。
2 實(shí)驗(yàn)分析
為了確保本文所提方法的實(shí)用性和可靠性,把其應(yīng)用到海爾數(shù)字電視上進(jìn)行了驗(yàn)證,并對(duì)驗(yàn)證結(jié)果進(jìn)行了詳細(xì)的分析。
實(shí)驗(yàn)環(huán)境如下:
(1)硬件環(huán)境:MSTAR 6I98電視主板:主頻為700 MHz,內(nèi)存為512 MB,F(xiàn)lash為256 MB,總線為I2C、PCI。
(2)軟件環(huán)境:電視主板中運(yùn)行Linux-2.6.28.9嵌入式操作系統(tǒng),串口控制臺(tái)服務(wù)器為L(zhǎng)inux操作系統(tǒng)。
首先對(duì)海爾數(shù)字電視采用基于休眠的技術(shù)對(duì)其操作系統(tǒng)進(jìn)行改進(jìn),實(shí)現(xiàn)數(shù)字電視的快速啟動(dòng)。但當(dāng)采用休眠方式啟動(dòng)后,發(fā)現(xiàn)一些應(yīng)用程序(如/applications/df_
logo、/applications/bin/haier_board)都無(wú)法正常運(yùn)行。對(duì)此采用ps命令行查看其進(jìn)程是否存在,發(fā)現(xiàn)某些進(jìn)程(如df_logo)在控制臺(tái)上有顯示,但在實(shí)際情況中不能正常運(yùn)行,而有些進(jìn)程(如haier_board)根本就沒(méi)有顯示。
經(jīng)研究表明,這些腳本或應(yīng)用程序不能正常啟動(dòng)的原因是:logo文件的執(zhí)行過(guò)程或haier_board應(yīng)用程序中的一些動(dòng)態(tài)界面的顯示過(guò)程在休眠時(shí)不能夠完全保存到休眠文件中,從而導(dǎo)致在休眠啟動(dòng)后雖然用命令行查看這些程序的進(jìn)程在控制臺(tái)上有顯示,而電視界面不能按正常的方式顯示。為了解決這個(gè)問(wèn)題,把本文方法應(yīng)用到操作系統(tǒng)中,最后結(jié)果顯示:df_logo和haier_board兩個(gè)應(yīng)用程序在系統(tǒng)啟動(dòng)完成后即能正常啟動(dòng)運(yùn)行,其效果和采用非休眠方式啟動(dòng)的效果一樣,而且電視界面也能夠正常顯示。
實(shí)驗(yàn)步驟如下:
(1)把不能正常運(yùn)行的應(yīng)用程序和腳本文件(df_logo、haier_board)編寫(xiě)成目標(biāo)腳本并把它放到指定目錄下;(2)編寫(xiě)內(nèi)核模塊,并用系統(tǒng)調(diào)用的方式把模塊插入到內(nèi)核,用交叉編譯生成新的內(nèi)核和模塊的.ko文件;(3)編寫(xiě)守護(hù)進(jìn)程函數(shù),并用交叉編譯生成可執(zhí)行文件;(4)編寫(xiě)控制模塊(控制模塊里包含可以使操作系統(tǒng)實(shí)現(xiàn)快速啟動(dòng)的函數(shù)),并用交叉編譯生成可執(zhí)行文件;(5)重新燒寫(xiě)新的內(nèi)核;(6)在/etc/init.d/文件夾的相應(yīng)文件里加一句加載上述模塊的語(yǔ)句,使其在系統(tǒng)每次啟動(dòng)時(shí)都能夠自動(dòng)加載到內(nèi)核;(7)為此模塊建立設(shè)備文件;(8)執(zhí)行守護(hù)進(jìn)程可執(zhí)行文件,使其在操作系統(tǒng)后臺(tái)運(yùn)行;(9)執(zhí)行控制模塊的可執(zhí)行文件,使其在改變標(biāo)志位后立即執(zhí)行快速啟動(dòng)程序,從而保證系統(tǒng)以后每次重啟后都能夠自動(dòng)運(yùn)行目標(biāo)腳本和應(yīng)用程序。
本文提出了一種新的方法,實(shí)現(xiàn)了基于休眠的嵌入式操作系統(tǒng)啟動(dòng)后,自動(dòng)運(yùn)行任何形式的目標(biāo)腳本和應(yīng)用程序。
評(píng)論