專利名稱:一種雙向鏈表訪問檢錯(cuò)的方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明實(shí)施例涉及通信技術(shù)領(lǐng)域,尤其涉及一種雙向鏈表訪問檢錯(cuò)的方法及裝置。
背景技術(shù):
當(dāng)前現(xiàn)場可編程門陣列(Field Programmable Gate Array, FPGA)被用來處理越來越復(fù)雜的業(yè)務(wù),F(xiàn)PGA對(duì)鏈表操作和使用越來越頻繁。圖1是一種通常的雙向鏈表結(jié)構(gòu)示意圖,如圖1所示,該雙向鏈表有n+1個(gè)節(jié)點(diǎn),節(jié)點(diǎn)0是鏈表的首節(jié)點(diǎn),節(jié)點(diǎn)η是鏈表的尾節(jié)點(diǎn),每個(gè)鏈表節(jié)點(diǎn)具有三個(gè)屬性數(shù)據(jù)、前驅(qū)節(jié)點(diǎn)指針和后繼節(jié)點(diǎn)指針,其中,數(shù)據(jù)就是鏈表節(jié)點(diǎn)管理的數(shù)據(jù);前驅(qū)節(jié)點(diǎn)指針存放著在該鏈表上與該節(jié)點(diǎn)相鄰的前驅(qū)節(jié)點(diǎn)的內(nèi)存地址, 對(duì)于節(jié)點(diǎn)0來說,該地址為空值,對(duì)于節(jié)點(diǎn)1來說其前驅(qū)節(jié)點(diǎn)指針指向節(jié)點(diǎn)0 ;后繼節(jié)點(diǎn)指針存放著在該鏈表上與該節(jié)點(diǎn)相鄰的后繼節(jié)點(diǎn)的內(nèi)存地址,對(duì)于節(jié)點(diǎn)η來說,該地址為空值,對(duì)于節(jié)點(diǎn)1來說其后繼節(jié)點(diǎn)指針指向節(jié)點(diǎn)2。在用FPGA對(duì)鏈表進(jìn)行管理時(shí),由于鏈表操作復(fù)雜、使用頻繁,容易出錯(cuò),操作出現(xiàn)錯(cuò)誤后很難馬上發(fā)現(xiàn),并且容易導(dǎo)致系統(tǒng)崩潰。在 FPGA實(shí)現(xiàn)對(duì)鏈表的管理時(shí),引起鏈表訪問錯(cuò)誤的原因主要有三種1、存儲(chǔ)鏈表的外部存儲(chǔ)器出現(xiàn)比特位(bit)跳變導(dǎo)致鏈表內(nèi)容錯(cuò)誤,舉例來說,如圖1中,如果外部存儲(chǔ)器存放節(jié)點(diǎn)0的后繼節(jié)點(diǎn)指針對(duì)應(yīng)的位置出現(xiàn)錯(cuò)誤bit跳變,則該后繼節(jié)點(diǎn)指針可能變?yōu)榉欠ㄖ羔槪?當(dāng)FPGA對(duì)該后繼節(jié)點(diǎn)指針內(nèi)容進(jìn)行修改或訪問時(shí),將會(huì)導(dǎo)致系統(tǒng)崩潰;2、應(yīng)用程序讀寫越界造成鏈表內(nèi)容被改寫,舉例來說,如圖1,當(dāng)應(yīng)用程序?qū)懺浇鐚⒐?jié)點(diǎn)0的后繼節(jié)點(diǎn)指針改寫為非法指針,當(dāng)FPGA對(duì)該后繼節(jié)點(diǎn)指針內(nèi)容進(jìn)行修改或訪問時(shí),將會(huì)導(dǎo)致系統(tǒng)崩潰;3、 FPGA外存控制器錯(cuò)誤導(dǎo)致讀寫非預(yù)期的鏈表節(jié)點(diǎn)地址。FPGA在鏈表訪問過程中會(huì)記錄當(dāng)前訪問到的鏈表的節(jié)點(diǎn)的指針,并將該指針存儲(chǔ)在FPGA的邏輯控制器中。在FPGA繼續(xù)訪問時(shí),會(huì)從該指針繼續(xù)訪問鏈表,訪問鏈表時(shí)會(huì)通過FPGA的外存控制器來操作外部存儲(chǔ)器, 外存控制器用來接收邏輯控制器對(duì)外部存儲(chǔ)器的訪問請(qǐng)求,并根據(jù)該訪問請(qǐng)求對(duì)外部存儲(chǔ)器進(jìn)行相應(yīng)訪問,在這個(gè)訪問過程中如果出現(xiàn)外存控制器錯(cuò)誤,可能導(dǎo)致返回給FPGA錯(cuò)誤的鏈表節(jié)點(diǎn),如圖1所示,當(dāng)FPGA訪問到鏈表節(jié)點(diǎn)1時(shí),會(huì)將節(jié)點(diǎn)1的指針存儲(chǔ)在FPGA的邏輯控制器中,當(dāng)FPGA后續(xù)繼續(xù)訪問該鏈表時(shí),利用該邏輯控制器中存儲(chǔ)的前次鏈表訪問的節(jié)點(diǎn)1的指針通過外存控制器訪問外部存儲(chǔ)器中的鏈表,如果外部控制器錯(cuò)誤導(dǎo)致訪問外部存儲(chǔ)器的非節(jié)點(diǎn)1的其他節(jié)點(diǎn),對(duì)這個(gè)其他節(jié)點(diǎn)內(nèi)容進(jìn)行修改或訪問可能會(huì)導(dǎo)致系統(tǒng)崩潰。目前,通常會(huì)利用指針冗余備份的方法來實(shí)現(xiàn)實(shí)時(shí)檢錯(cuò),在存儲(chǔ)鏈表指針時(shí),F(xiàn)PGA會(huì)同時(shí)存儲(chǔ)兩份相同的鏈表,在對(duì)鏈表節(jié)點(diǎn)訪問時(shí),只有讀出的兩份鏈表節(jié)點(diǎn)的數(shù)據(jù)內(nèi)容相同才認(rèn)為鏈表訪問正確,否則認(rèn)為鏈表訪問發(fā)生了異常,該方法對(duì)于防止存儲(chǔ)鏈表的外部存儲(chǔ)器出現(xiàn)bit跳變和應(yīng)用程序讀寫越界造成鏈表內(nèi)容被改引起的鏈表訪問錯(cuò)誤比較有效, 但對(duì)于FPGA外存控制器錯(cuò)誤導(dǎo)致讀寫非預(yù)期的鏈表節(jié)點(diǎn)地址引起的鏈表訪問錯(cuò)誤并不適用,因?yàn)橹皇潜容^兩份鏈表節(jié)點(diǎn)的數(shù)據(jù)內(nèi)容是否相同,并不能說明所訪問的鏈表指針是否正確。
發(fā)明內(nèi)容
本發(fā)明實(shí)施例提供了一種雙向鏈表訪問檢錯(cuò)的方法及裝置,在FPGA對(duì)鏈表管理過程中,解決在應(yīng)用程序通過FPGA訪問雙向鏈表時(shí),出現(xiàn)鏈表訪問錯(cuò)誤而無法及時(shí)、有效檢測出來,導(dǎo)致系統(tǒng)崩潰的問題。為達(dá)到上述目的,本發(fā)明實(shí)施例提供了一種雙向鏈表訪問檢錯(cuò)的方法,所述方法包括在邏輯控制器中存放所述雙向鏈表的當(dāng)前指針和前次指針,所述當(dāng)前指針用于標(biāo)識(shí)本次要訪問的所述雙向鏈表節(jié)點(diǎn),所述前次指針用于標(biāo)識(shí)前次訪問的所述雙向鏈表節(jié)點(diǎn),所述當(dāng)前指針初始指向所述雙向鏈表的首節(jié)點(diǎn),所述方法包括根據(jù)所述當(dāng)前指針獲取所述雙向鏈表的節(jié)點(diǎn);所述獲取的雙向鏈表的節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針與所述前次指針不相等時(shí),確定所述雙向鏈表訪問出錯(cuò)。本發(fā)明實(shí)施例提供了一種雙向鏈表訪問檢錯(cuò)的裝置,所述裝置包括初始化單元,用于在雙向鏈表生成時(shí),在邏輯控制器中存放所述雙向鏈表的當(dāng)前指針和前次指針,所述當(dāng)前指針用于標(biāo)識(shí)本次要訪問的所述雙向鏈表節(jié)點(diǎn),所述前次指針用于標(biāo)識(shí)前次訪問的所述雙向鏈表節(jié)點(diǎn),所述當(dāng)前指針初始指向所述雙向鏈表的首節(jié)點(diǎn);獲取單元,用于根據(jù)所述當(dāng)前指針獲取所述雙向鏈表的節(jié)點(diǎn);確定單元,用于所述獲取的雙向鏈表的節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針與所述前次指針不相等時(shí),確定所述雙向鏈表訪問出錯(cuò)。綜上,本發(fā)明實(shí)施例提供了一種雙向鏈表訪問檢錯(cuò)的方法及裝置,在應(yīng)用程序通過FPGA對(duì)鏈表進(jìn)行訪問時(shí),能夠?qū)︽湵碓L問進(jìn)行及時(shí)、有效的檢錯(cuò)。
為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。圖1是現(xiàn)有技術(shù)中一種通常的雙向鏈表結(jié)構(gòu)示意圖;圖2是本發(fā)明實(shí)施例一提供的一種雙向鏈表訪問檢錯(cuò)的方法流程示意圖;圖3是本發(fā)明實(shí)施例提供的一種雙向鏈表訪問檢錯(cuò)的方法中雙向鏈表示意圖;圖4是本發(fā)明實(shí)施例提供的一種雙向鏈表訪問檢錯(cuò)的方法中鏈前次指針和當(dāng)前指針更新后的示意圖;圖5是本發(fā)明實(shí)施例提供的一種雙向鏈表訪問檢錯(cuò)的方法中另一種雙向鏈表示意圖;圖6是本發(fā)明實(shí)施例二提供的第一種雙向鏈表訪問檢測的裝置示意圖;圖7是本發(fā)明實(shí)施例二提供的第二種雙向鏈表訪問檢測的裝置示意圖;圖8是本發(fā)明實(shí)施例二提供的第三種雙向鏈表訪問檢測的裝置示意圖。
具體實(shí)施例方式為使本發(fā)明實(shí)施例的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例。基于本發(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。實(shí)施例一本發(fā)明實(shí)施例提供了一種雙向鏈表訪問檢錯(cuò)的方法,參見圖2,圖2為本發(fā)明實(shí)施例的方法流程圖,包括102,根據(jù)當(dāng)前指針獲取所述雙向鏈表的節(jié)點(diǎn);104,所述獲得的雙向鏈表的節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針與前次指針不相等時(shí),確定所述雙向鏈表訪問出錯(cuò)??删幊唐骷?duì)鏈表管理時(shí),鏈表存放在外部存儲(chǔ)器中。可編程器件包含邏輯控制器和外存控制器等??删幊唐骷梢詾镕PGA或?qū)S眉呻娐?Application Specific Integrated Circuit,ASIC),本發(fā)明實(shí)施例以FPGA為例進(jìn)行描述,F(xiàn)PGA通過邏輯控制器和外存控制器訪問外部存儲(chǔ)器中的鏈表。邏輯控制器存放前次訪問的鏈表節(jié)點(diǎn)的指針及當(dāng)前要訪問的鏈表節(jié)點(diǎn)的指針。當(dāng)FPGA接收到應(yīng)用程序訪問外部存儲(chǔ)器中的鏈表節(jié)點(diǎn)的請(qǐng)求時(shí),根據(jù)邏輯存儲(chǔ)器中存放的當(dāng)前要訪問的鏈表節(jié)點(diǎn)指針,通過FPGA的外存控制器訪問外部存儲(chǔ)器中的鏈表節(jié)點(diǎn)。在這個(gè)過程中如果出現(xiàn)外存控制器錯(cuò)誤,可能導(dǎo)致訪問錯(cuò)誤的鏈表節(jié)點(diǎn)。在雙向鏈表生成后,在邏輯控制器中存放雙向鏈表的當(dāng)前指針和前次指針,該當(dāng)前指針用于標(biāo)識(shí)本次要訪問的該雙向鏈表節(jié)點(diǎn),該前次指針用于標(biāo)識(shí)前次訪問的該雙向鏈表節(jié)點(diǎn),該當(dāng)前指針初始化指向該雙向鏈表的首節(jié)點(diǎn),該前次指針初始化為空值,所謂的初始化是指在鏈表生成后,在對(duì)鏈表操作前,對(duì)和鏈表有關(guān)的變量的初始值設(shè)置。舉例來說,如圖3所示,圖3為該雙向鏈表示意圖,其中節(jié)點(diǎn)0的前驅(qū)節(jié)點(diǎn)指針為空值,節(jié)點(diǎn)0的后繼節(jié)點(diǎn)指針初始化為節(jié)點(diǎn)1,當(dāng)前指針初始化指向節(jié)點(diǎn)0,前次指針初始化指向空值。當(dāng)應(yīng)用程序通過FPGA訪問該雙向鏈表時(shí),F(xiàn)PGA利用邏輯控制器中存放的當(dāng)前指針通過FPGA的外存控制器訪問該雙向鏈表。在應(yīng)用程序通過FPGA訪問該雙向鏈表時(shí),根據(jù)邏輯控制器中的該當(dāng)前指針訪問該雙向鏈表,獲得該雙向鏈表的節(jié)點(diǎn),判斷該節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針與該前次指針是否相等,如果不相等則確定該鏈表訪問出錯(cuò),進(jìn)一步,如果確認(rèn)該鏈表訪問出錯(cuò)可以通知網(wǎng)管該雙向鏈表訪問出錯(cuò),并停止應(yīng)用程序?qū)υ撾p向鏈表的訪問。如果該節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針與該前次指針相等,則將該前次指針進(jìn)行修改,修改后的前次指針的值為該當(dāng)前指針的值。然后修改當(dāng)前指針,修改后的當(dāng)前指針的值為該節(jié)點(diǎn)的后繼節(jié)點(diǎn)指針的值。如圖4所示,圖4為確定該節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針與該前次指針相等時(shí),該當(dāng)前指針和前次指針修改后的示意圖,前次指針修改為指向節(jié)點(diǎn)0,當(dāng)前指針修改為指向節(jié)點(diǎn)1。下次應(yīng)用程序通過FPGA訪問該雙向鏈表時(shí),F(xiàn)PGA根據(jù)邏輯控制器中的該當(dāng)前指針通過FPGA的外存控制器訪問到外部存儲(chǔ)器中該雙向鏈表的節(jié)點(diǎn)1,通過判斷節(jié)點(diǎn)1的前驅(qū)節(jié)點(diǎn)指針是否和前次指針相等來判斷鏈表是否出錯(cuò),如果判斷節(jié)點(diǎn)1的前驅(qū)節(jié)點(diǎn)指針和前次指針相等,則將該前次指針修改為指向節(jié)點(diǎn)1,該當(dāng)前指針修改指向節(jié)點(diǎn)2。當(dāng)該應(yīng)用程序通過FPGA繼續(xù)訪問該雙向鏈表的后續(xù)節(jié)點(diǎn)時(shí),其操作過程與上述對(duì)節(jié)點(diǎn)0或節(jié)點(diǎn)1的操作類似,在此不在贅述。優(yōu)選地,在雙向鏈表初始化時(shí),雙向鏈表的首節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針初始指向該雙向鏈表首節(jié)點(diǎn),所述前次指針初始指向所述雙向鏈表的首節(jié)點(diǎn)。如圖5所示,雙向鏈表節(jié)點(diǎn)0的前驅(qū)節(jié)點(diǎn)指針可以初始化指向節(jié)點(diǎn)0,當(dāng)前指針初始化指向節(jié)點(diǎn)0,前次指針初始化指向節(jié)點(diǎn) 0,這樣實(shí)現(xiàn)優(yōu)點(diǎn)在于,提高了對(duì)該雙向鏈表的首節(jié)點(diǎn)的檢測準(zhǔn)確度,在對(duì)節(jié)點(diǎn)0進(jìn)行檢測時(shí),進(jìn)行比較的前次指針和當(dāng)前指針的前驅(qū)節(jié)點(diǎn)指針值都為節(jié)點(diǎn)0的地址,而不是空值,在內(nèi)存的操作中,內(nèi)存的內(nèi)容初始化通常都是設(shè)置為空值,這樣,當(dāng)外存控制器出錯(cuò)時(shí),通過當(dāng)前指針訪問的可能不是節(jié)點(diǎn)0,而訪問到另一內(nèi)存,而恰好該內(nèi)存地址的內(nèi)容都是空值, 則無法判斷出鏈表訪問錯(cuò)誤。而節(jié)點(diǎn)0的地址在外部存儲(chǔ)器中是唯一的,在其他內(nèi)存位置出現(xiàn)與該地址相同的值的概率很小,因此,通過把雙向鏈表的首節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針和前次指針初始指向雙向鏈表的首節(jié)點(diǎn)能夠提高對(duì)該雙向鏈表首節(jié)點(diǎn)的檢測準(zhǔn)確度。本發(fā)明實(shí)施例提供的鏈表檢錯(cuò)的方法好處在于,每次FPGA通過邏輯控制器訪問外存儲(chǔ)器的雙向鏈表時(shí),都會(huì)有個(gè)預(yù)期結(jié)果,這個(gè)預(yù)期結(jié)果是通過前次指針來判斷的,如果通過邏輯控制器獲得的外部存儲(chǔ)器的雙向鏈表的節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針與該前次指針不相等,則認(rèn)為獲得鏈表節(jié)點(diǎn)不滿足預(yù)期結(jié)果,因此可以判斷該雙向鏈表錯(cuò)誤。這樣能夠解決由于FPGA的外存控制器錯(cuò)誤引起的鏈表訪問錯(cuò)誤的問題,舉例來說,如圖3如果應(yīng)用程序通過FPGA訪問該雙向鏈表時(shí),利用邏輯控制器的當(dāng)前指針通過FPGA的外存控制器訪問該雙向鏈表時(shí),如果FPGA的外存控制器出錯(cuò),導(dǎo)致本該訪問該雙向鏈表的節(jié)點(diǎn)1,但錯(cuò)誤的訪問了該雙向鏈表的節(jié)點(diǎn)n,由于節(jié)點(diǎn)η的前驅(qū)節(jié)點(diǎn)指針為節(jié)點(diǎn)η-1的地址與該前次指針指向節(jié)點(diǎn)0的地址不相等,則可判斷該雙向鏈表訪問出錯(cuò)。同時(shí),本發(fā)明實(shí)施例提供的技術(shù)方案對(duì)于由于外部存儲(chǔ)器出現(xiàn)錯(cuò)誤BIT位跳變或應(yīng)用程序讀寫越界造成鏈表節(jié)點(diǎn)前驅(qū)節(jié)點(diǎn)指針被改寫引起的鏈表訪問錯(cuò)誤同樣適用,舉例來說,如圖3所示,如果外部存儲(chǔ)器存放節(jié)點(diǎn) 1的前驅(qū)節(jié)點(diǎn)指針對(duì)應(yīng)的位置出現(xiàn)錯(cuò)誤bit跳變,該前驅(qū)節(jié)點(diǎn)指針變?yōu)榉欠ㄖ羔?,那么?dāng)應(yīng)用程序通過FPGA訪問該雙向鏈表時(shí),利用邏輯控制器的當(dāng)前指針獲得該雙向鏈表的節(jié)點(diǎn)1 時(shí),由于節(jié)點(diǎn)1的前驅(qū)節(jié)點(diǎn)指針已經(jīng)變?yōu)榉欠ㄖ羔?,該前次指針將和?jié)點(diǎn)1的前驅(qū)節(jié)點(diǎn)指針不相等,因此,可以判斷出該雙向鏈表訪問錯(cuò)誤??梢?,通過本發(fā)明實(shí)施例提供的方法,當(dāng)應(yīng)用程序通過FPGA訪問雙向鏈表時(shí),能夠?qū)﹄p向鏈表的訪問進(jìn)行實(shí)時(shí)檢錯(cuò),當(dāng)鏈表訪問出錯(cuò)時(shí)上報(bào)網(wǎng)管并停止應(yīng)用程序?qū)︽湵碓L問,能夠有效解決鏈表訪問出錯(cuò)導(dǎo)致系統(tǒng)崩潰的問題。實(shí)施例二 本發(fā)明實(shí)施例提供了一種雙向鏈表訪問檢錯(cuò)的裝置,參見圖6,圖6為本發(fā)明實(shí)施例的裝置示意圖,該裝置包括初始化單元602,獲取單元604,確定單元606。初始化單元602,用于在雙向鏈表生成時(shí),在邏輯控制器中存放所述雙向鏈表的當(dāng)前指針和前次指針,所述當(dāng)前指針用于標(biāo)識(shí)本次要訪問的所述雙向鏈表節(jié)點(diǎn),所述前次指針用于標(biāo)識(shí)前次訪問的所述雙向鏈表節(jié)點(diǎn),所述當(dāng)前指針初始指向所述雙向鏈表的首節(jié)占.
^ \\\ 獲取單元604,用于根據(jù)所述當(dāng)前指針獲取所述雙向鏈表的節(jié)點(diǎn);確定單元606,用于所述獲取的雙向鏈表的節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針與所述前次指針不相等,則確定所述雙向鏈表訪問出錯(cuò)??删幊唐骷?duì)鏈表管理時(shí),鏈表存放在外部存儲(chǔ)器中??删幊唐骷壿嬁刂破骱屯獯婵刂破鞯取?删幊唐骷梢詾镕PGA或?qū)S眉呻娐?Application Specific
7Integrated Circuit,ASIC),本發(fā)明實(shí)施例以FPGA為例進(jìn)行描述,F(xiàn)PGA通過邏輯控制器和外存控制器訪問外部存儲(chǔ)器中的鏈表。邏輯控制器存放前次訪問的鏈表節(jié)點(diǎn)的指針及當(dāng)前要訪問的鏈表節(jié)點(diǎn)的指針。當(dāng)FPGA接收到應(yīng)用程序訪問外部存儲(chǔ)器中的鏈表節(jié)點(diǎn)的請(qǐng)求時(shí),根據(jù)邏輯存儲(chǔ)器中存放的當(dāng)前要訪問的鏈表節(jié)點(diǎn)指針,通過FPGA的外存控制器訪問外部存儲(chǔ)器中的鏈表節(jié)點(diǎn)。在這個(gè)過程中如果出現(xiàn)外存控制器錯(cuò)誤,可能導(dǎo)致訪問錯(cuò)誤的鏈表節(jié)點(diǎn)。在雙向鏈表生成后,初始化單元602在邏輯控制器中存放雙向鏈表的當(dāng)前指針和前次指針,該當(dāng)前指針用于標(biāo)識(shí)本次要訪問的該雙向鏈表節(jié)點(diǎn),該前次指針用于標(biāo)識(shí)前次訪問的該雙向鏈表節(jié)點(diǎn),該當(dāng)前指針初始化指向該雙向鏈表的首節(jié)點(diǎn),該前次指針初始化為空值,所謂的初始化是指在鏈表生成后,在對(duì)鏈表操作前,對(duì)和鏈表有關(guān)的變量的初始值設(shè)置。舉例來說,如圖3所示,圖3為該雙向鏈表示意圖,其中節(jié)點(diǎn)0的前驅(qū)節(jié)點(diǎn)指針為空值,節(jié)點(diǎn)0的后繼節(jié)點(diǎn)指針初始化為節(jié)點(diǎn)1,當(dāng)前指針初始化指向節(jié)點(diǎn)0,前次指針初始化指向空值。當(dāng)應(yīng)用程序通過FPGA訪問該雙向鏈表時(shí),F(xiàn)PGA利用邏輯控制器中存放的當(dāng)前指針通過FPGA的外存控制器訪問該雙向鏈表。在應(yīng)用程序通過FPGA訪問該雙向鏈表時(shí),獲取單元604根據(jù)邏輯控制器中的該當(dāng)前指針訪問該雙向鏈表,獲得該雙向鏈表的節(jié)點(diǎn),確定單元606判斷該節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針與該前次指針是否相等,如果不相等則確定該鏈表訪問出錯(cuò)。下次應(yīng)用程序通過FPGA訪問該雙向鏈表時(shí),獲取單元604根據(jù)邏輯控制器中的該當(dāng)前指針通過外存控制器訪問到外部存儲(chǔ)器中該雙向鏈表的節(jié)點(diǎn)1,確定單元606通過判斷節(jié)點(diǎn)1的前驅(qū)節(jié)點(diǎn)指針是否和前次指針相等來判斷鏈表是否出錯(cuò),如果判斷節(jié)點(diǎn)1的前驅(qū)節(jié)點(diǎn)指針和前次指針相等,該前次指針修改為指向節(jié)點(diǎn)1,該當(dāng)前指針修改指向節(jié)點(diǎn)2。當(dāng)該應(yīng)用程序通過FPGA繼續(xù)訪問該雙向鏈表的后續(xù)節(jié)點(diǎn)時(shí),其操作過程與上述對(duì)節(jié)點(diǎn)0或節(jié)點(diǎn)1的操作類似,在此不在贅述。優(yōu)選地,在雙向鏈表初始化時(shí),初始化單元602可以將雙向鏈表的首節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針初始指向該雙向鏈表首節(jié)點(diǎn),所述前次指針初始指向所述雙向鏈表的首節(jié)點(diǎn)。如圖5所示,雙向鏈表節(jié)點(diǎn)0的前驅(qū)節(jié)點(diǎn)指針可以初始化指向節(jié)點(diǎn)0, 當(dāng)前指針初始化指向節(jié)點(diǎn)0,前次指針初始化指向節(jié)點(diǎn)0,這樣實(shí)現(xiàn)優(yōu)點(diǎn)在于,提高了對(duì)該雙向鏈表的首節(jié)點(diǎn)的檢測準(zhǔn)確度,在對(duì)節(jié)點(diǎn)0進(jìn)行檢測時(shí),進(jìn)行比較的前次指針和當(dāng)前指針的前驅(qū)節(jié)點(diǎn)指針值都為節(jié)點(diǎn)0的地址,而不是空值,在內(nèi)存的操作中,內(nèi)存的內(nèi)容初始化通常都是設(shè)置為空值,這樣,當(dāng)外存控制器出錯(cuò)時(shí),通過當(dāng)前指針訪問的可能不是節(jié)點(diǎn)0,而訪問到另一內(nèi)存,而恰好該內(nèi)存地址的內(nèi)容都是空值,則無法判斷出鏈表訪問錯(cuò)誤。而節(jié)點(diǎn) 0的地址在外部存儲(chǔ)器中是唯一的,在其他內(nèi)存位置出現(xiàn)與該地址相同的值的概率很小,因此,通過把雙向鏈表的首節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針和前次指針初始指向雙向鏈表的首節(jié)點(diǎn)能夠提高對(duì)該雙向鏈表首節(jié)點(diǎn)的檢測準(zhǔn)確度。 本發(fā)明實(shí)施例提供的鏈表檢錯(cuò)的方法好處在于,每次FPGA通過邏輯控制器訪問外存儲(chǔ)器的雙向鏈表時(shí),都會(huì)有個(gè)預(yù)期結(jié)果,這個(gè)預(yù)期結(jié)果是通過前次指針來判斷的,如果通過邏輯控制器獲得的外部存儲(chǔ)器的雙向鏈表的節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針與該前次指針不相等,則認(rèn)為獲得鏈表節(jié)點(diǎn)不滿足預(yù)期結(jié)果,因此可以判斷該雙向鏈表錯(cuò)誤。這樣能夠解決由于FPGA的外存控制器錯(cuò)誤引起的鏈表訪問錯(cuò)誤的問題,舉例來說,如圖3如果應(yīng)用程序通過FPGA訪問該雙向鏈表時(shí),利用邏輯控制器的當(dāng)前指針通過FPGA的外存控制器訪問該雙向鏈表時(shí),如果FPGA的外存控制器出錯(cuò),導(dǎo)致本該訪問該雙向鏈表的節(jié)點(diǎn)1,但錯(cuò)誤的訪問了該雙向鏈表的節(jié)點(diǎn)n,由于節(jié)點(diǎn)η的前驅(qū)節(jié)點(diǎn)指針為節(jié)點(diǎn)η-1的地址與該前次指針指向節(jié)點(diǎn)0的地址不相等,則可判斷該雙向鏈表訪問出錯(cuò)。同時(shí),本發(fā)明實(shí)施例提供的技術(shù)方案對(duì)于由于外部存儲(chǔ)器出現(xiàn)錯(cuò)誤BIT位跳變或應(yīng)用程序讀寫越界造成鏈表節(jié)點(diǎn)前驅(qū)節(jié)點(diǎn)指針被改寫引起的鏈表訪問錯(cuò)誤同樣適用,舉例來說,如圖3所示,如果外部存儲(chǔ)器存放節(jié)點(diǎn) 1的前驅(qū)節(jié)點(diǎn)指針對(duì)應(yīng)的位置出現(xiàn)錯(cuò)誤bit跳變,該前驅(qū)節(jié)點(diǎn)指針變?yōu)榉欠ㄖ羔?,那么?dāng)應(yīng)用程序通過FPGA訪問該雙向鏈表時(shí),利用邏輯控制器的當(dāng)前指針獲得該雙向鏈表的節(jié)點(diǎn)1 時(shí),由于節(jié)點(diǎn)1的前驅(qū)節(jié)點(diǎn)指針已經(jīng)變?yōu)榉欠ㄖ羔槪撉按沃羔槍⒑凸?jié)點(diǎn)1的前驅(qū)節(jié)點(diǎn)指針不相等,因此,可以判斷出該雙向鏈表訪問錯(cuò)誤。該裝置還可以包括處理單元702,用于當(dāng)該節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針與該前次指針相等,將該前次指針進(jìn)行修改,修改后的前次指針的值為該當(dāng)前指針的值。然后修改當(dāng)前指針,修改后的當(dāng)前指針的值為該節(jié)點(diǎn)的后繼節(jié)點(diǎn)指針的值。如圖4所示,圖4為確定該節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針與該前次指針相等時(shí),該當(dāng)前指針和前次指針修改后的示意圖,前次指針修改為指向節(jié)點(diǎn)0,當(dāng)前指針修改為指向節(jié)點(diǎn)1。進(jìn)一步,該裝置還可以包括通告單元802,如圖8所示。通告單元802,用于當(dāng)判斷單元606判斷該雙向鏈表訪問出錯(cuò)之后,通知網(wǎng)管該雙向鏈表訪問出錯(cuò),并停止應(yīng)用程序?qū)υ撾p向鏈表的訪問。本發(fā)明實(shí)施例提供的裝置可以由網(wǎng)絡(luò)設(shè)備或可編程控制器來實(shí)現(xiàn),網(wǎng)絡(luò)設(shè)備可以為路由器或交換機(jī),可編程控制器可以為FPGA或ASIC。可見,通過本發(fā)明實(shí)施提供的裝置,當(dāng)應(yīng)用程序通過可編程器件訪問雙向鏈表時(shí), 能夠?qū)﹄p向鏈表的訪問進(jìn)行實(shí)時(shí)檢錯(cuò),當(dāng)鏈表訪問出錯(cuò)時(shí)上報(bào)網(wǎng)管并停止應(yīng)用程序?qū)︽湵碓L問,能夠有效解決鏈表訪問出錯(cuò)導(dǎo)致系統(tǒng)崩潰的問題。本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述方法實(shí)施例的全部或部分步驟可以通過程序指令相關(guān)的硬件來完成,前述程序可以存儲(chǔ)于一計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中,該程序在執(zhí)行時(shí),執(zhí)行包括上述方法實(shí)施例的步驟;而前述的存儲(chǔ)介質(zhì)包括R0M、RAM、磁碟或者光盤等各種可以存儲(chǔ)程序代碼的介質(zhì)。最后應(yīng)說明的是以上實(shí)施例僅用以說明本發(fā)明的技術(shù)方案,而非對(duì)其限制;盡管參照前述實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)的說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解其依然可以對(duì)前述各實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對(duì)其中部分技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實(shí)施例技術(shù)方案的范圍。
權(quán)利要求
1.一種雙向鏈表訪問檢錯(cuò)的方法,其特征在于,在邏輯控制器中存放所述雙向鏈表的當(dāng)前指針和前次指針,所述當(dāng)前指針用于標(biāo)識(shí)本次要訪問的所述雙向鏈表節(jié)點(diǎn),所述前次指針用于標(biāo)識(shí)前次訪問的所述雙向鏈表節(jié)點(diǎn),所述當(dāng)前指針初始指向所述雙向鏈表的首節(jié)點(diǎn),所述方法包括根據(jù)所述當(dāng)前指針獲取所述雙向鏈表的節(jié)點(diǎn);所述獲取的雙向鏈表的節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針與所述前次指針不相等時(shí),確定所述雙向鏈表訪問出錯(cuò)。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,該方法進(jìn)一步包括所述雙向鏈表的首節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針初始指向所述雙向鏈表首節(jié)點(diǎn),所述前次指針初始指向所述雙向鏈表的首節(jié)點(diǎn)。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,該方法進(jìn)一步包括所述雙向鏈表的首節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針初始為空值,所述前次指針初始為空值。
4.根據(jù)權(quán)利要求1至3任一所述的方法,其特征在于,該方法進(jìn)一步包括所述獲得的雙向鏈表的節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針與所述前次指針相等時(shí),將所述前次指針內(nèi)容進(jìn)行修改,修改后的所述前次指針的值為所述當(dāng)前指針的值,并將所述當(dāng)前指針進(jìn)行修改,修改后的所述當(dāng)前指針的值為所述獲得的雙向鏈表的節(jié)點(diǎn)的后繼節(jié)點(diǎn)指針的值。
5.根據(jù)權(quán)利要求1至4任一項(xiàng)所述的方法,其特征在于,所述雙向鏈表訪問出錯(cuò)之后, 進(jìn)一步包括通知網(wǎng)管所述雙向鏈表訪問出錯(cuò),并停止對(duì)所述雙向鏈表的訪問。
6.一種雙向鏈表訪問檢錯(cuò)的裝置,其特征在于,包括初始化單元,用于在雙向鏈表生成時(shí),在邏輯控制器中存放所述雙向鏈表的當(dāng)前指針和前次指針,所述當(dāng)前指針用于標(biāo)識(shí)本次要訪問的所述雙向鏈表節(jié)點(diǎn),所述前次指針用于標(biāo)識(shí)前次訪問的所述雙向鏈表節(jié)點(diǎn),所述當(dāng)前指針初始指向所述雙向鏈表的首節(jié)點(diǎn);獲取單元,用于根據(jù)所述當(dāng)前指針獲取所述雙向鏈表的節(jié)點(diǎn);確定單元,用于所述獲取的雙向鏈表的節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針與所述前次指針不相等時(shí),確定所述雙向鏈表訪問出錯(cuò)。
7.根據(jù)權(quán)利要求6所述的裝置,其特征在于,進(jìn)一步包括所述初始化單元設(shè)置所述雙向鏈表的首節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針初始指向所述雙向鏈表首節(jié)點(diǎn),所述前次指針初始指向所述雙向鏈表的首節(jié)點(diǎn)。
8.根據(jù)權(quán)利要求6所述的裝置,其特征在于,進(jìn)一步包括所述初始化單元設(shè)置所述雙向鏈表的首節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針初始為空值,所述前次指針初始為空值。
9.根據(jù)權(quán)利要求6至8任一權(quán)利要求所述的裝置,其特征在于,包括處理單元,用于當(dāng)所述獲得的雙向鏈表的節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針與所述前次指針相等時(shí),將所述前次指針內(nèi)容進(jìn)行修改,修改后的所述前次指針的值為所述當(dāng)前指針的值,并將所述當(dāng)前指針進(jìn)行修改,修改后的所述當(dāng)前指針的值為所述獲得的雙向鏈表的節(jié)點(diǎn)的后繼節(jié)點(diǎn)指針的值。
10.根據(jù)權(quán)利要求6至9任一權(quán)利要求所述的裝置,其特征在于,包括通告單元,用于當(dāng)所述判斷單元判斷所述雙向鏈表訪問出錯(cuò)之后,通知網(wǎng)管所述雙向鏈表訪問出錯(cuò),并停止對(duì)所述雙向鏈表的訪問。
全文摘要
本發(fā)明實(shí)施例提供一種雙向鏈表訪問檢錯(cuò)的方法及裝置,該方法包括在邏輯控制器中存放所述雙向鏈表的當(dāng)前指針和前次指針,所述當(dāng)前指針用于標(biāo)識(shí)本次要訪問的所述雙向鏈表節(jié)點(diǎn),所述前次指針用于標(biāo)識(shí)前次訪問的所述雙向鏈表節(jié)點(diǎn),所述當(dāng)前指針初始指向所述雙向鏈表的首節(jié)點(diǎn),所述方法包括根據(jù)所述當(dāng)前指針獲取所述雙向鏈表的節(jié)點(diǎn);所述獲取的雙向鏈表的節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)指針與所述前次指針不相等時(shí),確定所述雙向鏈表訪問出錯(cuò)。本發(fā)明實(shí)施例還提供了一種雙向鏈表訪問檢錯(cuò)的裝置。通過本發(fā)明實(shí)施例提供的方法及裝置,在應(yīng)用程序通過FPGA對(duì)鏈表進(jìn)行訪問時(shí),能夠?qū)︽湵碓L問進(jìn)行實(shí)時(shí)檢錯(cuò),以避免由于鏈表訪問錯(cuò)誤導(dǎo)致系統(tǒng)崩潰。
文檔編號(hào)H04L12/26GK102546305SQ20121001817
公開日2012年7月4日 申請(qǐng)日期2012年1月19日 優(yōu)先權(quán)日2012年1月19日
發(fā)明者張恒 申請(qǐng)人:華為技術(shù)有限公司