核电安全级数字化仪控系统内存诊断设计与实现
摘要:核電廠數(shù)字化儀控系統(tǒng)根據(jù)標(biāo)準(zhǔn)要求需要對(duì)內(nèi)存診斷。為了解決物理內(nèi)存地址操作問題,提高內(nèi)存診斷覆蓋率,并提升診斷效率,設(shè)計(jì)了一種基于實(shí)時(shí)操作系統(tǒng)的內(nèi)存診斷方法。采用March C-算法,診斷范圍可覆蓋全部?jī)?nèi)存,在不影響操作系統(tǒng)中其他進(jìn)程執(zhí)行的情況下,能夠快速、安全的檢測(cè)內(nèi)存。該方法已經(jīng)應(yīng)用在防城港核電廠3#、4#機(jī)組的事故后監(jiān)視系統(tǒng)中,對(duì)我國(guó)后續(xù)核電廠數(shù)字化儀控系統(tǒng)的開發(fā)具有借鑒和指導(dǎo)意義。
一、引言
根據(jù)國(guó)際標(biāo)準(zhǔn)IEC?60880對(duì)核電廠執(zhí)行A類功能的軟件相關(guān)要求,對(duì)安全性、可靠性要求很高的核電安全級(jí)軟件,必須采用針對(duì)性的設(shè)計(jì)來實(shí)現(xiàn)對(duì)硬件的診斷。在系統(tǒng)處于運(yùn)行狀態(tài)時(shí)對(duì)內(nèi)存(Random Access Memory, RAM)進(jìn)行診斷,是提高系統(tǒng)可靠性的有效方式之一。設(shè)備應(yīng)能夠周期性的進(jìn)行內(nèi)存診斷當(dāng)發(fā)現(xiàn)故障時(shí),及時(shí)將診斷信息傳送上報(bào)。
針對(duì)目前內(nèi)存診斷覆蓋范圍不完整,而且診斷效率偏低的問題進(jìn)行了探討。采用March C-算法,設(shè)計(jì)了一種可應(yīng)用在實(shí)時(shí)操作系統(tǒng)中的內(nèi)存診斷方案。該方案能夠確保較低系統(tǒng)資源占用率、較高的檢測(cè)速度和覆蓋率,并且已經(jīng)在防城港核電廠3#、4#機(jī)組工程項(xiàng)目中進(jìn)行了應(yīng)用。
二、內(nèi)存診斷現(xiàn)狀
核電領(lǐng)域早期的數(shù)字化儀控系統(tǒng)僅能實(shí)現(xiàn)簡(jiǎn)單的算法、收發(fā)網(wǎng)絡(luò)數(shù)據(jù)和輸入輸出控制功能。其中的嵌入式軟件不使用操作系統(tǒng),采用順序執(zhí)行方式,所有功能都按照固定周期順序執(zhí)行,實(shí)現(xiàn)的內(nèi)存診斷相對(duì)簡(jiǎn)單。新一代的數(shù)字化儀控系統(tǒng),例如安全顯示系統(tǒng)普遍使用大尺寸屏幕和實(shí)時(shí)操作系統(tǒng)軟件,這種設(shè)計(jì)能夠應(yīng)對(duì)功能和性能的大幅提升,以顯示更加豐富的信息和更加復(fù)雜的畫面,例如模擬流程圖和歷史趨勢(shì)曲線等畫面,也更加便于操縱員操作減少人為錯(cuò)誤。但是需要解決三個(gè)主要的問題,第一個(gè)是如何進(jìn)行物理內(nèi)存地址操作問題,需要解決虛擬內(nèi)存與物理內(nèi)存的映射,同時(shí)需要關(guān)閉高速緩沖存儲(chǔ)器(Cache);第二個(gè)是如何覆蓋全部?jī)?nèi)存的診斷問題,需要實(shí)現(xiàn)內(nèi)存堆棧區(qū)的診斷;第三個(gè)是內(nèi)存診斷效率偏低問題,需要解決內(nèi)存診斷既能夠快速檢查內(nèi)存,又能夠做到較低系統(tǒng)資源的占用。?
二、基于實(shí)時(shí)操作系統(tǒng)的內(nèi)存診斷方法
2.1 ?整體設(shè)計(jì)
以實(shí)際工程應(yīng)用項(xiàng)目使用的實(shí)時(shí)操作系統(tǒng)為例。操作系統(tǒng)中內(nèi)存診斷功能以進(jìn)程的方式獨(dú)立運(yùn)行,該進(jìn)程優(yōu)先級(jí)很高默認(rèn)設(shè)置為255,可以防止內(nèi)存診斷進(jìn)程阻塞,進(jìn)程阻塞是指由于內(nèi)存診斷進(jìn)程發(fā)生某事件而暫時(shí)無法繼續(xù)執(zhí)行時(shí)便放棄CPU資源而處于的暫停狀態(tài)。進(jìn)程初始化階段創(chuàng)建1個(gè)管理線程和1個(gè)時(shí)鐘中斷服務(wù)程序。
內(nèi)存診斷整體架構(gòu)圖如圖1所示。主要分為三個(gè)模塊:初始化模塊、接口模塊、診斷運(yùn)行模塊。診斷進(jìn)程執(zhí)行的初始化階段開啟內(nèi)存診斷管理線程和時(shí)鐘中斷服務(wù)程序,并初始化對(duì)外接口消息隊(duì)列。
?圖1 ?內(nèi)存診斷架構(gòu)示意圖
初始化模塊用于檢查內(nèi)存地址范圍有效性,初始化接口信息狀態(tài),內(nèi)存地址映射,將物理內(nèi)存映射到進(jìn)程地址空間。等待接口模塊消息開啟診斷指令,如果開啟診斷指令到來,則創(chuàng)建內(nèi)存診斷管理線程,同時(shí)啟動(dòng)時(shí)鐘中斷服務(wù)程序。
接口模塊與外部軟件采用消息機(jī)制進(jìn)行通信,獲取內(nèi)存診斷狀態(tài)信息,包括:內(nèi)存診斷狀態(tài),錯(cuò)誤碼,錯(cuò)誤內(nèi)存地址,錯(cuò)誤次數(shù)計(jì)數(shù),數(shù)據(jù)線診斷計(jì)數(shù),地址線診斷計(jì)數(shù),內(nèi)存診斷進(jìn)度,當(dāng)前診斷內(nèi)存地址。
診斷運(yùn)行模塊包含診斷管理線程和時(shí)鐘中斷服務(wù)程序。診斷管理線程負(fù)責(zé)計(jì)算內(nèi)存診斷地址,包括地址線地址和數(shù)據(jù)地址,將虛擬地址轉(zhuǎn)換為物理地址。時(shí)鐘中斷服務(wù)程序產(chǎn)生1ms周期的時(shí)鐘中斷。在中斷處理函數(shù)中,使用March C-算法對(duì)內(nèi)存進(jìn)行在線檢測(cè),為了確保時(shí)鐘中斷服務(wù)程序在1ms內(nèi)執(zhí)行完成,默認(rèn)每次檢測(cè)內(nèi)存256字節(jié)。檢測(cè)步驟如下:
通過創(chuàng)建多個(gè)內(nèi)存檢測(cè)處理函數(shù),可以實(shí)現(xiàn)內(nèi)存檢測(cè)覆蓋完整內(nèi)存區(qū),在中斷處理函數(shù)診斷內(nèi)存前判斷當(dāng)前地址是否在堆棧段恰巧與檢測(cè)處理函數(shù)地址相同,則跳到另外一個(gè)內(nèi)存檢測(cè)處理函數(shù)運(yùn)行。
?圖2 內(nèi)存診斷模塊示意圖
2.2 內(nèi)存診斷算法分析
March算法是存儲(chǔ)器測(cè)試時(shí)常用的一種測(cè)試算法,基本原理是對(duì)所有的地址逐個(gè)進(jìn)行讀寫操作。算法的指令比較簡(jiǎn)單,只有讀寫0/1和地址變化的指令。通過對(duì)存儲(chǔ)器不斷地讀寫,用以檢測(cè)存儲(chǔ)器故障。步驟如下:
從第6步也可以倒序執(zhí)行,即先從最后一個(gè)單元開始一次進(jìn)行讀寫直到第一個(gè)單元為止。公式表示如下:
?圖3 March算法表達(dá)式
其中,W表示寫入操作,R表示讀出操作,R表示讀出第i行第j列的存儲(chǔ)單元N,W1表示把1寫入第i行第j列的存儲(chǔ)單元N,表示全部的集合,?表示集內(nèi)的總和。中括號(hào)外下標(biāo)0或者1表示成功寫入存儲(chǔ)單元的數(shù)據(jù)背景。March算法一方面取得了比較大的故障覆蓋率,另一方面,在操作次數(shù)的簡(jiǎn)化上也有較大的優(yōu)勢(shì)。
March算法有多種改進(jìn)版本,例如:March C算法,March C-算法等。各自算法表達(dá)式如下:
圖4 March C算法
?圖5 March C-算法
March C在時(shí)間操作的復(fù)雜度和長(zhǎng)度上相對(duì)冗長(zhǎng)。March C-算法改進(jìn)了 March C 算法,去掉了上述第4步驟“讀0”,減少這個(gè)操作使得原來的11次操作變成10次,而并沒有犧牲任何的測(cè)試覆蓋率,從而降低了復(fù)雜度。March C-算法能探測(cè)到較多的故障,如固定故障,轉(zhuǎn)換故障,尋址故障和絕大多數(shù)的耦合故障,操作復(fù)雜度低,故得到了較為廣泛地應(yīng)用。常見單個(gè)存儲(chǔ)單元故障模型,如下:
1.?固定故障(Stuck- at fault,SAF)是存儲(chǔ)器的某個(gè)單元或某條線固定為邏輯0或者邏輯1上不變。
2.轉(zhuǎn)換故障(Transition fault,TF)是固定故障中的一個(gè)特殊情況,指某個(gè)單元或某條線在經(jīng)過一個(gè)寫操作以后不能實(shí)現(xiàn)0到1或者1到0的轉(zhuǎn)換,分別叫做上升狀態(tài)轉(zhuǎn)換故障和下降狀態(tài)轉(zhuǎn)換故障。
3.耦合故障(Coupling fault,CF)是指多個(gè)單元故障,包括倒置耦合故障CFin,固化耦合故障CFid,橋耦合故障BF等。
4.尋址故障(Address decoder fault,AF)行或列譯碼器可能訪問不到尋址的單元;或者多個(gè)地址訪問同一個(gè)存儲(chǔ)單元;或者一個(gè)地址同時(shí)訪問多個(gè)單元;或不訪問所指定的單元而訪問其他的單元。
2.3 重點(diǎn)解決的問題
2.3.1物理內(nèi)存地址操作問題
目前大多數(shù)操作系統(tǒng)都使用了虛擬內(nèi)存映射,是計(jì)算機(jī)系統(tǒng)內(nèi)存管理的一種技術(shù)。它使得應(yīng)用程序認(rèn)為它擁有連續(xù)的可用的內(nèi)存,即一個(gè)連續(xù)完整的地址空間。而實(shí)際上,它通常是被分隔成多個(gè)物理內(nèi)存碎片,還有部分暫時(shí)存儲(chǔ)在外部磁盤存儲(chǔ)器上,這部分?jǐn)?shù)據(jù)只在需要的時(shí)候才被交換進(jìn)物理內(nèi)存,這種交換是操作系統(tǒng)經(jīng)由內(nèi)存管理單元完成的,物理內(nèi)存和外圍存儲(chǔ)器之間的數(shù)據(jù)交換以頁(yè)(page)為單位進(jìn)行。
Cache是存在于 CPU和內(nèi)存之間的存儲(chǔ)體,用于彌補(bǔ)內(nèi)存速度的不足。從 CPU看來,整個(gè)存儲(chǔ)體系的速度接近Cache,而容量卻接近內(nèi)存。CPU在取數(shù)據(jù)時(shí),先從Cache中尋找數(shù)據(jù),如果要找的數(shù)據(jù)存在于Cache中,就稱為命中,否則稱為不命中。命中的次數(shù)與總的訪問次數(shù)的比稱為命中率。此時(shí)CPU把數(shù)據(jù)從Cache中取出進(jìn)行處理。如果沒有在 Cache 中找到需要的數(shù)據(jù),就直接到內(nèi)存中查找,然后對(duì)找到的數(shù)據(jù)進(jìn)行處理,同時(shí)把這些數(shù)據(jù)回寫到 Cache 中,以備下次使用時(shí)直接從Cache中取數(shù)據(jù)。因?yàn)镃ache的存取速度比內(nèi)存的存取速度高得多,所以提高了存儲(chǔ)數(shù)據(jù)的速度。如果CPU從Cache中查找數(shù)據(jù)的命中次數(shù)提高,也就是命中率高,就可大大地提高計(jì)算機(jī)的存儲(chǔ)速度,從而提高計(jì)算的性能。
為了能夠直接診斷物理內(nèi)存,而不是虛擬內(nèi)存,可以調(diào)用操作系統(tǒng)提供的物理內(nèi)存映射接口函數(shù),獲取到物理內(nèi)存地址,并通過內(nèi)核IO接口函數(shù)訪問物理內(nèi)存地址。另外,調(diào)用操作系統(tǒng)提供的關(guān)閉Cache接口函數(shù),以避免物理內(nèi)存讀寫過程中一直訪問的是Cache中數(shù)據(jù)。
2.3.2?內(nèi)存檢查覆蓋率問題
進(jìn)程運(yùn)行時(shí)用到的堆棧內(nèi)存空間會(huì)隨著程序執(zhí)行而變化,其中棧空間為操作系統(tǒng)自動(dòng)分配內(nèi)存空間,其中數(shù)據(jù)的大小在編譯時(shí)確定,數(shù)據(jù)的分配和釋放也由編譯器在函數(shù)進(jìn)入和退出時(shí)插入指令完成,存儲(chǔ)在棧的數(shù)據(jù)包括本地變量、返回地址、函數(shù)參數(shù)、編譯器臨時(shí)空間、中斷環(huán)境等。堆空間由程序員手動(dòng)分配內(nèi)存空間,其中數(shù)據(jù)的大小和初始值在運(yùn)行時(shí)確定。
為了避免當(dāng)前內(nèi)存診斷進(jìn)程執(zhí)行的診斷函數(shù)入棧地址恰巧與當(dāng)前診斷的內(nèi)存地址重合,導(dǎo)致函數(shù)執(zhí)行內(nèi)存診斷的同時(shí)改寫了棧空間內(nèi)容,從而造成診斷函數(shù)執(zhí)行異常,直接導(dǎo)致進(jìn)程崩潰。所以地址線診斷函數(shù)和內(nèi)存數(shù)據(jù)診斷函數(shù)分別有2個(gè)完全一樣的副本,例如:AddressLine1()、AddressLine2()和DataTest1()、DataTest2()。程序執(zhí)行流程如下:
上述方法可以避免診斷內(nèi)存數(shù)據(jù)地址與數(shù)據(jù)檢測(cè)匯編程序段地址相同。每次內(nèi)存診斷完成后保存此次診斷函數(shù)在棧內(nèi)地址,在下一次內(nèi)存診斷之前進(jìn)行判斷,當(dāng)前內(nèi)存診斷地址恰巧與該函數(shù)所在棧內(nèi)地址是否重合。一旦重合則跳過此診斷函數(shù),執(zhí)行另外一個(gè)診斷函數(shù)副本。內(nèi)存檢查覆蓋率可以達(dá)到100%。
2.3.3?內(nèi)存診斷效率偏低問題
第2.2內(nèi)存診斷算法分析章節(jié)提到的March C和March C-算法是針對(duì)以位為基準(zhǔn)的存儲(chǔ)器的,但目前的存儲(chǔ)器多是以字為基準(zhǔn)的。為了減少測(cè)試時(shí)間,在測(cè)試中采用以字為基準(zhǔn)來進(jìn)行測(cè)試,但組成一個(gè)字的多個(gè)位都有可能發(fā)生耦合故障或者其他類型的故障,即字內(nèi)故障。面對(duì)這種情況就必須增加測(cè)試數(shù)據(jù)背景的組數(shù)來彌補(bǔ)這個(gè)不足,對(duì)于N位的存儲(chǔ)器,它的備用測(cè)試數(shù)據(jù)背景一共有組。以字為基準(zhǔn)的March C-算法,極大提升了診斷效率。本設(shè)計(jì)中采用的是256x8的存儲(chǔ)器模型,那么就需要4組數(shù)據(jù)背景:
表1?以字為基準(zhǔn)的數(shù)據(jù)背景
| 序號(hào) | DB | DBbitnot |
| 1 | 00000000 | 11111111 |
| 2 | 01010101 | 10101010 |
| 3 | 00110011 | 11001100 |
| 4 | 00001111 | 11110000 |
內(nèi)存診斷進(jìn)程采用很高的優(yōu)先級(jí)避免被其他進(jìn)程阻塞,在時(shí)鐘中斷服務(wù)程序中執(zhí)行內(nèi)存診斷,采用以字為基準(zhǔn)的March C-算法,1ms內(nèi)能夠診斷256字節(jié)內(nèi)存。可以很好的利用CPU空閑片段時(shí)間,有限度的占用CPU資源,從而提高了系統(tǒng)效率。
三、測(cè)試與驗(yàn)證
內(nèi)存診斷測(cè)試硬件配置使用工控機(jī),采用i7處理器,CPU主頻為1.7GHz,內(nèi)存2GB。
為了驗(yàn)證上述方法的可行性,時(shí)鐘中斷服務(wù)程序每次檢測(cè)內(nèi)存大小為256字節(jié),設(shè)置診斷間隔時(shí)間分別為10ms、40ms、60ms、100ms,用于測(cè)試CPU資源的使用率。編寫多個(gè)獨(dú)立測(cè)試進(jìn)程,分別執(zhí)行內(nèi)存讀寫、共享內(nèi)存的讀寫、消息隊(duì)列傳輸、創(chuàng)建網(wǎng)絡(luò)連接傳輸數(shù)據(jù)、創(chuàng)建串口連接傳輸數(shù)據(jù)、文件創(chuàng)建讀寫操作等。這些測(cè)試進(jìn)程與內(nèi)存診斷進(jìn)程同時(shí)運(yùn)行,用于驗(yàn)證內(nèi)存診斷是否影響這些測(cè)試進(jìn)程的運(yùn)行。
下表2給出了不同診斷頻率下CPU負(fù)荷和診斷2GB內(nèi)存所需時(shí)間。
表2?內(nèi)存診斷性能對(duì)比
| 序號(hào) | 間隔時(shí)間 | CPU負(fù)荷 | 診斷2GB內(nèi)存耗費(fèi)時(shí)間 |
| 1 | 10ms | 7% | 24小時(shí) |
| 2 | 40ms | 4% | 94小時(shí) |
| 3 | 60ms | 3% | 140小時(shí) |
| 4 | 100ms | 1%以下 | 232小時(shí) |
根據(jù)表2提供的測(cè)試數(shù)據(jù)和長(zhǎng)期運(yùn)行觀察,該內(nèi)存診斷方法能夠穩(wěn)定運(yùn)行,長(zhǎng)時(shí)間監(jiān)測(cè)系統(tǒng)資源占用率很低,具有較高檢測(cè)速度,并可以診斷全部?jī)?nèi)存。完全滿足工程項(xiàng)目的應(yīng)用需求。
四、結(jié)束語
本文介紹了基于實(shí)時(shí)操作系統(tǒng)的核電儀控內(nèi)存診斷方法的設(shè)計(jì)、實(shí)現(xiàn)和驗(yàn)證情況。該方法解決了操作系統(tǒng)中物理內(nèi)存隔離保護(hù),內(nèi)存診斷覆蓋范圍不完整和診斷效率偏低的問題,尤其是采用了以字為基準(zhǔn)的March C-算法,可以有效降低系統(tǒng)資源使用率(CPU使用率7%以下)。目前已經(jīng)應(yīng)用在防城港核電廠3#、4#機(jī)組的反應(yīng)堆事故后監(jiān)視系統(tǒng)中,取得了良好的效果。具備較高的推廣價(jià)值。
總結(jié)
以上是生活随笔為你收集整理的核电安全级数字化仪控系统内存诊断设计与实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【NOIP 模拟赛】 道路
- 下一篇: windows部署iBase4J