![]() |
(a)作為示意,圖中字母表示每一個(gè)數(shù)據(jù)區(qū)的首地址,數(shù)據(jù)區(qū)中的相對(duì)跳轉(zhuǎn)地址指向其相應(yīng)的地址位置。在實(shí)際數(shù)據(jù)區(qū)中地址字節(jié)應(yīng)為相對(duì)量。
![]() |
4.2 監(jiān)控系統(tǒng)的程序?qū)崿F(xiàn)
監(jiān)控系統(tǒng)的主要程序流程見(jiàn)圖7所示。在程序正常運(yùn)行的情況下,唯一能夠打破此數(shù)據(jù)結(jié)構(gòu)圖而出現(xiàn)例外的只有一種情況,即主程序運(yùn)行過(guò)程中出現(xiàn)了中斷服務(wù)程序。而在每一個(gè)中斷服務(wù)程序起始后即會(huì)有一“哨卡”提供其特征碼,以使監(jiān)控程序在當(dāng)前數(shù)據(jù)區(qū)找不到對(duì)應(yīng)的數(shù)碼時(shí),能為中斷服務(wù)程序的跟蹤提供一個(gè)入口。但監(jiān)控程序一定要將中斷入口前的“路標(biāo)碼”數(shù)據(jù)庫(kù)地址壓棧。以使中斷服務(wù)程序結(jié)束時(shí)能接上前面的“連環(huán)套”。
監(jiān)控系統(tǒng)設(shè)置定時(shí)器作為主系統(tǒng)的軟看門(mén)狗。監(jiān)控CPU每接收到一次被刷新的“路標(biāo)碼”,就將軟定時(shí)器復(fù)位一次,若定時(shí)器溢出則表示“路標(biāo)碼”已經(jīng)有過(guò)長(zhǎng)時(shí)間未被刷新?烧J(rèn)為原系統(tǒng)出現(xiàn)了故障。對(duì)于多任務(wù)系統(tǒng),可以設(shè)置一個(gè)公共時(shí)基,在每一次時(shí)基定時(shí)中斷中給每一任務(wù)的定時(shí)時(shí)鐘加1(每一個(gè)任務(wù)有一個(gè)獨(dú)立的時(shí)鐘寄存器,存放累積的時(shí)基個(gè)數(shù)),并判斷每一任務(wù)的時(shí)基數(shù)是否大于設(shè)定的數(shù)值,若大于即表示該任務(wù)已超過(guò)看門(mén)狗定時(shí)周期,該任務(wù)出現(xiàn)了故障需要處理。依此可彌補(bǔ)硬件定時(shí)器數(shù)量上的不足,也簡(jiǎn)化了程序。在每一次刷新“路標(biāo)碼”時(shí)會(huì)將相應(yīng)任務(wù)的時(shí)鐘寄存器清零,即將此看門(mén)狗復(fù)位。
另外,路標(biāo)碼在數(shù)據(jù)庫(kù)中的轉(zhuǎn)移范圍若超出了相對(duì)尋址范圍,例如程序在完成一個(gè)大循環(huán)后的“哨卡”地址,可由專(zhuān)門(mén)的長(zhǎng)轉(zhuǎn)移標(biāo)志提供相應(yīng)的入口地址。
![]() 圖7 監(jiān)控系統(tǒng)核心程序流程圖 |
分析監(jiān)控程序的流程圖,會(huì)發(fā)現(xiàn)實(shí)現(xiàn)監(jiān)控程序并不困難。在此基礎(chǔ)上,在不同的系統(tǒng)開(kāi)發(fā)中還可有許多應(yīng)用,例如將主系統(tǒng)重要寄存器與程序指針在“哨卡”處作刷新保存,監(jiān)控程序?qū)ⅰ吧诳ā睜顟B(tài)緩存一步,并保存前一“哨卡”地址。一旦出現(xiàn)問(wèn)題,可將程序返回該“哨卡”處恢復(fù)原來(lái)狀態(tài)繼續(xù)運(yùn)行。具體實(shí)現(xiàn)方法在此不作詳述。
5 監(jiān)控系統(tǒng)的完善
前面以一種簡(jiǎn)單的情況和工作方式說(shuō)明了監(jiān)控系統(tǒng)的運(yùn)行過(guò)程。然而在實(shí)際運(yùn)行過(guò)程中,由于監(jiān)控過(guò)程全部自動(dòng)完成,監(jiān)控系統(tǒng)工作的穩(wěn)定性和嚴(yán)密性有重要的意義。主系統(tǒng)在運(yùn)行過(guò)程中發(fā)生數(shù)據(jù)突變或者出現(xiàn)程序在相鄰“哨卡”之間的非法跳變,此時(shí)用以上的簡(jiǎn)單跟蹤方式難以直接察覺(jué)。因此,在監(jiān)控CPU與主系統(tǒng)之間的數(shù)據(jù)信息交流是必要的。另外,要保證“哨卡”設(shè)置得嚴(yán)密,必須保證監(jiān)控CPU有比主CPU快得多的運(yùn)行速度。下面簡(jiǎn)要探討一下對(duì)監(jiān)控系統(tǒng)的完善方案。
5.1 對(duì)寄存器數(shù)據(jù)的監(jiān)控
在程序運(yùn)行過(guò)程中的數(shù)據(jù)突變和程序計(jì)數(shù)指針的非法跳變最終影響的是寄存器的數(shù)據(jù)值。在相鄰“哨卡”之間不會(huì)有分支、循環(huán)語(yǔ)句,僅會(huì)涉及到置數(shù)、傳送、運(yùn)算、接口操作,對(duì)這些流程的破壞也最終反映到寄存器數(shù)據(jù)的改變上。監(jiān)控系統(tǒng)要探知這些寄存器數(shù)據(jù)的變化只有通過(guò)主系統(tǒng)與監(jiān)控系統(tǒng)的信息交換。提高系統(tǒng)可靠性是以降低原系統(tǒng)實(shí)際運(yùn)行速度為代價(jià)的,在“哨卡”程序中輸出相關(guān)寄存器內(nèi)容,過(guò)程如下:
在“哨卡”程序中,首先向監(jiān)控CPU傳送“哨卡”標(biāo)志號(hào);
接著依次傳送相關(guān)寄存器的內(nèi)容或特定的數(shù)據(jù);
最后輸出立即數(shù)#0,作為當(dāng)前“哨卡”數(shù)據(jù)傳送結(jié)束標(biāo)志。
在每個(gè)哨卡數(shù)據(jù)傳送過(guò)程中,由于監(jiān)控系統(tǒng)是與主系統(tǒng)配合設(shè)計(jì)的,并不是獨(dú)立可脫離的控制模塊,因此監(jiān)控系統(tǒng)在特定的各個(gè)標(biāo)志號(hào)的“哨卡”所接收到的數(shù)據(jù),監(jiān)控系統(tǒng)已可預(yù)知該數(shù)據(jù)來(lái)源,可以作相應(yīng)的靈活處理,或是為下一“哨卡”要得到的寄存器數(shù)據(jù)作準(zhǔn)備,或是與上一“哨卡”儲(chǔ)備的相關(guān)寄存器數(shù)據(jù)作比較,因此寄存器數(shù)據(jù)的傳送數(shù)量也是靈活可變的。開(kāi)發(fā)人員在作系統(tǒng)設(shè)計(jì)時(shí),可以對(duì)原系統(tǒng)的數(shù)據(jù)內(nèi)容作嚴(yán)密處理,還可將有關(guān)寄存器數(shù)據(jù)作預(yù)先運(yùn)算后輸出給監(jiān)控CPU,以保證寄存器內(nèi)容的準(zhǔn)確性并簡(jiǎn)化步驟。相應(yīng)于監(jiān)控系統(tǒng)數(shù)據(jù)結(jié)構(gòu)的改變,每一“哨卡”數(shù)據(jù)項(xiàng)中增加了一個(gè)字節(jié),作為該“哨卡”傳送數(shù)據(jù)的RAM存放區(qū)地址代碼。由于寄存器內(nèi)容在監(jiān)控CPU的RAM中只作暫存,可互相覆蓋,并不需消耗多大RAM空間。
簡(jiǎn)略地說(shuō),監(jiān)控系統(tǒng)針對(duì)主系統(tǒng)從各“哨卡”傳送的數(shù)據(jù)以中斷方式所作出如下的響應(yīng):
(1)一旦有數(shù)據(jù)刷新#0標(biāo)志,即表示有新的“哨卡”標(biāo)志數(shù)據(jù)從主系統(tǒng)輸出,在對(duì)標(biāo)志號(hào)進(jìn)行判斷無(wú)誤之后,即準(zhǔn)備進(jìn)行寄存器數(shù)據(jù)的判斷。
(2)監(jiān)控CPU捕捉到接口的刷新數(shù)據(jù)信號(hào)后(在圖8中,可由MSP430的10腳TA0判別刷新信號(hào);圖2中可由C2051的6腳判別刷新信號(hào)),在其中斷程序中,將接口傳送數(shù)據(jù)存于該“路標(biāo)碼”數(shù)據(jù)項(xiàng)所確定的RAM地址,依次存放。監(jiān)控系統(tǒng)對(duì)這些數(shù)據(jù)進(jìn)行簡(jiǎn)單的運(yùn)算或比較。在處理結(jié)果與預(yù)期不符時(shí)采取相應(yīng)的恢復(fù)或拯救措施。
有了對(duì)寄存器數(shù)據(jù)的監(jiān)控,可不必對(duì)原系統(tǒng)設(shè)置過(guò)密的“哨卡”,并可防止不是由程序計(jì)數(shù)指針的變化造成的寄存器數(shù)據(jù)值的突變。
5.2 監(jiān)控過(guò)程中運(yùn)行速度的配合
數(shù)據(jù)的傳送過(guò)程中,主系統(tǒng)程序相當(dāng)于在作延時(shí)操作,并沒(méi)有額外加重監(jiān)控系統(tǒng)負(fù)擔(dān),只影響了主系統(tǒng)運(yùn)行速度,在設(shè)計(jì)時(shí)應(yīng)作考慮。如果有中斷在此過(guò)程中發(fā)生,監(jiān)控系統(tǒng)亦能判別(參照?qǐng)D7的中斷部分)。
為保證監(jiān)控CPU在主系統(tǒng)下一“哨卡”標(biāo)志號(hào)發(fā)出之前將當(dāng)前“哨卡”程序全部處理完,對(duì)“哨卡”的設(shè)置間隔是有限制的。主系統(tǒng)程序中“哨卡”的設(shè)置應(yīng)考慮到監(jiān)控CPU的程序負(fù)擔(dān)。必要時(shí)如果系統(tǒng)允許,甚至可為監(jiān)控系統(tǒng)作延時(shí)操作,以安置“哨卡”程序。
可以看出,完成系統(tǒng)監(jiān)控的監(jiān)控CPU需要有足夠快的速度,一般來(lái)說(shuō),監(jiān)控程序的一個(gè)循環(huán)需要二十多條語(yǔ)句或稍長(zhǎng)。應(yīng)用于低電壓系統(tǒng),這里推薦一種性能好、速度快、低價(jià)格、低功耗的RISC處理器?/FONT>TI公司最新推出的MSP430。其指令周期僅125ns,片內(nèi)4KB+256B FLASH ROM(MSP430 F112)。假設(shè)主系統(tǒng)采用MCS-51系列,使用6MH z晶振時(shí),指令周期為2μs,則主系統(tǒng)一條指令的執(zhí)行時(shí)間監(jiān)控系統(tǒng)可至少執(zhí)行16條指令。而且MSP430自帶硬件看門(mén)狗,另外僅需一片電壓監(jiān)控芯片即可簡(jiǎn)單地設(shè)計(jì)出整個(gè)監(jiān)控硬件系統(tǒng)如圖8所示。








