一種匯編級(jí)的單粒子軟錯(cuò)誤的測(cè)試點(diǎn)設(shè)置與優(yōu)化方法
【專利摘要】本發(fā)明一種匯編級(jí)的單粒子軟錯(cuò)誤的測(cè)試點(diǎn)設(shè)置與優(yōu)化方法,包含如下步驟:劃分基本塊并生成分塊表;執(zhí)行函數(shù)返回優(yōu)化;執(zhí)行函數(shù)調(diào)用優(yōu)化;執(zhí)行循環(huán)優(yōu)化;本發(fā)明通過(guò)采用函數(shù)返回優(yōu)化、函數(shù)調(diào)用優(yōu)化和循環(huán)優(yōu)化的方法,在保證控制流軟錯(cuò)誤檢測(cè)覆蓋率基本不變的前提下,減少測(cè)試點(diǎn)的數(shù)量并減少實(shí)際檢測(cè)的次數(shù),大幅度降低了檢測(cè)開銷,優(yōu)化后的測(cè)試點(diǎn)數(shù)量相比于優(yōu)化前下降30%以上。
【專利說(shuō)明】一種匯編級(jí)的單粒子軟錯(cuò)誤的測(cè)試點(diǎn)設(shè)置與優(yōu)化方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及一種匯編級(jí)的單粒子軟錯(cuò)誤的測(cè)試點(diǎn)設(shè)置與優(yōu)化方法,屬于系統(tǒng)抗單 粒子軟錯(cuò)誤容錯(cuò)【技術(shù)領(lǐng)域】。
【背景技術(shù)】
[0002] 隨著我國(guó)當(dāng)前航天科技和工程快速發(fā)展,研究單粒子效應(yīng)的基本規(guī)律、尋找預(yù)防 和減緩單粒子效應(yīng)的措施具有極大的迫切性。
[0003] 從應(yīng)用角度分析,要對(duì)運(yùn)行中的DSP進(jìn)行狀態(tài)檢測(cè),首先分析單粒子效應(yīng)形成的 軟錯(cuò)誤故障模式及其特點(diǎn),如程序控制流程紊亂、數(shù)據(jù)讀寫異常、功能狀態(tài)錯(cuò)誤等,將DSP 構(gòu)建的軟件代碼進(jìn)行模塊的合理劃分,進(jìn)而在模塊與模塊之間確定合理的測(cè)試點(diǎn)。
[0004] DSP由程序/數(shù)據(jù)存儲(chǔ)器、程序/數(shù)據(jù)Cache、通用寄存器、算術(shù)邏輯運(yùn)算單元以及 外設(shè)及其控制器組成。單粒子效應(yīng)主要影響DSP的程序/數(shù)據(jù)存儲(chǔ)器、Cache、寄存器等存 儲(chǔ)型單元。而根據(jù)DSP內(nèi)部電路單元對(duì)單粒子效應(yīng)的敏感性和發(fā)生故障類型的不同,DSP內(nèi) 部模塊可分為存儲(chǔ)型模塊和功能型模。
[0005] 存儲(chǔ)型模塊SEU引起的故障則主要有,程序存儲(chǔ)區(qū)的位翻轉(zhuǎn)、程序Cache的位翻 轉(zhuǎn)、數(shù)據(jù)存儲(chǔ)區(qū)的位翻轉(zhuǎn)以及寄存器的位翻轉(zhuǎn)。功能型模塊SET/SEFI引起的故障主要有, 指令管理器SET/SEFI引起的故障、運(yùn)算單元SET/SEFI引起的故障、JTAG/P0RSEFI引起的 故障、JTAG/P0RSEFI引起的故障等。
[0006] 結(jié)合DSP編程特點(diǎn),可以將以上故障分為如下兩類:
[0007] (1)單粒子軟錯(cuò)誤造成計(jì)算結(jié)果的錯(cuò)誤,但并不影響DSP整體功能的實(shí)現(xiàn);
[0008] (2)單粒子軟錯(cuò)誤引起DSP程序執(zhí)行流程的紊亂,邏輯功能錯(cuò)誤或者中間計(jì)算結(jié) 果的錯(cuò)誤等,造成程序的執(zhí)行流程發(fā)生錯(cuò)誤。
[0009] 根據(jù)劃分基本塊時(shí)目標(biāo)程序的層次不同,可以將基本塊劃分技術(shù)分為兩類:面向 C語(yǔ)言的基本塊劃分技術(shù)和面向匯編語(yǔ)言的基本塊劃分技術(shù)。
[0010] C語(yǔ)言是一門結(jié)構(gòu)化高級(jí)程序語(yǔ)言,具有平臺(tái)無(wú)關(guān)性,且程序代碼簡(jiǎn)潔易于閱讀。 針對(duì)C語(yǔ)言的基本塊劃分技術(shù)很容易實(shí)現(xiàn),劃分出的基本塊在結(jié)構(gòu)上和功能上具有很強(qiáng)的 對(duì)應(yīng)性,基本上每個(gè)基本塊都對(duì)應(yīng)著一個(gè)特定的功能實(shí)現(xiàn)。但C語(yǔ)言程序最終要經(jīng)過(guò)編譯、 鏈接等階段后才能在機(jī)器中運(yùn)行。在高級(jí)語(yǔ)言向低級(jí)語(yǔ)言的轉(zhuǎn)換過(guò)程中,C語(yǔ)言一級(jí)的"基 本塊"并不能很好地映射到低級(jí)語(yǔ)言上。在低級(jí)語(yǔ)言上,很難識(shí)別出一個(gè)C語(yǔ)言基本塊,且 很多C語(yǔ)言一級(jí)的基本塊在低級(jí)語(yǔ)言一級(jí)"交叉"在一起,這使得在C語(yǔ)言一級(jí)劃分基本塊 沒(méi)有多大的實(shí)際意義。
[0011] 匯編語(yǔ)言是低級(jí)語(yǔ)言,匯編指令與機(jī)器指令之間具有很好的對(duì)應(yīng)關(guān)系,匯編指令 本質(zhì)上就是用助記符對(duì)機(jī)器指令進(jìn)行翻譯得來(lái)的。這使得匯編語(yǔ)言一級(jí)劃出的基本塊能很 好地映射到由機(jī)器指令構(gòu)成的可執(zhí)行代碼上。這樣,在程序語(yǔ)言一級(jí)劃分基本塊的目的和 訴求(如添加簽名等)能夠在程序執(zhí)行過(guò)程中很好地體現(xiàn)出來(lái)。此外,在匯編一級(jí)實(shí)現(xiàn)基 本塊劃分還可以得到關(guān)于基本塊結(jié)構(gòu)的信息,如關(guān)鍵指令的地址信息等,以支撐基于基本 塊完整性的控制流檢測(cè)方案。
[0012] 但是,以DSP為對(duì)象的,從基于匯編語(yǔ)言角度進(jìn)行基本塊劃分,獲取測(cè)試點(diǎn)的具有 一定兼容性的優(yōu)化設(shè)置方法仍未見報(bào)道。
[0013] (1)在數(shù)據(jù)庫(kù)中搜索"軟錯(cuò)誤檢測(cè)"、"DSP軟錯(cuò)誤檢測(cè)"、"軟件檢測(cè)"或"軟錯(cuò)誤檢 測(cè)模塊"等,查閱到以下相關(guān)的公開資料:
[0014] A、"星載信號(hào)處理平臺(tái)單粒子效應(yīng)檢測(cè)與加固技術(shù)研究",提出了程序執(zhí)行流程的 跳轉(zhuǎn)區(qū)間監(jiān)測(cè)方法。該方法基于高級(jí)語(yǔ)言,如c、c++等,定義程序代碼的基本模塊。本專利 則是面向編譯后的匯編代碼,進(jìn)行基本模塊的劃分。
[0015] B、"一種星載計(jì)算機(jī)軟件檢錯(cuò)技術(shù)的研究與實(shí)現(xiàn)",提出了針對(duì)ARM7TDMI的中間代 碼級(jí)的基本塊劃分方法。ARM7TDMI的體系結(jié)構(gòu)屬于ARMV4T體系結(jié)構(gòu),其指令集是與DSP不 同的、相對(duì)更為簡(jiǎn)單的一種指令集。因此,所提方法不具有向上兼容性性。
[0016] (2)在數(shù)據(jù)庫(kù)中搜索"Soft error detection,,、"DSP soft error detection" 或 "DSP soft error test block"等,查閱到以下相關(guān)的公開資料:
[0017] A> 0. Goloubeva, M. Rebaudengo, Μ. SonzaReorda, et al. Soft-error Detection Using Control Flow Assertions, in Proceedings of thel8th IEEE International Symposium on Defect and Fault Tolerance in VLSI Systems(DFT. 03), 2003:58-588.針 對(duì)計(jì)算機(jī)軟件的故障檢測(cè)問(wèn)題,從高級(jí)語(yǔ)言的角度提出了基本模塊執(zhí)行流程的研究思路。 本專利則是面向編譯后的匯編代碼,進(jìn)行基本模塊的劃分。
[0018] B、N. Oh, P. P. Shirvaniand, E. J. MeCluskey. Error Detection by Duplicated Instructions in Super-Scalar Processors, IEEE Transaetions on Reliability, 2002, 51 (1) :63-75.同樣是針對(duì)計(jì)算機(jī)軟件的故障檢測(cè)問(wèn)題,從高級(jí)語(yǔ)言的 角度提出了基本模塊執(zhí)行流程的研究思路。本專利則是面向編譯后的匯編代碼,進(jìn)行基本 模塊的劃分。
【發(fā)明內(nèi)容】
[0019] 本發(fā)明的技術(shù)解決問(wèn)題是:針對(duì)現(xiàn)有技術(shù)的不足,提供了一種匯編級(jí)的DSP單粒 子軟錯(cuò)誤的測(cè)試點(diǎn)設(shè)置與優(yōu)化方法,通過(guò)采用函數(shù)返回優(yōu)化、函數(shù)調(diào)用優(yōu)化和循環(huán)優(yōu)化的 方法,在保證控制流軟錯(cuò)誤檢測(cè)覆蓋率基本不變的前提下,減少測(cè)試點(diǎn)的數(shù)量并減少實(shí)際 檢測(cè)的次數(shù),大幅度降低了檢測(cè)開銷。
[0020] 本發(fā)明的技術(shù)解決方案是:
[0021] 一種匯編級(jí)的單粒子軟錯(cuò)誤的測(cè)試點(diǎn)設(shè)置與優(yōu)化方法包含如下步驟:
[0022] 第一步:劃分基本塊并生成分塊表
[0023] 根據(jù)基本塊的關(guān)鍵字將匯編程序劃分為若干個(gè)基本塊的集合并將每個(gè)基本塊的 結(jié)構(gòu)信息寫入分塊表中;所述的基本塊指一段順序執(zhí)行的程序代碼;所述的基本塊關(guān)鍵字 指在匯編語(yǔ)言中的跳轉(zhuǎn)指令、函數(shù)調(diào)用指令和函數(shù)返回指令;所述的分塊表為一個(gè)鏈表,用 于保存基本塊的結(jié)構(gòu)信息,包括基本塊入口、基本塊出口、基本塊長(zhǎng)度、標(biāo)志字段、下一跳地 址和分塊表下一結(jié)點(diǎn)地址;
[0024] 第二步:執(zhí)行函數(shù)返回優(yōu)化
[0025] 根據(jù)每個(gè)基本塊的標(biāo)識(shí)信息,遍歷原始分塊表,找出函數(shù)返回指令所在基本塊對(duì) 應(yīng)的結(jié)點(diǎn),將此結(jié)點(diǎn)中的信息"合并"到函數(shù)調(diào)用返回后的基本塊所對(duì)應(yīng)的結(jié)點(diǎn)中,構(gòu)成新 的基本塊和結(jié)點(diǎn),形成函數(shù)返回優(yōu)化后的分塊表及其鏈表;
[0026] 第三步:執(zhí)行函數(shù)調(diào)用優(yōu)化
[0027] 根據(jù)函數(shù)返回優(yōu)化后的基本塊的標(biāo)識(shí)信息,遍歷函數(shù)返回優(yōu)化后的分塊表,找出 函數(shù)調(diào)用指令所在基本塊對(duì)應(yīng)的結(jié)點(diǎn),將此結(jié)點(diǎn)中的信息"合并"到子函數(shù)的第一個(gè)基本塊 所在的結(jié)點(diǎn)中,構(gòu)成新的基本塊和結(jié)點(diǎn),形成函數(shù)返回優(yōu)化和函數(shù)調(diào)用優(yōu)化后的分塊表及 其鏈表;
[0028] 第四步:執(zhí)行循環(huán)優(yōu)化
[0029] 根據(jù)函數(shù)調(diào)用優(yōu)化后的基本塊的標(biāo)識(shí)信息,遍歷函數(shù)調(diào)用優(yōu)化后的分塊表,找出 單重for循環(huán)的循環(huán)體所在基本塊對(duì)應(yīng)的結(jié)點(diǎn),將此結(jié)點(diǎn)中的信息"合并"到循環(huán)體后基本 塊所在的結(jié)點(diǎn)中,構(gòu)成新的分塊表和結(jié)點(diǎn)。
[0030] 所述第二步中信息"合并"的具體實(shí)現(xiàn)方式如下:
[0031] (2a)在原始分塊表中找出主函數(shù)的入口所在基本塊對(duì)應(yīng)的結(jié)點(diǎn),從此結(jié)點(diǎn)處開始 讀取分塊表結(jié)點(diǎn)信息;
[0032] (2b)順序讀取分塊表結(jié)點(diǎn)并根據(jù)結(jié)點(diǎn)標(biāo)志字段的信息判斷函數(shù)調(diào)用,若標(biāo)志字段 為1,則存在函數(shù)調(diào)用,用一個(gè)堆棧S來(lái)保存當(dāng)前結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)的地址,轉(zhuǎn)到(2c)執(zhí)行; 若標(biāo)志字段不為1,則讀取鏈表的下一個(gè)結(jié)點(diǎn)信息,重復(fù)步驟(2b);
[0033] (2c)順序讀取步驟(2b)函數(shù)調(diào)用的目的子函數(shù)的結(jié)點(diǎn)信息并進(jìn)行判斷,若讀取 的結(jié)點(diǎn)標(biāo)志字段為1,則表明子函數(shù)中存在有嵌套的函數(shù)調(diào)用,繼續(xù)順序讀取該子函數(shù)的嵌 套子函數(shù)的結(jié)點(diǎn)信息,判斷是否該嵌套的子函數(shù)是不是還存在嵌套的函數(shù)調(diào)用,直到某嵌 套子函數(shù)各結(jié)點(diǎn)標(biāo)志字段為0,表明找到當(dāng)前子函數(shù)的最后一個(gè)基本塊,將當(dāng)前基本塊和 堆棧頂指向的基本塊合并,形成新的基本塊,實(shí)現(xiàn)優(yōu)化,并進(jìn)入步驟(2d);若讀取的結(jié)點(diǎn)標(biāo) 志字段為2,則回到步驟(2c)繼續(xù)執(zhí)行;若讀取的結(jié)點(diǎn)標(biāo)志字段為0,則表明找到當(dāng)前子函 數(shù)的最后一個(gè)基本塊,將當(dāng)前基本塊和堆棧頂指向的基本塊合并,形成新的基本塊,實(shí)現(xiàn)優(yōu) 化,并進(jìn)入步驟(2d);
[0034] (2d)將當(dāng)前結(jié)點(diǎn)對(duì)應(yīng)基本塊的入口信息寫入堆棧頂指向的基本塊的入口字段中, 并將兩個(gè)基本塊長(zhǎng)度信息相加寫入堆棧頂指向的基本塊結(jié)點(diǎn)的塊長(zhǎng)字段中;從鏈表中釋放 當(dāng)前結(jié)點(diǎn),并維護(hù)鏈表的完整性;
[0035] (2e)讀取棧頂指向的結(jié)點(diǎn),然后彈出棧頂信息,按照步驟(2b)繼續(xù)執(zhí)行至鏈表的 最后一個(gè)結(jié)點(diǎn)。
[0036] 所述第三步中信息"合并"的具體實(shí)現(xiàn)方式如下:
[0037] (3a)從函數(shù)返回優(yōu)化后的分塊表中找出主函數(shù)的入口對(duì)應(yīng)的結(jié)點(diǎn),從該結(jié)點(diǎn)開始 讀取該分塊表結(jié)點(diǎn)信息;
[0038] (3b)順序讀取函數(shù)返回優(yōu)化后各個(gè)結(jié)點(diǎn),判斷結(jié)點(diǎn)標(biāo)志字段信息,若結(jié)點(diǎn)標(biāo)志 字段為1,表明找到一個(gè)函數(shù)調(diào)用,轉(zhuǎn)到(3c)執(zhí)行;若結(jié)點(diǎn)標(biāo)志字段不為1,重新執(zhí)行步驟 (3b);
[0039] (3c)根據(jù)步驟(3b)找到的函數(shù)調(diào)用所在基本塊的結(jié)點(diǎn)中的下一跳地址信息尋找 子函數(shù)的第一個(gè)基本塊所在的結(jié)點(diǎn),并將函數(shù)調(diào)用所在基本塊的信息合并到子函數(shù)第一個(gè) 基本塊中。
[0040] (3d)將當(dāng)前結(jié)點(diǎn)對(duì)應(yīng)基本塊的入口信息寫入子函數(shù)第一個(gè)基本塊的入口字段中, 并將兩個(gè)基本塊長(zhǎng)度信息相加寫入子函數(shù)第一個(gè)基本塊的塊長(zhǎng)字段中;從鏈表中釋放函數(shù) 調(diào)用所在結(jié)點(diǎn),并維護(hù)鏈表的完整性;
[0041] (3e)返回步驟(3b)繼續(xù)執(zhí)行,直至掃描至函數(shù)返回優(yōu)化后的執(zhí)行至鏈表的最后 一個(gè)結(jié)點(diǎn)。
[0042] 所述第四步中信息"合并"的具體實(shí)現(xiàn)方式如下:
[0043] (4a)從函數(shù)調(diào)用優(yōu)化后的分塊表中找出主函數(shù)的入口對(duì)應(yīng)的結(jié)點(diǎn),從該結(jié)點(diǎn)開始 讀取各個(gè)結(jié)點(diǎn)信息。
[0044] (4b)順序讀取分塊表各個(gè)結(jié)點(diǎn),并判斷當(dāng)前結(jié)點(diǎn)下一跳地址是否等于當(dāng)前結(jié)點(diǎn)中 基本塊入口地址,若是,表明找到一個(gè)單重循環(huán)for,開始進(jìn)行循環(huán)優(yōu)化;否則,重新執(zhí)行步 驟(4b);
[0045] (4c)將當(dāng)前結(jié)點(diǎn)對(duì)應(yīng)基本塊的入口信息填入鏈表下一個(gè)結(jié)點(diǎn)對(duì)應(yīng)基本塊的得到 入口信息中;
[0046] (4d)從鏈表中釋放當(dāng)前結(jié)點(diǎn),進(jìn)行鏈表完整性維護(hù);
[0047] (4e)返回步驟(4b)繼續(xù)直至掃描完所有的函數(shù)調(diào)用優(yōu)化后的鏈表的最后一個(gè)結(jié) 點(diǎn)。
[0048] 本發(fā)明與現(xiàn)有技術(shù)相比的有益效果是:
[0049] (1)本發(fā)明通過(guò)在函數(shù)調(diào)用返回處、函數(shù)調(diào)用處和循環(huán)處合并基本塊,即合并測(cè)試 點(diǎn),使得優(yōu)化后的測(cè)試點(diǎn)數(shù)量相比優(yōu)化前理論上至少下降30 %。
[0050] (2)相對(duì)于常用的基于簽名的控制流軟錯(cuò)誤檢測(cè)方案,本發(fā)明在TI6700系列DSP 程序?qū)嵗希瑑?yōu)化后的測(cè)試點(diǎn)數(shù)量下降到優(yōu)化前的50%左右。
[0051] (3)本發(fā)明中測(cè)試點(diǎn)設(shè)置優(yōu)化方法具有通用性,可以推廣應(yīng)用到其他架構(gòu)的平臺(tái) 中,如ARM、X86等。
【專利附圖】
【附圖說(shuō)明】
[0052] 圖1為本發(fā)明方法流程圖;
[0053] 圖2為本發(fā)明分塊表結(jié)點(diǎn)結(jié)構(gòu)圖;
[0054] 圖3為本發(fā)明分塊表結(jié)構(gòu)圖;
[0055] 圖4為未應(yīng)用本發(fā)明的FFT原始匯編代碼;
[0056] 圖5為本發(fā)明應(yīng)用在FFT中的基本塊劃分結(jié)果;
[0057] 圖6為本發(fā)明應(yīng)用在FFT中的測(cè)試點(diǎn)優(yōu)化結(jié)果。
【具體實(shí)施方式】
[0058] 下面結(jié)合附圖對(duì)本發(fā)明的【具體實(shí)施方式】進(jìn)行進(jìn)一步的詳細(xì)描述。
[0059] 如圖1所示,本發(fā)明一種匯編級(jí)的DSP單粒子軟錯(cuò)誤的測(cè)試點(diǎn)設(shè)置與優(yōu)化方法,包 含步驟如下:
[0060] 第一步:劃分基本塊并生成分塊表
[0061] 根據(jù)基本塊的關(guān)鍵字將匯編程序劃分為若干個(gè)基本塊的集合并將每個(gè)基本塊的 結(jié)構(gòu)信息寫入分塊表中;所述的基本塊指一段順序執(zhí)行的程序代碼;所述的基本塊關(guān)鍵字 指在匯編語(yǔ)言中的跳轉(zhuǎn)指令、函數(shù)調(diào)用指令和函數(shù)返回指令;所述的分塊表為一個(gè)鏈表,用 于保存基本塊的結(jié)構(gòu)信息,包括基本塊入口、基本塊出口、基本塊長(zhǎng)度、標(biāo)志字段、下一跳地 址和分塊表下一結(jié)點(diǎn)地址。
[0062] 根據(jù)基本塊的關(guān)鍵字將匯編程序劃分為若干個(gè)基本塊的:
[0063] (a)跳轉(zhuǎn)語(yǔ)句、函數(shù)調(diào)用和函數(shù)調(diào)用返回作為一個(gè)基本模塊的出口 ;
[0064] (b)當(dāng)前跳轉(zhuǎn)(調(diào)用、調(diào)用返回)的后一句作為基本模塊的入口 ;
[0065] (c)當(dāng)前跳轉(zhuǎn)(調(diào)用、調(diào)用返回)的目的語(yǔ)句作為基本模塊的入口 ;
[0066] (d)當(dāng)前跳轉(zhuǎn)(調(diào)用、調(diào)用返回)的目的語(yǔ)句的前一句作為基本模塊的出口。
[0067] 如圖2、3所75,分塊表為一個(gè)鏈表,其中每個(gè)結(jié)點(diǎn)都保存一個(gè)基本塊的結(jié)構(gòu)信息; 結(jié)點(diǎn)是鏈表的基本結(jié)構(gòu),鏈表就是若干個(gè)結(jié)點(diǎn)通過(guò)"下一結(jié)點(diǎn)地址"鏈接起來(lái)形成的。結(jié)點(diǎn) 主要包括基本塊入口、基本塊出口、基本塊長(zhǎng)度、標(biāo)志字段、下一跳地址和分塊表下一結(jié)點(diǎn) 地址?;緣K入口、基本塊出口分別指基本模塊第一條語(yǔ)句和基本模塊最后一條語(yǔ)句在匯 編程序中的邏輯地址;基本塊長(zhǎng)度是指基本塊中的匯編指令條數(shù);標(biāo)志字段只存儲(chǔ)0、1和2 三種狀態(tài),如果基本塊是以一條跳轉(zhuǎn)語(yǔ)句作為出口,則標(biāo)志字段置2 ;若一個(gè)基本塊以函數(shù) 調(diào)用指令為出口,則標(biāo)志字段置1 ;其它情況下,標(biāo)志字段置0。標(biāo)志字段是進(jìn)行測(cè)試點(diǎn)優(yōu) 化的重要依據(jù)。下一跳地址是指跳轉(zhuǎn)指令的目的地址。分塊表下一結(jié)點(diǎn)地址用于鏈表的維 護(hù)。
[0068] 第二步:執(zhí)行函數(shù)返回優(yōu)化
[0069] 根據(jù)每個(gè)基本塊的標(biāo)識(shí)信息,遍歷原始分塊表,找出函數(shù)返回指令所在基本塊對(duì) 應(yīng)的結(jié)點(diǎn),將此結(jié)點(diǎn)中的信息"合并"到函數(shù)調(diào)用返回后的基本塊所對(duì)應(yīng)的結(jié)點(diǎn)中,構(gòu)成新 的基本塊和結(jié)點(diǎn),形成函數(shù)返回優(yōu)化后的分塊表及其鏈表;
[0070] 信息"合并"的具體實(shí)現(xiàn)方式如下:
[0071] 第二步中信息"合并"的具體實(shí)現(xiàn)方式如下:
[0072] (2a)在原始分塊表中找出主函數(shù)的入口所在基本塊對(duì)應(yīng)的結(jié)點(diǎn),從此結(jié)點(diǎn)處開始 讀取分塊表結(jié)點(diǎn)信息;
[0073] (2b)順序讀取分塊表結(jié)點(diǎn)并根據(jù)結(jié)點(diǎn)標(biāo)志字段的信息判斷函數(shù)調(diào)用,若標(biāo)志字段 為1,則存在函數(shù)調(diào)用,用一個(gè)堆棧S來(lái)保存當(dāng)前結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)的地址,轉(zhuǎn)到(2c)執(zhí)行; 若標(biāo)志字段不為1,則讀取鏈表的下一個(gè)結(jié)點(diǎn)信息,重復(fù)步驟(2b);
[0074] (2c)順序讀取步驟(2b)函數(shù)調(diào)用的目的子函數(shù)的結(jié)點(diǎn)信息并進(jìn)行判斷,若讀取 的結(jié)點(diǎn)標(biāo)志字段為1,則表明子函數(shù)中存在有嵌套的函數(shù)調(diào)用,繼續(xù)順序讀取該子函數(shù)的嵌 套子函數(shù)的結(jié)點(diǎn)信息,判斷是否該嵌套的子函數(shù)是不是還存在嵌套的函數(shù)調(diào)用,直到某嵌 套子函數(shù)各結(jié)點(diǎn)標(biāo)志字段為0,表明找到當(dāng)前子函數(shù)的最后一個(gè)基本塊,將當(dāng)前基本塊和 堆棧頂指向的基本塊合并,形成新的基本塊,實(shí)現(xiàn)優(yōu)化,并進(jìn)入步驟(2d);若讀取的結(jié)點(diǎn)標(biāo) 志字段為2,則回到步驟(2c)繼續(xù)執(zhí)行;若讀取的結(jié)點(diǎn)標(biāo)志字段為0,則表明找到當(dāng)前子函 數(shù)的最后一個(gè)基本塊,將當(dāng)前基本塊和堆棧頂指向的基本塊合并,形成新的基本塊,實(shí)現(xiàn)優(yōu) 化,并進(jìn)入步驟(2d);
[0075] (2d)將當(dāng)前結(jié)點(diǎn)對(duì)應(yīng)基本塊的入口信息寫入堆棧頂指向的基本塊的入口字段中, 并將兩個(gè)基本塊長(zhǎng)度信息相加寫入堆棧頂指向的基本塊結(jié)點(diǎn)的塊長(zhǎng)字段中;從鏈表中釋放 當(dāng)前結(jié)點(diǎn),并維護(hù)鏈表的完整性;
[0076] (2e)讀取棧頂指向的結(jié)點(diǎn),然后彈出棧頂信息,按照步驟(2b)繼續(xù)執(zhí)行至鏈表的 最后一個(gè)結(jié)點(diǎn)。
[0077] 第三步:執(zhí)行函數(shù)調(diào)用優(yōu)化
[0078] 根據(jù)函數(shù)返回優(yōu)化后的基本塊的標(biāo)識(shí)信息,遍歷函數(shù)返回優(yōu)化后的分塊表,找出 函數(shù)調(diào)用指令所在基本塊對(duì)應(yīng)的結(jié)點(diǎn),將此結(jié)點(diǎn)中的信息"合并"到子函數(shù)的第一個(gè)基本塊 所在的結(jié)點(diǎn)中,構(gòu)成新的基本塊和結(jié)點(diǎn),形成函數(shù)返回優(yōu)化和函數(shù)調(diào)用優(yōu)化后的分塊表及 其鏈表;
[0079] 信息"合并"的具體實(shí)現(xiàn)方式如下:
[0080] (3a)從函數(shù)返回優(yōu)化后的分塊表中找出主函數(shù)的入口對(duì)應(yīng)的結(jié)點(diǎn),從該結(jié)點(diǎn)開始 讀取該分塊表結(jié)點(diǎn)信息;
[0081] (3b)順序讀取函數(shù)返回優(yōu)化后各個(gè)結(jié)點(diǎn),判斷結(jié)點(diǎn)標(biāo)志字段信息,若結(jié)點(diǎn)標(biāo)志 字段為1,表明找到一個(gè)函數(shù)調(diào)用,轉(zhuǎn)到(3c)執(zhí)行;若結(jié)點(diǎn)標(biāo)志字段不為1,重新執(zhí)行步驟 (3b);
[0082] (3c)根據(jù)步驟(3b)找到的函數(shù)調(diào)用所在基本塊的結(jié)點(diǎn)中的下一跳地址信息尋找 子函數(shù)的第一個(gè)基本塊所在的結(jié)點(diǎn),并將函數(shù)調(diào)用所在基本塊的信息合并到子函數(shù)第一個(gè) 基本塊中。
[0083] (3d)將當(dāng)前結(jié)點(diǎn)對(duì)應(yīng)基本塊的入口信息寫入子函數(shù)第一個(gè)基本塊的入口字段中, 并將兩個(gè)基本塊長(zhǎng)度信息相加寫入子函數(shù)第一個(gè)基本塊的塊長(zhǎng)字段中;從鏈表中釋放函數(shù) 調(diào)用所在結(jié)點(diǎn),并維護(hù)鏈表的完整性;
[0084] (3e)返回步驟(3b)繼續(xù)執(zhí)行,直至掃描至函數(shù)返回優(yōu)化后的執(zhí)行至鏈表的最后 一個(gè)結(jié)點(diǎn)。
[0085] 第四步:執(zhí)行循環(huán)優(yōu)化
[0086] 根據(jù)函數(shù)調(diào)用優(yōu)化后的基本塊的標(biāo)識(shí)信息,遍歷函數(shù)調(diào)用優(yōu)化后的分塊表,找出 單重for循環(huán)的循環(huán)體所在基本塊對(duì)應(yīng)的結(jié)點(diǎn),將此結(jié)點(diǎn)中的信息"合并"到循環(huán)體后基本 塊所在的結(jié)點(diǎn)中,構(gòu)成新的分塊表和結(jié)點(diǎn);
[0087] 信息"合并"的具體實(shí)現(xiàn)方式如下:
[0088] (4a)從函數(shù)調(diào)用優(yōu)化后的分塊表中找出主函數(shù)的入口對(duì)應(yīng)的結(jié)點(diǎn),從該結(jié)點(diǎn)開始 讀取各個(gè)結(jié)點(diǎn)信息。
[0089] (4b)順序讀取分塊表各個(gè)結(jié)點(diǎn),并判斷當(dāng)前結(jié)點(diǎn)下一跳地址是否等于當(dāng)前結(jié)點(diǎn)中 基本塊入口地址,若是,表明找到一個(gè)單重循環(huán)for,開始進(jìn)行循環(huán)優(yōu)化;否則,重新執(zhí)行步 驟(4b);
[0090] (4c)將當(dāng)前結(jié)點(diǎn)對(duì)應(yīng)基本塊的入口信息填入鏈表下一個(gè)結(jié)點(diǎn)對(duì)應(yīng)基本塊的得到 入口信息中;
[0091] (4d)從鏈表中釋放當(dāng)前結(jié)點(diǎn),進(jìn)行鏈表完整性維護(hù);
[0092] (4e)返回步驟(4b)繼續(xù)直至掃描完所有的函數(shù)調(diào)用優(yōu)化后的鏈表的最后一個(gè)結(jié) 點(diǎn)。
[0093] 如圖4、5、6所示,將本發(fā)明應(yīng)用在FFT變換的程序代碼中,F(xiàn)FT原始匯編代碼有兩 千行左右,簡(jiǎn)化后為650行,根據(jù)基本塊劃分原則,可以分成31個(gè)基本塊,經(jīng)過(guò)返回優(yōu)化、調(diào) 用優(yōu)化和循環(huán)優(yōu)化,簡(jiǎn)化為16個(gè)基本塊,獲得16個(gè)測(cè)試點(diǎn)。
[0094] 由此可見,采用優(yōu)化方案后的測(cè)試點(diǎn)明顯減少,因此,檢測(cè)開銷也會(huì)產(chǎn)生顯著的下 降。
[0095] 本發(fā)明說(shuō)明書中未作詳細(xì)描述的內(nèi)容屬于本領(lǐng)域技術(shù)人員的公知技術(shù)。
【權(quán)利要求】
1. 一種匯編級(jí)的單粒子軟錯(cuò)誤的測(cè)試點(diǎn)設(shè)置與優(yōu)化方法,其特征在于包含如下步驟: 第一步:劃分基本塊并生成分塊表 根據(jù)基本塊的關(guān)鍵字將匯編程序劃分為若干個(gè)基本塊的集合并將每個(gè)基本塊的結(jié)構(gòu) 信息寫入分塊表中;所述的基本塊指一段順序執(zhí)行的程序代碼;所述的基本塊關(guān)鍵字指在 匯編語(yǔ)言中的跳轉(zhuǎn)指令、函數(shù)調(diào)用指令和函數(shù)返回指令;所述的分塊表為一個(gè)鏈表,用于保 存基本塊的結(jié)構(gòu)信息,包括基本塊入口、基本塊出口、基本塊長(zhǎng)度、標(biāo)志字段、下一跳地址和 分塊表下一結(jié)點(diǎn)地址; 第二步:執(zhí)行函數(shù)返回優(yōu)化 根據(jù)每個(gè)基本塊的標(biāo)識(shí)信息,遍歷原始分塊表,找出函數(shù)返回指令所在基本塊對(duì)應(yīng)的 結(jié)點(diǎn),將此結(jié)點(diǎn)中的信息"合并"到函數(shù)調(diào)用返回后的基本塊所對(duì)應(yīng)的結(jié)點(diǎn)中,構(gòu)成新的基 本塊和結(jié)點(diǎn),形成函數(shù)返回優(yōu)化后的分塊表及其鏈表; 第三步:執(zhí)行函數(shù)調(diào)用優(yōu)化 根據(jù)函數(shù)返回優(yōu)化后的基本塊的標(biāo)識(shí)信息,遍歷函數(shù)返回優(yōu)化后的分塊表,找出函數(shù) 調(diào)用指令所在基本塊對(duì)應(yīng)的結(jié)點(diǎn),將此結(jié)點(diǎn)中的信息"合并"到子函數(shù)的第一個(gè)基本塊所在 的結(jié)點(diǎn)中,構(gòu)成新的基本塊和結(jié)點(diǎn),形成函數(shù)返回優(yōu)化和函數(shù)調(diào)用優(yōu)化后的分塊表及其鏈 表; 第四步:執(zhí)行循環(huán)優(yōu)化 根據(jù)函數(shù)調(diào)用優(yōu)化后的基本塊的標(biāo)識(shí)信息,遍歷函數(shù)調(diào)用優(yōu)化后的分塊表,找出單重 for循環(huán)的循環(huán)體所在基本塊對(duì)應(yīng)的結(jié)點(diǎn),將此結(jié)點(diǎn)中的信息"合并"到循環(huán)體后基本塊所 在的結(jié)點(diǎn)中,構(gòu)成新的分塊表和結(jié)點(diǎn)。
2.根據(jù)權(quán)利要求1所述的一種匯編級(jí)的單粒子軟錯(cuò)誤的測(cè)試點(diǎn)設(shè)置與優(yōu)化方法,其特 征在于:所述第二步中信息"合并"的具體實(shí)現(xiàn)方式如下: (2a)在原始分塊表中找出主函數(shù)的入口所在基本塊對(duì)應(yīng)的結(jié)點(diǎn),從此結(jié)點(diǎn)處開始讀取 分塊表結(jié)點(diǎn)信息; (2b)順序讀取分塊表結(jié)點(diǎn)并根據(jù)結(jié)點(diǎn)標(biāo)志字段的信息判斷函數(shù)調(diào)用,若標(biāo)志字段為 1,則存在函數(shù)調(diào)用,用一個(gè)堆棧S來(lái)保存當(dāng)前結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)的地址,轉(zhuǎn)到(2c)執(zhí)行;若 標(biāo)志字段不為1,則讀取鏈表的下一個(gè)結(jié)點(diǎn)信息,重復(fù)步驟(2b); (2c)順序讀取步驟(2b)函數(shù)調(diào)用的目的子函數(shù)的結(jié)點(diǎn)信息并進(jìn)行判斷,若讀取的結(jié) 點(diǎn)標(biāo)志字段為1,則表明子函數(shù)中存在有嵌套的函數(shù)調(diào)用,繼續(xù)順序讀取該子函數(shù)的嵌套子 函數(shù)的結(jié)點(diǎn)信息,判斷是否該嵌套的子函數(shù)是不是還存在嵌套的函數(shù)調(diào)用,直到某嵌套子 函數(shù)各結(jié)點(diǎn)標(biāo)志字段為0,表明找到當(dāng)前子函數(shù)的最后一個(gè)基本塊,將當(dāng)前基本塊和堆棧頂 指向的基本塊合并,形成新的基本塊,實(shí)現(xiàn)優(yōu)化,并進(jìn)入步驟(2d);若讀取的結(jié)點(diǎn)標(biāo)志字段 為2,則回到步驟(2c)繼續(xù)執(zhí)行;若讀取的結(jié)點(diǎn)標(biāo)志字段為0,則表明找到當(dāng)前子函數(shù)的最 后一個(gè)基本塊,將當(dāng)前基本塊和堆棧頂指向的基本塊合并,形成新的基本塊,實(shí)現(xiàn)優(yōu)化,并 進(jìn)入步驟(2d); (2d)將當(dāng)前結(jié)點(diǎn)對(duì)應(yīng)基本塊的入口信息寫入堆棧頂指向的基本塊的入口字段中,并將 兩個(gè)基本塊長(zhǎng)度信息相加寫入堆棧頂指向的基本塊結(jié)點(diǎn)的塊長(zhǎng)字段中;從鏈表中釋放當(dāng)前 結(jié)點(diǎn),并維護(hù)鏈表的完整性; (2e)讀取棧頂指向的結(jié)點(diǎn),然后彈出棧頂信息,按照步驟(2b)繼續(xù)執(zhí)行至鏈表的最后 一個(gè)結(jié)點(diǎn)。
3.根據(jù)權(quán)利要求1所述的一種匯編級(jí)的單粒子軟錯(cuò)誤的測(cè)試點(diǎn)設(shè)置與優(yōu)化方法,其特 征在于:所述第三步中信息"合并"的具體實(shí)現(xiàn)方式如下: (3a)從函數(shù)返回優(yōu)化后的分塊表中找出主函數(shù)的入口對(duì)應(yīng)的結(jié)點(diǎn),從該結(jié)點(diǎn)開始讀取 該分塊表結(jié)點(diǎn)信息; (3b)順序讀取函數(shù)返回優(yōu)化后各個(gè)結(jié)點(diǎn),判斷結(jié)點(diǎn)標(biāo)志字段信息,若結(jié)點(diǎn)標(biāo)志字段為 1,表明找到一個(gè)函數(shù)調(diào)用,轉(zhuǎn)到(3c)執(zhí)行;若結(jié)點(diǎn)標(biāo)志字段不為1,重新執(zhí)行步驟(3b); (3c)根據(jù)步驟(3b)找到的函數(shù)調(diào)用所在基本塊的結(jié)點(diǎn)中的下一跳地址信息尋找子函 數(shù)的第一個(gè)基本塊所在的結(jié)點(diǎn),并將函數(shù)調(diào)用所在基本塊的信息合并到子函數(shù)第一個(gè)基本 塊中。 (3d)將當(dāng)前結(jié)點(diǎn)對(duì)應(yīng)基本塊的入口信息寫入子函數(shù)第一個(gè)基本塊的入口字段中,并將 兩個(gè)基本塊長(zhǎng)度信息相加寫入子函數(shù)第一個(gè)基本塊的塊長(zhǎng)字段中;從鏈表中釋放函數(shù)調(diào)用 所在結(jié)點(diǎn),并維護(hù)鏈表的完整性; (3e)返回步驟(3b)繼續(xù)執(zhí)行,直至掃描至函數(shù)返回優(yōu)化后的執(zhí)行至鏈表的最后一個(gè) 結(jié)點(diǎn)。
4.根據(jù)權(quán)利要求1所述的一種匯編級(jí)的單粒子軟錯(cuò)誤的測(cè)試點(diǎn)設(shè)置與優(yōu)化方法,其特 征在于:所述第四步中信息"合并"的具體實(shí)現(xiàn)方式如下: (4a)從函數(shù)調(diào)用優(yōu)化后的分塊表中找出主函數(shù)的入口對(duì)應(yīng)的結(jié)點(diǎn),從該結(jié)點(diǎn)開始讀取 各個(gè)結(jié)點(diǎn)信息。 (4b)順序讀取分塊表各個(gè)結(jié)點(diǎn),并判斷當(dāng)前結(jié)點(diǎn)下一跳地址是否等于當(dāng)前結(jié)點(diǎn)中基 本塊入口地址,若是,表明找到一個(gè)單重循環(huán)for,開始進(jìn)行循環(huán)優(yōu)化;否則,重新執(zhí)行步驟 (4b); (4c)將當(dāng)前結(jié)點(diǎn)對(duì)應(yīng)基本塊的入口信息填入鏈表下一個(gè)結(jié)點(diǎn)對(duì)應(yīng)基本塊的得到入口 信息中; (4d)從鏈表中釋放當(dāng)前結(jié)點(diǎn),進(jìn)行鏈表完整性維護(hù); (4e)返回步驟(4b)繼續(xù)直至掃描完所有的函數(shù)調(diào)用優(yōu)化后的鏈表的最后一個(gè)結(jié)點(diǎn)。
【文檔編號(hào)】G06F11/36GK104142889SQ201410353315
【公開日】2014年11月12日 申請(qǐng)日期:2014年7月23日 優(yōu)先權(quán)日:2014年7月23日
【發(fā)明者】張國(guó)霞, 龔科, 高翔, 郭陽(yáng)明, 王向濤 申請(qǐng)人:西安空間無(wú)線電技術(shù)研究所