游達(dá)章 , ,許文俊 , ,張業(yè)鵬 ,
(1. 湖北工業(yè)大學(xué) 機(jī)械工程學(xué)院,武漢 430068;2. 湖北省現(xiàn)代制造質(zhì)量工程重點(diǎn)實(shí)驗(yàn)室,武漢 430068)
嵌入式數(shù)控系統(tǒng)軟件可靠性是指系統(tǒng)軟件在已知條件下,在規(guī)定時(shí)間內(nèi)運(yùn)行不失效的能力,其軟件失效一般是由程序設(shè)計(jì)缺陷、參數(shù)設(shè)定錯(cuò)誤等內(nèi)部缺陷引起的[1-2],如果不及時(shí)處理將會(huì)造成嚴(yán)重后果。
由于“前、后臺”結(jié)構(gòu)和系統(tǒng)多中斷特點(diǎn),以及由于插補(bǔ)加工軌跡的多樣性,使得嵌入式數(shù)控軟件程序運(yùn)行路經(jīng)不確定性大,各模塊的運(yùn)行邏輯順序不固定,模塊之間的轉(zhuǎn)接具有隨機(jī)性,系統(tǒng)軟件可靠性建模困難,傳統(tǒng)的串、并聯(lián)等模型很難解決其可靠性建模問題。在數(shù)控系統(tǒng)可靠性研究方面,Gu 等[3]以某數(shù)控機(jī)床主軸系統(tǒng)為例,將概率模型檢測和離散時(shí)間馬爾可夫鏈應(yīng)用于故障樹分析。本文將用馬爾可夫鏈模型來進(jìn)行嵌入式數(shù)控軟件可靠性的研究。馬爾可夫鏈模型在解決系統(tǒng)模塊結(jié)構(gòu)復(fù)雜的可靠性問題上有其獨(dú)特的優(yōu)勢,適合描述嵌入式軟件各模塊之間的隨機(jī)運(yùn)行過程,而馬爾可夫鏈模型最重要的問題是其運(yùn)行剖面及轉(zhuǎn)移矩陣的準(zhǔn)確性與定量化。
在運(yùn)行剖面的生成及轉(zhuǎn)移矩陣定量化的問題上,Singh 等[4]為解決馬爾可夫鏈兩種轉(zhuǎn)態(tài)之間的轉(zhuǎn)移概率的不確定性問題,提出了用Petri 網(wǎng)對軟件系統(tǒng)進(jìn)行建模的方法,將其轉(zhuǎn)換為馬爾可夫鏈來求解線性系統(tǒng)。華中科技大學(xué)吳軍等[5]監(jiān)控了數(shù)控軟件的運(yùn)行過程,構(gòu)建了運(yùn)行剖面,但是現(xiàn)場監(jiān)測成本高,不適合初期可靠性評估。張文秀等[6]通過對風(fēng)電并網(wǎng)系統(tǒng)的運(yùn)行狀態(tài)劃分,由系統(tǒng)狀態(tài)樣本數(shù)據(jù)得到狀態(tài)轉(zhuǎn)移矩陣,進(jìn)而構(gòu)件可靠性評估模型。Calinescu 等[7]通過建立具有不確定轉(zhuǎn)移概率的馬爾可夫鏈模型,并使用兩個(gè)不同領(lǐng)域的案例來評估定量驗(yàn)證技術(shù)的有效性,證明了馬爾可夫鏈轉(zhuǎn)移概率的不確定性會(huì)導(dǎo)致錯(cuò)誤決策和低質(zhì)量的軟件系統(tǒng)。從文獻(xiàn)可以看出,馬氏鏈的運(yùn)行剖面與轉(zhuǎn)移概率問題非常重要,但對其生成與定量化方法介紹較少。
為解決上述問題,本文采用時(shí)序溯源的方法追蹤嵌入式數(shù)控系統(tǒng)程序運(yùn)行路徑,來精確定量的構(gòu)建其運(yùn)行剖面和轉(zhuǎn)移矩陣。結(jié)合數(shù)控系統(tǒng)開源程序源碼GRBL,采用軟件插樁[8-9]的方法來監(jiān)測和采集數(shù)據(jù),按照時(shí)間先后順序標(biāo)定數(shù)據(jù),繪制時(shí)序圖。另外,采用“插樁”進(jìn)行數(shù)據(jù)監(jiān)測、采集會(huì)額外占用系統(tǒng)的硬件資源,將影響程序運(yùn)行的時(shí)間,甚至?xí)淖兡K原先的執(zhí)行邏輯順序。因此采用時(shí)間補(bǔ)償?shù)姆椒ɑ謴?fù)嵌入式數(shù)控系統(tǒng)程序模塊運(yùn)行的真實(shí)邏輯關(guān)系,還原原始運(yùn)行路徑,保證運(yùn)行剖面生成的準(zhǔn)確性。
嵌入式數(shù)控系統(tǒng)有多個(gè)功能模塊,包含主任務(wù)模塊、譯碼模塊、路徑預(yù)處理模塊、速度規(guī)劃模塊、加減速模塊、插補(bǔ)模塊等,系統(tǒng)具有多個(gè)任務(wù)、多個(gè)中斷,模塊交叉運(yùn)行,程序非順序執(zhí)行。其軟件體系采用“前、后臺”結(jié)構(gòu),譯碼和插補(bǔ)預(yù)處理等模塊在后臺運(yùn)行,電機(jī)脈沖分配采用定時(shí)中斷方式作為前臺程序運(yùn)行,電機(jī)驅(qū)動(dòng)的定時(shí)周期隨著速度的變化而變化,中斷周期不固定,以此來控制步進(jìn)電機(jī)的脈沖頻率,控制電機(jī)轉(zhuǎn)速和加速度,從而達(dá)到調(diào)速的目的,因此程序運(yùn)行邏輯復(fù)雜。
而馬氏鏈模型能夠很好地解決系統(tǒng)具有隨機(jī)性和模塊化結(jié)構(gòu)復(fù)雜的可靠性問題[10-11]。用馬氏鏈模型來研究嵌入式數(shù)控系統(tǒng)軟件的可靠性,關(guān)鍵在于其運(yùn)行剖面的確定和轉(zhuǎn)移概率的量化,因此采用時(shí)序溯源的方法來得到程序運(yùn)行的邏輯順序,繪制嵌入式數(shù)控系統(tǒng)的CPU 運(yùn)行時(shí)序圖,精確定量的構(gòu)建其運(yùn)行剖面和轉(zhuǎn)移矩陣。
為獲取嵌入式數(shù)控系統(tǒng)程序運(yùn)行的邏輯順序,以程序源碼的一系列G 代碼執(zhí)行為監(jiān)測周期,根據(jù)數(shù)控插補(bǔ)原理,采用軟件插樁的方法在程序各處設(shè)置關(guān)鍵監(jiān)控節(jié)點(diǎn),主要監(jiān)控譯碼信息、坐標(biāo)信息、速度等信息,通過串口的方式將監(jiān)測信息打印出來。然后以主程序運(yùn)行時(shí)間為主線,結(jié)合前臺中斷,將采集得到的監(jiān)控?cái)?shù)據(jù),包括系統(tǒng)時(shí)間、位置信息等,按照監(jiān)測輸出的的實(shí)時(shí)時(shí)間,標(biāo)定在時(shí)間軸上,繪制CPU 運(yùn)行時(shí)序圖,重現(xiàn)運(yùn)行邏輯過程。
圖1是通過串口打印得到的部分監(jiān)測信息,在嵌入式數(shù)控程序源碼的每個(gè)功能模塊處通過插樁的方式插入“printf”語句,跟蹤程序模塊的執(zhí)行順序,并記錄程序運(yùn)行的系統(tǒng)時(shí)間。根據(jù)得到的實(shí)時(shí)時(shí)間,將每個(gè)功能模塊標(biāo)定在時(shí)間軸上,繪制嵌入式數(shù)控系統(tǒng)的CPU 運(yùn)行時(shí)序圖。
圖1 串口監(jiān)測信息
嵌入式數(shù)控系統(tǒng)的CPU 運(yùn)行時(shí)序圖如圖2 所示,該時(shí)序圖是以嵌入式數(shù)控系統(tǒng)程序的一系列G 代碼為執(zhí)行周期,將采集到的監(jiān)控信息按照時(shí)間順序標(biāo)定在時(shí)間軸上。從時(shí)序圖可以得到系統(tǒng)各功能模塊運(yùn)行的邏輯順序,進(jìn)而構(gòu)建運(yùn)行剖面和轉(zhuǎn)移矩陣。但時(shí)序圖中的串口輸出部分影響了系統(tǒng)的實(shí)時(shí)性,需要還原時(shí)序圖的真實(shí)邏輯順序。
圖2 CPU 運(yùn)行時(shí)序圖
在時(shí)序溯源過程中,最關(guān)鍵問題是監(jiān)測點(diǎn)的數(shù)據(jù)采集時(shí)間在時(shí)間軸上相對于真實(shí)位置的偏移問題,仿真環(huán)境下嵌入式系統(tǒng)的監(jiān)控及信號的采集一般采用串口等硬件資源輸出,產(chǎn)生了額外的時(shí)間開銷,影響了系統(tǒng)執(zhí)行的實(shí)時(shí)性,造成監(jiān)測點(diǎn)對應(yīng)語句執(zhí)行時(shí)間將會(huì)在系統(tǒng)時(shí)間軸上漂移,滯后程序原本的執(zhí)行時(shí)間,可能會(huì)將影響定時(shí)中斷在系統(tǒng)時(shí)間軸上發(fā)生的位置,甚至?xí)淖兡K之間執(zhí)行的順序。因此必須定量嵌入式軟件仿真運(yùn)行環(huán)境下數(shù)據(jù)監(jiān)測、采集對系統(tǒng)運(yùn)行時(shí)間的延滯量,累積疊加插補(bǔ)周期內(nèi)監(jiān)測數(shù)據(jù)輸出所消耗時(shí)間,采用時(shí)間補(bǔ)償、延長定時(shí)中斷等方法來消除其對系統(tǒng)程序運(yùn)行路經(jīng)和時(shí)序順序的改變,復(fù)原軟件運(yùn)行的正確邏輯關(guān)系,重溯CPU 真實(shí)運(yùn)行的時(shí)序圖。
為了獲得系統(tǒng)各功能模塊真實(shí)運(yùn)行的邏輯順序,以單步調(diào)試方式獲取在仿真環(huán)境下“插樁”等用于測試程序語句所運(yùn)行時(shí)間。假設(shè)前臺主程序通過六個(gè)串口輸出監(jiān)測數(shù)據(jù),通過仿真測試,測得每個(gè)串口輸出(sprintf)產(chǎn)生的延遲時(shí)間ti(i=1,2,…,6),若無串口輸出,則延遲時(shí)間ti=0。
引入狀態(tài)變量 λi來標(biāo)記每個(gè)模塊的串口輸出狀態(tài),表達(dá)式為
即在一個(gè)大周期循環(huán)內(nèi),某個(gè)中斷發(fā)生時(shí)間在時(shí)間軸上的偏移量為
由此,以大周期為循環(huán)單位,增加前臺中斷時(shí)間周期,調(diào)整時(shí)間軸上中斷發(fā)生的相對位置,還原程序運(yùn)行的邏輯順序。調(diào)整后的中斷定時(shí)時(shí)間為
式中:T2為調(diào)整后的中斷定時(shí)時(shí)間;T1為理論中斷時(shí)間。最后,驗(yàn)證改進(jìn)之后的程序,通過在線仿真觀察中斷響應(yīng)與原邏輯順序?qū)Ρ确治?,?yàn)證其一致性,通過不斷調(diào)整,使之符合真實(shí)邏輯運(yùn)行關(guān)系。
程序執(zhí)行邏輯調(diào)整示意圖如圖3 所示。圖3 中Ⅰ是實(shí)測第N周期的CPU 運(yùn)行時(shí)序示意圖,包括后臺主程序、前臺中斷和串口輸出等信息,由于在程序中使用了串口輸出,產(chǎn)生了額外的時(shí)間開銷,圖中的前臺中斷在時(shí)間軸上產(chǎn)生了漂移(理論在插補(bǔ)模塊中的前臺中斷向前漂移到了加減速模塊)。為了還原前臺中斷在時(shí)間軸上的真實(shí)位置,采用時(shí)間補(bǔ)償?shù)姆椒?,增加前臺中斷在時(shí)間軸上的時(shí)間,得到改進(jìn)后的第N周期示意圖Ⅱ。最后,去掉時(shí)序圖Ⅱ中的串口輸出部分,得到理論第N周期示意圖Ⅲ,即CPU 真實(shí)運(yùn)行的邏輯順序。
圖3 程序執(zhí)行邏輯調(diào)整示意圖
根據(jù)第2 節(jié)調(diào)整后的時(shí)序圖譜,建立插補(bǔ)程序運(yùn)行剖面,統(tǒng)計(jì)模塊相互之間的轉(zhuǎn)移概率;根據(jù)監(jiān)測的大數(shù)據(jù)及故障識別結(jié)果,計(jì)算模塊可靠度及模塊轉(zhuǎn)接失效率,構(gòu)建運(yùn)行剖面和轉(zhuǎn)移矩陣,建立基于運(yùn)行剖面的Littewood Markov 鏈模型。建模時(shí)考慮基于加權(quán)系數(shù)的模型改進(jìn)優(yōu)化,對馬爾可夫模型進(jìn)行了改進(jìn),引入了單一模塊運(yùn)行時(shí)間占系統(tǒng)總時(shí)間比例,通過加權(quán)機(jī)制來優(yōu)化模型,減少因統(tǒng)計(jì)誤差帶來的精度擾動(dòng)。
馬爾可夫鏈可以用來研究嵌入式數(shù)控系統(tǒng)中的各個(gè)功能模塊的可靠性和相互關(guān)系。馬爾可夫鏈?zhǔn)且粋€(gè)隨機(jī)過程,它在時(shí)間和狀態(tài)上都離散,是一個(gè)典型的馬爾可夫過程[12]。
設(shè)有一個(gè)隨機(jī)過程 {X(t),t∈T}, 其中X(t)表示在時(shí)間t時(shí)刻的狀態(tài),T表示離散時(shí)間的集合,其離散狀態(tài)的集合A={a1,a2,a3,···} 。 若對任意整數(shù)n∈T和任意a1,a2,···,an∈A,條件概率滿足
則稱{xn,n∈T}是馬爾可夫鏈。馬爾可夫鏈具有無后效性,即系統(tǒng)下一次的狀態(tài)只與當(dāng)前狀態(tài)有關(guān),而與上一次以及之前的狀態(tài)無關(guān)[11,13]。條件概率P{xn=j|xn-1=i}表 示系統(tǒng)在時(shí)刻n-1處 在狀態(tài)i條件下,在n時(shí)刻系統(tǒng)從狀態(tài)i轉(zhuǎn)移到狀態(tài)j的概率,稱此概率是馬氏鏈的轉(zhuǎn)移概率,也稱一步轉(zhuǎn)移概率,記為pij(n)。 轉(zhuǎn)移概率pij(n)一般可以構(gòu)成轉(zhuǎn)移概率矩陣,可表示為
其中
建立模型時(shí),考慮嵌入式數(shù)控系統(tǒng)中某一個(gè)模塊運(yùn)行時(shí)間占整個(gè)嵌入式數(shù)控系統(tǒng)運(yùn)行時(shí)間的比例,對馬爾可夫模型進(jìn)行了改進(jìn),引入了單一模塊的運(yùn)行時(shí)間占系統(tǒng)總時(shí)間比例。
假設(shè)嵌入式數(shù)控系統(tǒng)中的模塊數(shù)量為N,模塊轉(zhuǎn)移序列為x1,x2,···,xn,上一次模塊與下一次模塊之間的轉(zhuǎn)移次數(shù)構(gòu)成模塊轉(zhuǎn)移矩陣K為
式中kij為 系統(tǒng)上一次模塊狀態(tài)為i,而接下來的模塊狀態(tài)為j的模塊轉(zhuǎn)移次數(shù)。由系統(tǒng)從模塊i轉(zhuǎn)移到模塊j的轉(zhuǎn)移概率pij(n)可 得到轉(zhuǎn)移概率矩陣P為
其中轉(zhuǎn)移概率為
嵌入式數(shù)控系統(tǒng)在運(yùn)行中會(huì)伴隨著軟件程序錯(cuò)誤,出現(xiàn)模塊之間的失效,在Littewood Markov 鏈模型中模塊的失效是相互獨(dú)立的,每新增一個(gè)模塊,都將引入新的錯(cuò)誤,這種錯(cuò)誤來源于模塊的泊松失效過程[14]。設(shè)模塊 λi為 模塊i的泊松失效率,用行向量表示為 λ =[λ1,λ2,···,λi],qi j為系統(tǒng)中從功能模塊i轉(zhuǎn)移到功能模塊j失效的概率
令ti為 系統(tǒng)第i個(gè)模塊運(yùn)行的時(shí)間,模塊運(yùn)行時(shí)間序列T=[t1,t2,···,ti]。ki為系統(tǒng)第i個(gè)模塊的運(yùn)行時(shí)間占整個(gè)系統(tǒng)運(yùn)行時(shí)間的比例
在Littewood Markov 鏈模型中,程序的失效過程接近于泊松分布,改進(jìn)的Littewood Markov 鏈模型中引入了時(shí)間加權(quán)系數(shù),其失效率為
步驟1 在測試階段,記錄嵌入式數(shù)控系統(tǒng)各功能模塊的運(yùn)行順序,得到模塊運(yùn)行序列x1,x2,···,xn,即可得到模塊轉(zhuǎn)移概率矩陣P和模塊的運(yùn)行剖面,同時(shí)記錄測試階段發(fā)生故障的模塊種類以及發(fā)生故障的次數(shù),即可得到模塊失效率 λi。
嵌入式數(shù)控系統(tǒng)調(diào)整后的CPU 時(shí)序圖譜如圖4 所示,各功能模塊的運(yùn)行序列由時(shí)序圖譜獲得。為方便表示,將各個(gè)功能模塊用數(shù)字序號代替,如表1 所示。
表1 各功能模塊對應(yīng)數(shù)字序號
圖4 調(diào)整后的CPU 運(yùn)行時(shí)序圖
則由嵌入式數(shù)控系統(tǒng)的時(shí)序圖得到模塊的運(yùn)行序列為:17 123 474 321 575 656 575 656 765 651,根據(jù)模塊的運(yùn)行序列來計(jì)算各模塊之間轉(zhuǎn)移的次數(shù),得模塊轉(zhuǎn)移矩陣K為
由模塊轉(zhuǎn)移矩陣得到模塊轉(zhuǎn)移概率矩陣P為
因此,模塊的運(yùn)行剖面如圖5 所示。
圖5 模塊運(yùn)行剖面圖
測試過程中測得每個(gè)功能模塊運(yùn)行的失效次數(shù)fi和 總的運(yùn)行次數(shù)ni,可得到各個(gè)模塊的失效率計(jì)算得到的模塊失效率向量為
步驟2 在記錄模塊運(yùn)行順序的同時(shí),也需要記錄各個(gè)模塊的系統(tǒng)運(yùn)行時(shí)間ti。并測試出軟件運(yùn)行的總時(shí)間,計(jì)算系統(tǒng)第i個(gè)功能模塊的運(yùn)行時(shí)間占系統(tǒng)整體運(yùn)行時(shí)間的比例ki。各功能模塊的運(yùn)行時(shí)間及比例如表2 所示。
表2 各功能模塊的運(yùn)行時(shí)間及比例
步驟3 當(dāng)測試結(jié)束時(shí),統(tǒng)計(jì)從模塊i轉(zhuǎn)移到模塊j失效的概率,得到模塊失效概率矩陣Q為
步驟4 計(jì)算得到嵌入式數(shù)控系統(tǒng)的整體失效率F為
1)嵌入式數(shù)控系統(tǒng)的可靠性至關(guān)重要,本文結(jié)合馬爾可夫鏈進(jìn)行研究,構(gòu)建了嵌入式數(shù)控軟件運(yùn)行剖面及轉(zhuǎn)移矩陣,建立了馬氏鏈的可靠性評估模型。為嵌入式軟件故障分析、診斷、可靠性評估提供理論和技術(shù)支撐,可以推廣運(yùn)用于嵌入式軟件調(diào)試、測試、分析設(shè)計(jì)等方面。
2)傳統(tǒng)的馬氏鏈模型的轉(zhuǎn)移矩陣和運(yùn)行剖面一般通過經(jīng)驗(yàn)、或者統(tǒng)計(jì)得到,準(zhǔn)確性很難保證。較以往不同,本文提出時(shí)序溯源的方法來追蹤嵌入式數(shù)控系統(tǒng)程序運(yùn)行路徑,使構(gòu)建運(yùn)行剖面及轉(zhuǎn)移矩陣定量化。該方法很適合模塊化結(jié)構(gòu)復(fù)雜的系統(tǒng),使可靠性建模更精確。
3)時(shí)序溯源中采用了軟件插樁的方法來獲取監(jiān)測數(shù)據(jù),通過串口等硬件資源輸出將影響系統(tǒng)執(zhí)行的實(shí)時(shí)性。因此提出了時(shí)間補(bǔ)償?shù)某绦蜻\(yùn)行邏輯恢復(fù)方法,采用延長定時(shí)時(shí)間來恢復(fù)原本運(yùn)行邏輯順序,還原原始運(yùn)行路徑,保證了運(yùn)行剖面生成的準(zhǔn)確性。
4)本文通過時(shí)序溯源的方法建立了馬氏鏈的可靠性評估模型,最后對馬爾可夫鏈模型進(jìn)行了改進(jìn),引入功能模塊時(shí)間占比的加權(quán)系數(shù),通過加權(quán)機(jī)制來優(yōu)化模型,減少由于統(tǒng)計(jì)誤差帶來的系統(tǒng)評估精度擾動(dòng)。