中國船舶重工集團公司第七一六研究所 崔 娟
一種VxWorks系統CPU利用率圖形化顯示方法的設計與實現
中國船舶重工集團公司第七一六研究所 崔 娟
本文介紹了嵌入式VxWorks操作系統下一種CPU利用率圖形化的顯示方法。它利用系統輔助時鐘硬件提供的周期性中斷服務,對系統中當前現有任務的執行時間進行周期性抽樣,并基于WindML多媒體庫窗口系統的重繪機制,在預定義的網格化畫布中,將當前時刻及其之前的所有采樣點用直線相連接,實時描繪出相應曲線,為用戶在目標機下提供CPU利用率的圖形化觀察手段,從而輔助系統運維人員方便地去診斷和解決VxWorks系統中存在的任務調度、性能瓶頸等問題。
VxWorks;輔助時鐘;CPU利用率;WindML窗口系統
VxWorks是美國風河公司推出的在國防、工業、通信、醫療、航空、航天、物聯網等領域廣泛應用的操作系統,以高性能、高可靠、強實時等為其顯著特點[1]。
在嵌入式系統中,通常采用交叉方式進行開發與調試,由主機端開發工具實現對目標機的性能監控[2]。在目標機沒有特別方便的圖形化系統監察手段,尤其運行態過程沒有開發機的情況下,很難通過圖形化手段觀察系統運行情況,因此本文針對此需求研究一種在WindML窗口系統下實時觀察VxWorks系統下CPU利用率的手段,為軟件開發人員診斷VxWorks系統中存在的任務調度問題,性能問題提供技術參考。
在VxWorks系統下,一個任務可以理解為一段程序的執行,系統內核通過TCB(Task Control Block)任務控制[3]塊來對每個任務當前用到的CPU各相關寄存器的值、對應的任務棧空間、任務優先級等各類任務運維所需的信息進行管理與控制。每個任務具有睡眠、就緒、運行、掛起、阻塞等狀態。
任務調度就是要由系統核心服務決定CPU當前需要執行哪個任務的代碼,而調度的核心就是需要設計一種調度算法來為就緒等待運行的任務分配CPU資源。VxWorks操作系統通常采用基于優先級搶占式調度算法和Round-Robin輪轉調度算法[4]這兩類算法相結合的方式進行多任務調度。
在一個多任務運行的生產環境下,應用程序可以創建并生成多個獨立任務完成相關業務,這可以使CPU利用率得到最優發揮。VxWorks多任務Wind內核[5]采用中斷機制來驅使調度器正常運轉,實現較快的上下文切換和較低的中斷延遲。
WindML(Wind Media Library)風河媒體庫是VxWorks系統下為用戶提供的一個用于開發GUI圖形用戶界面程序的框架系統。
WindML主要由驅動開發包和軟件開發包組成: DDK提供硬件驅動的開發標準接口庫,用戶可以開發顯卡、聲卡、操控等設備驅動程序,它是SDK 和硬件的中間層[6],SDK 用來開發應用程序,在圖元、操控、音頻、字體、窗口管理及可視化控件等方面提供API。
CPU利用率其實就是運行的程序占用CPU資源的時間比例,表示機器在某個時間點的運行程序的情況。使用率越高,表明機器在這個時間上運行了很多程序,或者說程序比較耗CPU資源,反之較少。
目前有多種在嵌入式計算機操作系統中檢測CPU利用率的方法,嵌入式操作系統VxWorks中主要有兩種CPU占用率檢測的方法:
第一種:通過創建兩個特殊的任務,一個優先級最高和一個優先級最低的任務,在高優先級任務中運行一個循環次數很大的循環代碼,用于占用所有的CPU時間,并記錄一段時間內計數值;然后再設置一個優先級別最低的任務,當所有任務都停止時CPU才會調度此任務,此任務記下在無其他任務占用CPU的情況下的計數值,則CPU占用率=(total-idle)% total。
第二種:通過操作系統附帶的spy--Task activity monito[7],其利用輔助定時器產生中斷,并且內核的任務控制塊TCB會為每個被調度的任務維護一個計數器。通過記下被中斷的任務,并且將該任務的計數器不斷累加。經過一段時間后,每個任務的計數器就真實反映該任務占用CPU的情況。spy利用抽樣技術,得到的CPU利用率的準確程度取決于任務的持續性和周期性。
以VxWorks6.9系統對應的集成開發環境Workbench 3.3為例,說明spy工具的配置及使用方法。選擇鏡像工程的Kernel Conf i guration,進入內核組件編輯配置界面。按如下路徑依次點擊:
Hardware(default)àperipheralsàclocksàAux clock,右鍵包含該組件,如圖1所示為輔助時鐘組件已經配置進系統。

圖1 輔助時鐘組件配置

圖2 spy監測工具配置

圖3 spy啟動后的周期性CPU利用率報告
按如下路徑依次點擊:
development tool componentsàspy,右鍵包含該組件,如圖2所示為spy監聽工具組件已經配置進系統,并且可支持最多200個任務對CPU占用的情況監控。
配置并重新編譯VxWorks鏡像,便可以使用spy工具。在shell下輸入spy命令即可啟動實時監控,圖3所示為某次監控報告的摘要信息。
輸出的報告有兩列關鍵信息,分別描述如下:
total列信息反映了從啟動輔助時鐘和監測任務開始后,每個任務的CPU活躍度
delta列信息反映了從上一次CPU利用率報告以來的CPU活躍度
spyLib庫提供spyCommon函數,帶一函數指針參數。函數指針類型為(int)(*p)(char * fmtStr,…)。可以通過編寫自定義函數來間接獲取spy需要打印的數據,spy調用該函數按行打印結果,可以不斷分析每一行字符串來得到需要的結果。

嵌入式VxWorks系統運行時CPU利用率圖形化顯示方法主要由三部分組成:(1)輔助時鐘中斷服務;(2)周期采樣任務,(3)圖形化顯示任務。
如圖4所示為它的總體結構圖。

圖4 總體結構圖
本工具提供了實時監測任務占用CPU時間的控件類實現類的主接口spyCpuStatus會發起一個任務周期調用spyCpuReport來顯示每個任務、中斷、內核、空閑分別消耗的CPU時間同時會顯示自輔助時鐘啟動開始以來的CPU時間總使用情況和兩次spyCpuReport之間相關使用情況的變化相關CPU占用時間數據由連接到輔助時鐘中斷的中斷級程序來收集。當前該類控件還不能用在無輔助時鐘的CPU上。那些在輔助時鐘中斷級之上的中斷不能被監測到
嵌入式VxWorks系統運行時CPU利用率圖形化顯示方法的設計主要包括以下幾個方面的關鍵技術:
(1)初始化各類時間變量
在任務運行上下文、中斷程序運行上下文、空閑idle任務運行上下文、內核態運行上下文,都需要獲取CPU資源來執行,因此需要分別為這些情況定義相關的時間變量來統計各類情況下對CPU的時間占有計數。且需要分別為它們定義兩種類型的變量:統計自開始監控以來的總時間;每兩次抽樣之間的時間累積變化。
同時需要獲取系統當前所有的任務列表,并根據每個任務的TCB任務控制塊,將每個任務的運行時間統計變量tick值歸零。
(2)初始化輔助時鐘
掛接輔助時鐘中斷程序ISR該函數在輔助時鐘每產生一個滴答tick數的時候被調用,調用頻率為設置的輔助時鐘中斷頻率。ISR中斷服務程序主要用于統計中斷、內核空閑、內核時間、運行任務的tick計數的累加,亦即按如下情況進行處理:
如果打斷一個中斷,則中斷tick數增加
如果打斷內核運行,則內核tick數增加
如果打斷空閑任務,則空閑tick數增加
如果打斷就緒任務,則任務tick數增加
以上各個tick都是輔助時鐘的tick,當設置輔助時鐘頻率200時,則1個tick為1/200秒。
(3)周期性更新CPU利用率數據
一個優先級為5的抽樣任務,該任務調用頻率設置為每秒調用一次。該任務負責累加在兩次抽樣之間整個系統中“輔助時鐘中斷”+“所有的任務”+“內核”+“中斷”+“空閑任務”占用CPU的總時間,每類時間的更新方法相同,描述如下:
首先將兩次抽樣之間某類型的時間增量spyCpu_XXX_Inc_Ticks臨時保存在臨時變量tmp_XXX_Inc_Ticks中;
隨后將spyCpu_XXX_Inc_Ticks清零,供輔助時鐘中斷繼續從頭累加;
然后將臨時保存的增量tmp_XXX_Inc_Ticks累加至總時間量spyCpu_XXX_Total_Ticks
亦即可以得出每次采樣點下的各類信息占用CPU的百分比之和,便可以給圖形化程序提供數據支撐。
(4)圖形控件的結構定義
圖形化的關鍵,是利用WindML圖形系統下的窗口重繪函數進行CPU利用率的實時繪制,需要在窗口內部區域定義柵格,整個控件所需的數據結構定義如下:

// 動態曲線框12條垂直線x坐標值數組

// 動態曲線框每條垂直線左移的步進索引

// 采樣值步進的像素值

// 動態曲線框底框所同時容納的采樣點個數

// 已采樣的次數

// 所有采樣點的(x,y)坐標

// 采樣CPU的周期(單位:秒)

(5)CPU利用率的實時繪制
每一個WindML圖形窗口,均有與其對應的消息回調函數機制[8],通過調用winCreate標準API創建窗口時,注冊MGS_DRAW窗口重繪消息對應的處理回調函數,來實現對CPU利用率的繪制。以下為所需注冊的窗口回調函數表,其中cbWinDraw為窗口刷新重繪函數。

在窗口重繪函數中,根據采樣點的刷新頻率、每次刷新的步進像素值等配置信息,利用WindML提供的以下uglXXX繪圖函數:

通過圖形編程實時將采集到的數據繪制為曲線圖,窗口每次重繪的可視化邏輯流程圖見圖5。

圖5 CPU利用率曲線每次重繪的流程圖

圖6 WindML窗口下的CPU利用率繪制
通過定制修改spyLib庫,并集合WindML窗口系統重繪機制以及ugl繪圖函數,最終實現了在VxWorks平臺下圖形化實時顯示CPU利用率的功能,效果如圖 6所示。
本文介紹了嵌入式VxWorks操作系統下的一種CPU利用率圖形化顯示方法。它采用系統輔助時鐘硬件提供的周期性中斷服務,對系統中當前所有運行的任務執行時間進行周期性抽樣,基于VxWorks系統的WindML多媒體圖形庫提供的窗口系統,在從右往左移動的網格化畫布中,實時將當前以及先前所有采樣點對應的CPU利用率通過直連連接描繪,為用戶在目標機下提供CPU利用率的圖形化觀察手段。該方法幫助嵌入式VxWorks系統開發人員更直觀、形象的了解目標VxWorks的實時性能,以方便開發者監測和分析診斷目標操作系統運行以及執行的應用程序可能出現的各種問題。
本文給出了該方法的設計模型和一些核心技術的實現原理,完成了一個嵌入式VxWorks操作系統的CPU利用率分析工具的框架。但與Windows相比,無論從數據采集的靈活性和可配置性方面,還是對于可視化部分的自定義查看等靈活操作等方面都存在著一些差距,同時對于多核系統下的CPU利用率監控,還需要進一步的研究充實和完善。
[1]陳智育,溫彥軍,陳琪.VxWorks程序開發實踐[M].北京:人民郵電出版社,2004.
[2]孔祥營,張保山,俞烈彬.VxWorks驅動及分布式編程[M].北京:中國電力出版社,2007.
[3]王金剛,宮霄霖,楊錫勱.基于VxWorks的嵌入式實時系統設計[M].北京:清華大學出版社,2004.
[4]周啟平,張楊,吳瓊.VxWorks開發指南與Tornado實用手冊[M].北京:中國電力出版社,2004.
[5]曹桂平,張勇,王麗娜.VxWorks設備驅動開發詳解[M].北京:電子工業出版社,2011.
[6]練學輝,朱佳麗,喬大雷.基于WindML的圖形開發與應用[J].雷達與對抗,2015,35(1):65-68.
[7]VxWorks Kernel Programmers Guide 6.9.USA: WindRiver Corporation,2015
[8]趙剛,張翀,江勇.計算機圖形顯示、加速及實現技術——基于VxWorks的嵌入式圖形系統開發實例[M].北京:電子工業出版社,2009.
Design and implementation of a graphical display method for CPU utilization of VxWorks system
Cui Juan
(Jiangsu Automation Research Institute,Lianyungang 222061,China)
This paper introduces a graphical display method of CPU utilization in embedded VxWorks operating system.Using periodic interrupt service which provided by system auxiliary clock hardware,periodic sampling of execution time in all running tasks.Based on the window system of WindML multimedia library,on the grid in the canvas,portrayed all the sampling points corresponding to CPU utilization value by directly connecting every point.The paper provides users with a graphical means of observation of CPU utilization in the target machine,easily helping operations engineer diagnose and solve the existing VxWorks system task scheduling problems,performance bottleneck issues etc..
VxWorks;Auxiliary Clock;CPU Utilization;WindML Windows System
崔娟(1982—),女,陜西延安人,碩士,高級工程師,主要研究方向為嵌入式操作系統、平臺軟件。