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