專利名稱:一種過程級軟硬件協(xié)同設(shè)計自動化開發(fā)方法
技術(shù)領(lǐng)域:
本發(fā)明屬于計算機領(lǐng)域,涉及嵌入式領(lǐng)域中的可重構(gòu)片上系統(tǒng)(RSoC)的軟硬件協(xié)同設(shè)計,具體涉及一種過程級軟硬件協(xié)同設(shè)計自動化開發(fā)方法。
背景技術(shù):
在傳統(tǒng)嵌入式系統(tǒng)設(shè)計領(lǐng)域,應(yīng)用程序通常整個用軟件實現(xiàn)。隨著以FPGA技術(shù)為基礎(chǔ)的可重構(gòu)器件的速度越來越快、使用越來越普遍,將應(yīng)用實現(xiàn)成軟硬件混合系統(tǒng)能夠達到更好的性價比。如何將應(yīng)用劃分到軟件和硬件兩部分并將其整合以滿足系統(tǒng)功能與性能需求,同時實現(xiàn)成本的最小化導(dǎo)致了軟硬件協(xié)同設(shè)計的產(chǎn)生。
傳統(tǒng)的軟硬件協(xié)同設(shè)計方法學(xué)一般都按照“先劃分再實現(xiàn)”的步驟來設(shè)計,系統(tǒng)設(shè)計好之后,系統(tǒng)組成和硬件結(jié)構(gòu)不能再改變。由于沒有考慮到可重構(gòu)計算單元的動態(tài)重構(gòu)能力,很難高效的利用可重構(gòu)計算資源。另外軟硬件劃分涉及到組合爆炸,是NP難問題,進行軟硬件劃分需要設(shè)計人員具備很高的專業(yè)技能。同時,由于可重構(gòu)計算系統(tǒng)即包含有軟件可編程的微處理器又包含有硬件可重構(gòu)的邏輯器件,需要應(yīng)用程序員同時擁有軟件和硬件設(shè)計知識,并需要考慮動態(tài)重構(gòu)以及軟硬件通信細節(jié)。
目前動態(tài)軟硬件劃分按照其劃分任務(wù)粒度的不同,可以分為指令級、過程級和進(線)程級。指令級動態(tài)軟硬件劃分方法完全不用設(shè)計人員干預(yù),編譯器、操作系統(tǒng)都可以不變,軟硬件劃分完全由專門硬件完成。但由于需要額外的專用硬件進行在線反匯編、綜合和布局布線,硬件開銷比較大。另一方面指令級動態(tài)軟硬件劃分粒度目前局限在基本塊內(nèi),結(jié)構(gòu)也局限于單循環(huán)結(jié)構(gòu),性能提升效果有限。
進(線)程級動態(tài)軟硬件劃分把軟件和硬件任務(wù)都當(dāng)作進程或線程,由操作系統(tǒng)統(tǒng)一管理,可以支持現(xiàn)有硬件設(shè)計資源,便于集成開發(fā)。動態(tài)軟硬件劃分可轉(zhuǎn)換為軟硬件進(線)程動態(tài)調(diào)度問題,利用和擴展操作系統(tǒng)進(線)程管理功能而實現(xiàn)。同時,軟硬件進(線)程通信、同步也可利用操作系統(tǒng)提供的相應(yīng)機制實現(xiàn),較為靈活方便。但進(線)程調(diào)度、通信、同步基本由軟件完成,時間開銷較大。雖然在一些研究中提出了支持可重構(gòu)計算操作系統(tǒng)的專門硬件,但主要負責(zé)配置信息和可重構(gòu)資源管理,進程調(diào)度和切換還是由軟件完成。另外,目前的進(線)程級動態(tài)軟硬件劃分研究中對軟硬件透明編程模型還關(guān)注不夠,軟件和硬件進(線)程對設(shè)計人員是可見的,程序員創(chuàng)建一個軟件或硬件進(線)程的同時,實際已暗示了相應(yīng)功能的軟硬件劃分。
過程級動態(tài)軟硬件劃分的基本思想是建立軟硬件協(xié)同函數(shù)庫,將計算任務(wù)分解成函數(shù),以函數(shù)為軟硬件劃分和調(diào)度的基本單位。在功能描述階段,并不區(qū)分函數(shù)的軟硬件性質(zhì);在程序運行時才根據(jù)動態(tài)軟硬件劃分的結(jié)果,通過動態(tài)連接技術(shù)將函數(shù)連接到相應(yīng)的硬件或軟件實現(xiàn)。這樣可以做到真正的在線劃分、動態(tài)重構(gòu)和設(shè)計透明。函數(shù)的調(diào)用時間相對進(線)程切換開銷要小得多,同時不需要對指令流進行循環(huán)提取、反匯編、在線綜合等操作,是一種較理想的方案。
目前的各種RSoC軟硬件開發(fā)流程存在諸多不足,主要表現(xiàn)如下功能描述與系統(tǒng)設(shè)計之間的存大較大鴻溝、編程不透明、動態(tài)可重構(gòu)資源難以有效利用、開發(fā)工具種類繁多、開發(fā)流程冗長復(fù)雜。
由上可以看出,迫切需要一種自動化的開發(fā)流程來實現(xiàn)RSoC的軟硬件協(xié)同設(shè)計。
發(fā)明內(nèi)容
本發(fā)明要解決技術(shù)問題是提供一種過程級軟硬件協(xié)同設(shè)計自動化開發(fā)方法,使用該方法,可達到可重構(gòu)器件對程序用戶透明的目的。支持運行時的動態(tài)軟硬件劃分,使劃分對程序員透明,提高了可重構(gòu)資源的利用率,提高了系統(tǒng)開發(fā)的效率。
本發(fā)明為解決上述技術(shù)問題所采用的技術(shù)方案是 一種過程級軟硬件協(xié)同設(shè)計自動化開發(fā)方法,其特征在于,包括以下步驟 步驟A利用高級語言完成系統(tǒng)功能描述,系統(tǒng)功能描述中包括軟硬件協(xié)同函數(shù)的調(diào)用,所有的軟硬件協(xié)同函數(shù)都放置在同一個軟硬件協(xié)同函數(shù)庫中; 步驟B軟硬件函數(shù)的動態(tài)劃分在程序運行時,采用動態(tài)軟硬件劃分方法對程序調(diào)用的軟硬件協(xié)同函數(shù)進行劃分,即確定具體的軟硬件協(xié)同函數(shù)將要采用軟件實現(xiàn)還是硬件實現(xiàn); 步驟C鏈接和執(zhí)行步驟動態(tài)鏈接器根據(jù)動態(tài)軟硬件劃分方法的劃分結(jié)果,對具體的函數(shù)進行鏈接,對于采用軟件實現(xiàn)的函數(shù);就將該采用軟件實現(xiàn)的函數(shù)翻譯為軟件指令此處的軟件指令為機器代碼交給中央處理器執(zhí)行;對于采用硬件實現(xiàn)的函數(shù),則調(diào)用硬件實現(xiàn)的函數(shù)的配置文件,配置可重構(gòu)資源并執(zhí)行該硬件實現(xiàn)的函數(shù); 步驟D判斷和結(jié)束步驟;判斷是否所有的函數(shù)執(zhí)行完畢,如果執(zhí)行完畢就結(jié)束,否則返回用于劃分的參數(shù)到步驟B進入下一次循環(huán);所述的函數(shù)包括軟硬件協(xié)同函數(shù)和非軟硬件協(xié)同函數(shù),非軟硬件協(xié)同函數(shù)即普通函數(shù)。
所述的動態(tài)連接器具體完成以下4個任務(wù) 第一個任務(wù)是將當(dāng)前函數(shù)區(qū)分成軟硬件協(xié)同函數(shù)和普通函數(shù)定義一個用于存放軟硬件協(xié)同函數(shù)庫的路徑的環(huán)境變量,程序運行時,對于程序調(diào)用的當(dāng)前函數(shù),取出該當(dāng)前函數(shù)的鏈接映射(link_map)中的存放調(diào)用來源的變量值(l_origin),將存放調(diào)用來源的變量值(l_origin)與環(huán)境變量的值比較,如果相同,則確定該當(dāng)前函數(shù)為軟硬件協(xié)同函數(shù);否則,為普通函數(shù); 第二個任務(wù)是檢測當(dāng)前調(diào)用的函數(shù)是否為軟硬件協(xié)同函數(shù),如果是,則將用于決定即將執(zhí)行函數(shù)的地址的變量(GOT)值修改為軟硬件協(xié)同函數(shù)庫中具體函數(shù)(硬件函數(shù)或者軟件函數(shù)的入口地址,用于進行協(xié)同函數(shù)庫的訪問,如果不是,則調(diào)用elf_machine_fixup_plt函數(shù),elf_machine_fixup_plt函數(shù)的作用為定位普通函數(shù)執(zhí)行方式的地址; 第三個任務(wù)是給軟硬件協(xié)同函數(shù)庫提供注冊接口,為動態(tài)軟硬件劃分方法提供反饋的性能參數(shù),所述的性能參數(shù)包括當(dāng)前函數(shù)的結(jié)束時間、軟/硬件運行時間、軟/硬件調(diào)用次數(shù)、本軟硬件協(xié)同函數(shù)的軟/硬件總運行時間以及記錄所有軟硬件協(xié)同函數(shù)的軟/硬件總運行時間的變量; 第四個任務(wù)是使編譯后的可執(zhí)行文件使用修改后的動態(tài)鏈接器,具體為將操作系統(tǒng)鏈接(link_os_linux)和linux操作系統(tǒng)中的gnu鏈接改成動態(tài)鏈接器的絕對路徑。
所述的軟硬件協(xié)同函數(shù)庫的構(gòu)造方法為 所述的軟硬件協(xié)同函數(shù)庫包括多個軟硬件協(xié)同函數(shù),每一個軟硬件協(xié)同函數(shù)包括頭文件、具體函數(shù)實現(xiàn)文件和硬件配置文件; 在具體函數(shù)實現(xiàn)文件中構(gòu)造每一個具體函數(shù)的軟件函數(shù)實現(xiàn)和硬件接口代碼;在軟件函數(shù)實現(xiàn)和硬件接口代碼中設(shè)置檢測硬件函數(shù)執(zhí)行時間或軟件函數(shù)執(zhí)行時間的代碼; 在硬件配置文件具有通過硬件實現(xiàn)具體函數(shù)的硬件描述語言代碼; 在所述的頭文件中聲明多個具體函數(shù)的名稱和參數(shù)形式;為程序調(diào)用具體的軟件函數(shù)實現(xiàn)和硬件接口代碼提供統(tǒng)一的函數(shù)接口; 調(diào)用軟硬件協(xié)同函數(shù)時,在新建的程序文件中添加所需調(diào)用函數(shù)的頭文件;在新建的程序文件中采用函數(shù)名調(diào)用的方式,調(diào)用頭文件提供的統(tǒng)一函數(shù)接口;在程序編譯時采用動態(tài)編譯方式,在動態(tài)編譯過程中根據(jù)劃分算法選擇該函數(shù)是調(diào)用軟件函數(shù)實現(xiàn)或硬件接口代碼; 檢測硬件函數(shù)執(zhí)行時間或軟件函數(shù)執(zhí)行時間為使用系統(tǒng)運行環(huán)境導(dǎo)出函數(shù)來實現(xiàn)。
所述的動態(tài)軟硬件劃分方法為分支界定算法或貪婪算法或考慮硬件預(yù)配置因素的動態(tài)軟硬件劃分方法,所述的考慮硬件預(yù)配置因素的動態(tài)軟硬件劃分方法具體為 在程序運行過程中,進行動態(tài)的軟硬件劃分,在可重構(gòu)硬件資源上進行一個或多個函數(shù)的配置,對待劃分函數(shù)維護一個待劃分函數(shù)列表list(f1,…,fm),其中fk為硬件加速比,k為待劃分的一個函數(shù);k=1,…,m,m為待劃分函數(shù)個數(shù),硬件加速比定義為
F對應(yīng)待劃分函數(shù)的集合;Ck為函數(shù)k在程序運行過程中被調(diào)用的次數(shù),Timeswk為函數(shù)k的軟件執(zhí)行時間;
為0時表示函數(shù)k當(dāng)前劃分為硬件,反之表示函數(shù)k當(dāng)前為軟件;Trfk對應(yīng)函數(shù)k的硬件實現(xiàn)函數(shù)的配置時間;Timehwk為函數(shù)k的硬件執(zhí)行時間;Commk為函數(shù)k的硬件實現(xiàn)函數(shù)的軟硬件通信代價,為硬件與軟件的參數(shù)傳遞時間; 具體劃分步驟如下 步驟1從列表list(f1,…,fm)中選出最大值fi; 步驟2如果fi已經(jīng)被劃分為硬件,則從列表中刪除fi,更新列表,返回步驟1,否則,進入下一步; 步驟3檢測當(dāng)前的可重構(gòu)資源是否足夠,是則將函數(shù)i劃分為硬件,并配置到可重構(gòu)資源上,從列表中刪除fi,更新列表,返回步驟1; 否則,進入下一步; 步驟4fi與fj比較,fj為函數(shù)j的硬件加速比,函數(shù)j為已經(jīng)配置在可重構(gòu)資源上的函數(shù)中的一個函數(shù),且在所有的已經(jīng)配置在可重構(gòu)資源上的函數(shù)中,函數(shù)j所對應(yīng)的加速比最?。蝗绻鹒i大于fj,則將函數(shù)j劃分為軟件,從可重構(gòu)資源中刪除函數(shù)j,返回步驟3;如果fi小于fj,則進入步驟4.1; 步驟4.1檢測list是否為空,不空,則保存本次劃分結(jié)果,結(jié)束;如果是空,則計算關(guān)系矩陣Cst,選出該關(guān)系矩陣Cst中最大值元素cst,將cst對應(yīng)的函數(shù)t加入到待劃分函數(shù)列表list(f1,…,fm)中更新待劃分函數(shù)列表list(f1,…,fm),進入步驟4.2; 所述的Cst記錄函數(shù)調(diào)用次序信息,關(guān)系矩陣Cst為m*N個元素,N為m個待劃分的函數(shù)可能調(diào)用的所有函數(shù)的個數(shù);s元素表示當(dāng)前劃分的所有函數(shù),元素cij表示函數(shù)i被調(diào)用后立刻就調(diào)用了函數(shù)j的次數(shù)。
本發(fā)明的有益效果 本發(fā)明的過程級軟硬件協(xié)同設(shè)計自動化開發(fā)方法,使用過程級軟硬件統(tǒng)一編程模型,來屏蔽底層硬件實現(xiàn)的差異,達到可重構(gòu)器件對程序用戶透明的目的。該編程模型將硬件加速器封裝成C語言函數(shù),方便用戶編程,且支持運行時的動態(tài)軟硬件劃分,使劃分對程序員透明,提高了可重構(gòu)資源的利用率。
系統(tǒng)設(shè)計人員通過調(diào)用已根據(jù)應(yīng)用特性進行優(yōu)化的軟硬件協(xié)同函數(shù)庫,即可利用高級語言完成系統(tǒng)功能描述;動態(tài)軟硬件劃分算法在程序運行時對其進行劃分,選擇、調(diào)度需要轉(zhuǎn)換到軟件或硬件實現(xiàn)的庫函數(shù),并通過動態(tài)鏈接器實時切換函數(shù)的運行方式,從而形成了一個由功能描述到系統(tǒng)實現(xiàn)的自動化流程。
本發(fā)明最大的一個優(yōu)點是綜合了軟硬件協(xié)同工作以及開發(fā)流程易于實現(xiàn)的優(yōu)點,由于采用了軟硬件協(xié)同函數(shù),因此,設(shè)計人員不必同時精通軟件和硬件實現(xiàn),對設(shè)計人員的素質(zhì)要求顯著降低,使得軟硬件協(xié)同設(shè)計的時間能顯著縮短;動態(tài)軟硬件劃分方法為優(yōu)化的動態(tài)劃分算法,能最大限度的發(fā)揮硬件執(zhí)行速度快的優(yōu)點,從而使得程序的執(zhí)行效率高。
圖1是過程級軟硬件協(xié)同設(shè)計集成開發(fā)環(huán)境構(gòu)架; 圖2是過程級軟硬件協(xié)同設(shè)計的結(jié)構(gòu)圖; 圖3是過程級軟硬件協(xié)同設(shè)計的原理圖; 圖4是過程級軟硬件協(xié)同設(shè)計流程圖; 圖5是過程級軟硬件協(xié)同設(shè)計運行時數(shù)據(jù)流圖; 圖6是本發(fā)明的總流程圖; 圖7為考慮硬件預(yù)配置因素的動態(tài)軟硬件劃分方法的流程圖。
具體實施例方式 下面結(jié)合附圖和具體實施例對本發(fā)明作進一步說明。
系統(tǒng)設(shè)計人員通過調(diào)用已根據(jù)應(yīng)用特性進行優(yōu)化的軟硬件協(xié)同函數(shù)庫,即可利用高級語言完成系統(tǒng)功能描述;系統(tǒng)功能描述中包括協(xié)同函數(shù)的調(diào)用,動態(tài)軟硬件劃分算法在程序運行時對程序調(diào)用的軟硬件協(xié)同函數(shù)進行劃分,選擇、調(diào)度需要配置到軟件或硬件實現(xiàn)的庫函數(shù),并通過動態(tài)鏈接器實時切換函數(shù)的運行方式,調(diào)用具體的軟件或硬件函數(shù),從而形成了一個由功能描述到系統(tǒng)實現(xiàn)的自動化流程。
所述動態(tài)鏈接器為劃分算法可以用預(yù)配置的劃分算法,也可以是其他的劃分算法。其他的算法,如分支界定算法或貪婪算法提供劃分參數(shù),并讀取動態(tài)軟硬件劃分的決策結(jié)果,將應(yīng)用程序中對抽象函數(shù)的調(diào)用映射到具體的軟件實體代碼或硬件接口代碼上。
動態(tài)鏈接器的實現(xiàn) 動態(tài)鏈接控制的第一個任務(wù)是檢測是否調(diào)用協(xié)同函數(shù),如果是,則修改GOT入口進行協(xié)同函數(shù)庫的訪問,如果不是,調(diào)用elf_machine_fixup_plt函數(shù)該函數(shù)的作用為定位函數(shù)上次執(zhí)行方式的地址;檢測到對協(xié)同函數(shù)的調(diào)用,就一律不再調(diào)用elf_machine_fixup_plt函數(shù)(系統(tǒng)函數(shù))。GOT(該變量用于決定即將執(zhí)行函數(shù)的地址)入口項一步進行了修改 動態(tài)鏈接控制的第二個任務(wù)是將函數(shù)區(qū)分成協(xié)同函數(shù)和普通函數(shù)。新添了額外的環(huán)境變量”LD_COL_LIB”協(xié)同函數(shù)庫的路徑只有一個,它指出協(xié)同函數(shù)庫所在路徑,共享庫對應(yīng)的鏈接映射link_map節(jié)點建立好后,通過將該環(huán)境變量的值LD_COL_LIB和其存放調(diào)用來源的變量l_originl_origin屬于鏈接映射的一個成員。比較便可以知道該函數(shù)是否在協(xié)同函數(shù)庫中,。程序運行時,對于程序調(diào)用的某一個函數(shù),取出該函數(shù)的link_map中的l_origin,將l_origin與LD_COL_LIB(自己添加的變量)比較,如果相同,則確定該函數(shù)為協(xié)同函數(shù)。否則,為普通函數(shù)。
動態(tài)鏈接控制的第三個任務(wù)是給協(xié)同函數(shù)庫提供注冊接口,為動態(tài)軟硬件劃分算法提供反饋的性能參數(shù)函數(shù)的結(jié)束時間、軟/硬件運行時間、軟/硬件調(diào)用次數(shù)、本協(xié)同函數(shù)的軟/硬件總運行總時間以及記錄所有協(xié)同函數(shù)軟/硬件總運行時間的變量等。
動態(tài)鏈接控制的第四個任務(wù)是使編譯后的可執(zhí)行文件使用修改后的動態(tài)鏈接器。具體為將gcc(GNU(一個組織名稱)計劃開發(fā)的C語言編譯器)中的specs文件中的linux系統(tǒng)中的操作系統(tǒng)鏈接(link_os_linux)和linux操作系統(tǒng)中的gnu(組織名稱,用于該組織開發(fā)的軟件)鏈接改成動態(tài)鏈接器的絕對路徑。
首先進行系統(tǒng)功能描述 接著根據(jù)劃分算法對函數(shù)(該函數(shù)為軟硬件協(xié)同函數(shù)庫中的函數(shù))進行軟硬件劃分,確定函數(shù)以何種方式執(zhí)行。
接著動態(tài)鏈接器根據(jù)劃分軟件函數(shù)算法的劃分結(jié)果,進行對應(yīng)函數(shù)庫的鏈接,如果執(zhí)行,是軟件函數(shù)就將之翻譯為軟件指令交給中央處理器(CPU),如果是硬件函數(shù)的話,就調(diào)用硬件函數(shù)的配置文件,配置可重構(gòu)資源,進行處理。
判斷是否所有的函數(shù)執(zhí)行完畢,如果執(zhí)行完畢就結(jié)束,否則返回用于劃分的參數(shù)。開發(fā)流程如圖6. 動態(tài)軟硬件劃分算法的實現(xiàn) 從協(xié)同函數(shù)庫相關(guān)信息文件(記錄了該庫包含的協(xié)同函數(shù)名及對應(yīng)的加速器名稱,面積)中抽取該協(xié)同函數(shù)的相關(guān)信息。
執(zhí)行時間、方式約束可以由程序員在編程的時候指定,這些約束給出函數(shù)一次執(zhí)行可消耗的最多時間/哪些函數(shù)必須以軟件或硬件方式執(zhí)行,這些約束可以作為獨立的源文件開發(fā)。
其余參數(shù)都通過動態(tài)鏈接器和協(xié)同函數(shù)庫協(xié)作獲取,其中最近的函數(shù)調(diào)用順序,動態(tài)鏈接器用一個有限長的鏈表記錄,而時間的具體獲取方式為動態(tài)鏈接器給軟硬件協(xié)同函數(shù)庫提供訪問其內(nèi)部數(shù)據(jù)結(jié)構(gòu)的接口,它們的實現(xiàn)中含有來獲取高精度時間的匯編指令。
劃分算法設(shè)計者除了提供劃分算法和性能監(jiān)測函數(shù)用于將用于監(jiān)測的變量名傳遞給動態(tài)鏈接器
動態(tài)鏈接器為劃分函數(shù)的注冊提供了接口 預(yù)留了劃分算法的接口。為方便對新開發(fā)的動態(tài)軟硬件劃分算法進行評估,本協(xié)同設(shè)計框架給劃分算法設(shè)計人員實驗新算法提供了注冊接口.
動態(tài)鏈接還提供接口,以注冊反射函數(shù)將變量名對應(yīng)的變量值返回給性能監(jiān)測函數(shù)。該函數(shù)可以注冊兩個函數(shù),這兩個函數(shù)除了通過共同的參數(shù)列表進行數(shù)據(jù)通信外,還可以通過全局變量進行通信。它們一個在劃分算法執(zhí)行前執(zhí)行,得到劃分前的性能參數(shù),一個在劃分算法執(zhí)行后調(diào)用,得到劃分后的性能參數(shù),用于劃分前后的性能進行對比,劃分算法設(shè)計者可以用它們來監(jiān)測整個劃分過程。
兩個函數(shù)都被傳入同一個文件描述符fd,所有的性能監(jiān)測數(shù)據(jù)(包括動態(tài)鏈接器內(nèi)部監(jiān)測到的)將被寫入該文件。
實施例1 過程級軟硬件協(xié)同設(shè)計集成開發(fā)環(huán)境構(gòu)架如圖1。提供圖形化的系統(tǒng)描述與設(shè)計,以及劃分算法設(shè)計環(huán)境。主要分為用戶界面、編譯器、調(diào)試器三大部分組成。
用戶界面在系統(tǒng)描述與設(shè)計模式下(圖1實線部分),設(shè)計人員可進行系統(tǒng)功能描述的代碼和性能約束代碼等的輸入;在劃分算法設(shè)計模式下(圖1虛線部分),設(shè)計人員可以完成算法及性能監(jiān)測代碼的輸入工作。集成環(huán)境將為設(shè)計人員新建的工程生成特定的文件、目錄等,整個工程由.project(工程文件的后綴名)文件管理,.project文件將即時反映工程文件的任何變化,記錄工程類型,工具路徑,編譯鏈接選項,相關(guān)環(huán)境變量等,為軟件綜合提供基礎(chǔ)。
編譯器負責(zé)編譯和鏈接,將應(yīng)用程序編譯成可執(zhí)行文件,將劃分算法等編譯成共享庫。通過將.project文件轉(zhuǎn)換成配置文件(Makefile)文件,由配置(make)函數(shù)調(diào)用GNU(一個組織名稱)計劃的C語言編譯器GCC對C語言代碼完成編譯。
調(diào)試器通過xmd、gdb工具對下載到片上系統(tǒng)的性能約束文件進行調(diào)試。
在劃分算法設(shè)計模式下,新開發(fā)的算法被編譯成共享庫后下載到FPGA上替換原有的劃分算法庫,應(yīng)用程序運行完畢后將生成相關(guān)性能監(jiān)測數(shù)據(jù),這些數(shù)據(jù)將保存到特定格式的文件中,集成開發(fā)環(huán)境將該文件讀回并規(guī)格化以適當(dāng)?shù)男问斤@示,以便與之前的算法進行對比改進。
系統(tǒng)的描述與設(shè)計和軟硬件劃分算法設(shè)計可以通過不同的開發(fā)流程同時進行。前者和軟件開發(fā)流程完全一樣,設(shè)計人員調(diào)用協(xié)同函數(shù)編寫代碼,然后進行編譯、下載、調(diào)試,協(xié)同開發(fā)環(huán)境將對整個過程中的細節(jié)問題進行管理。而劃分算法的設(shè)計流程是一個迭代過程,需針對具體應(yīng)用特點進行規(guī)劃與設(shè)計。
過程級軟硬件協(xié)同設(shè)計的結(jié)構(gòu)圖如圖2。主要由編程模型、綜合工具和仿真工具三大部分組成。編程模型是用戶設(shè)計自動化工具和主要的開發(fā)環(huán)境,用戶可以在編程模型中完成系統(tǒng)功能描述、聯(lián)合綜合、聯(lián)合調(diào)試和生成可執(zhí)行代碼等主要工作。綜合工具和仿真工具主要用于用戶自定義函數(shù)庫的建立與驗證工作。用戶自定義的硬件函數(shù)可通過仿真工具進行結(jié)構(gòu)仿真、形為仿真和時序仿真,并通過綜合工具形成系統(tǒng)認可的網(wǎng)表文件或配置文件,而不需要再借助專門的商用工具來完成。綜合工具與仿真工具的設(shè)計流程同傳統(tǒng)數(shù)字設(shè)計流程相似,大大提高了系統(tǒng)的實用性和可擴展性。圖2中的動態(tài)鏈接接口和軟硬件協(xié)同函數(shù)器,是本發(fā)明的獨特創(chuàng)新之處。
過程級軟硬件協(xié)同設(shè)計的原理如圖3。面向可重構(gòu)片上系統(tǒng)的軟硬件協(xié)同設(shè)計自動化可分解為軟硬件劃分自動化和軟硬件實現(xiàn)自動化兩部分。軟硬件劃分自動化主要通過對動態(tài)軟硬件劃分算法的研究來進行。動態(tài)軟硬件劃分算法根據(jù)運行時動態(tài)獲取的環(huán)境信息和任務(wù)的特征參數(shù)來決定任務(wù)的實現(xiàn)方式。
軟硬件實現(xiàn)自動化主要是在軟硬件協(xié)同函數(shù)庫的支持下,通過動態(tài)連接技術(shù)實現(xiàn)(如圖4)。其中,軟硬件協(xié)同函數(shù)庫是軟硬件實現(xiàn)自動化的基礎(chǔ)與支撐,是動態(tài)軟硬件劃分的對象。動態(tài)連接技術(shù)用來實現(xiàn)程序運行時動態(tài)重構(gòu),將劃分為軟件執(zhí)行的任務(wù)關(guān)聯(lián)到微處理器上的可執(zhí)行代碼,將劃分為硬件執(zhí)行的任務(wù)關(guān)聯(lián)到可重構(gòu)器件上的邏輯電路。
動態(tài)軟硬件劃分算法需要兩個對象,一是任務(wù)圖,在這里是函數(shù)調(diào)用關(guān)系圖。它在系統(tǒng)功能描述時生成,可通過特殊工具程序進行提取。二是任務(wù)特征參數(shù)和運行環(huán)境信息。任務(wù)特征參數(shù)包括任務(wù)面積、軟件執(zhí)行時間、硬件執(zhí)行時間等,也是由系統(tǒng)描述決定,從系統(tǒng)描述中提取。運行時環(huán)境信息包括資源使用情況、硬件函數(shù)配置狀態(tài)、任務(wù)調(diào)用次數(shù)等,需要在運行時由動態(tài)鏈接器實時獲取。
動態(tài)鏈接器的實現(xiàn) 可執(zhí)行文件格式(ELF)文件中GOT入口項一步進行了修改——在發(fā)現(xiàn)所調(diào)用函數(shù)為協(xié)同函數(shù)時不再調(diào)用elf_machine_fixup_plt函數(shù)。
新添了額外的系統(tǒng)環(huán)境變量”LD_COL_LIB”,它指出協(xié)同函數(shù)庫所在路徑,共享庫對應(yīng)的link_map節(jié)點建立好后,通過將該環(huán)境變量的值和其l_origin成員比較便可以知道該函數(shù)是否在協(xié)同函數(shù)庫中。(link_map為鏈接庫的數(shù)據(jù)結(jié)構(gòu)) 以“dl”開頭的函數(shù)由鏈接器導(dǎo)出,其中dl_get_cfl_path給出協(xié)同函數(shù)庫的所在目錄。其余的三個函數(shù)用來在運行時測量協(xié)同函數(shù)的執(zhí)行情況,為軟硬件劃分算法提供參數(shù),在下面會進行介紹。
具體做法是將gcc的specs文件的“l(fā)ink_os_linux”和“l(fā)ink_os_gnu”兩項修改為 *lin_os_linux: -m elf32ppclinux%{!shared:%{!static:%{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker/mylibc/lib/ld-2.3.3.so}}} *lin_os_gnu: -m elf32ppclinux%{!shared:%{!static:%{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker/mylibc/lib/ld-2.3.3.so}}} 帶下劃線為修改后的鏈接器的絕對路徑名。
動態(tài)軟硬件劃分 程序員編寫劃分算法源碼。
執(zhí)行時間、方式約束可以由程序員在編程的時候指定,這些約束給出函數(shù)一次執(zhí)行可消耗的最多時間/哪些函數(shù)必須以軟件或硬件方式執(zhí)行,這些約束可以作為獨立的源文件開發(fā),該源文件的后綴為”.limt”。
其余參數(shù)都通過動態(tài)鏈接器和協(xié)同函數(shù)庫協(xié)作獲取 劃分算法模塊也作為共享庫開發(fā),動態(tài)鏈接器為劃分函數(shù)的注冊提供了接口,劃分算法在程序運行前進行注冊。劃分算法設(shè)計者除了提供劃分算法和性能監(jiān)測函數(shù)外,還提供了”void partition_register(void)”這樣一個函數(shù),其調(diào)用的函數(shù)為鏈接器提供的用來注冊劃分算法和性能監(jiān)測函數(shù)的函數(shù). void partition_register(void) {dl_partition_register(my_partition_v1) dl_partition_register(my_reflex_before,my_reflextion_after); } 為方便對新開發(fā)的動態(tài)軟硬件劃分算法進行評估,本協(xié)同設(shè)計框架給劃分算法設(shè)計人員實驗新算法提供了注冊接口①。
動態(tài)鏈接還提供如②所示接口,以注冊反射函數(shù)。該函數(shù)可以注冊兩個函數(shù),這兩個函數(shù)除了通過共同的參數(shù)列表進行數(shù)據(jù)通信外,還可以通過全局變量進行通信。它們一個在劃分算法執(zhí)行前執(zhí)行,一個在劃分算法執(zhí)行后調(diào)用,劃分算法設(shè)計者可以用它們來監(jiān)測整個劃分過程。
typedef sw_hw_partition_result(*Partition_Func) (address_and_exec_info*,utime64,utime64); typedef void(*Reflextion_Func)(address_and_exec_nifo*,utime64,utime64,int fd); ①:Partition_Func_dl_partition_register(Partition_Func fn) ②:void dl_partition_register(Reflextion_Func before_partition,Reflextion_Func after_partition); 兩個函數(shù)都被傳入同一個文件描述符fd,所有的性能監(jiān)測數(shù)據(jù)(包括動態(tài)鏈接器內(nèi)部監(jiān)測到的)將被寫入該文件。
該文件的格式遵循“1級項目名2級項目名…值;”格式,這種格式的文件將方便其在軟硬件協(xié)同設(shè)計集成開發(fā)環(huán)境中進行自動化處理。
協(xié)同函數(shù)通過調(diào)用dl_update_time_front更新函數(shù)的起始執(zhí)行時間并得到對應(yīng)于該函數(shù)的唯一id。函數(shù)運行結(jié)束后,軟/硬件協(xié)同函數(shù)將分別通過調(diào)用dl_sw_update_time/dl_hw_update_time更新函數(shù)的結(jié)束時間、軟/硬件運行時間、軟/硬件調(diào)用次數(shù)、本協(xié)同函數(shù)的軟/硬件總運行總時間以及記錄所有協(xié)同函數(shù)軟/硬件總運行時間的變量等。
過程級軟硬件協(xié)同設(shè)計流程如圖4。本發(fā)明主要面向圖形圖像領(lǐng)域,為基于可重構(gòu)片上系統(tǒng)的軟硬件協(xié)同設(shè)計提供一種方便、快捷的解決方案。設(shè)計人員可以像編寫常規(guī)軟件代碼一樣輕松的完成軟硬件混合系統(tǒng)的開發(fā),而不會感覺到軟硬件之間的差異。系統(tǒng)的軟硬件劃分和實現(xiàn)工作都由工具自動完成。整個系統(tǒng)開發(fā)過程分為三個階段 系統(tǒng)的描述與設(shè)計設(shè)計人員調(diào)用軟硬件協(xié)同函數(shù)庫中的函數(shù)(該函數(shù)庫提供的接口采用C語言或Java語言編寫,如用Java語言進行描述調(diào)用的則是軟硬件方法),利用C語言完成功能代碼的編寫;設(shè)計人員也可以添加性能約束代碼,如指定協(xié)同庫中函數(shù)的運行方式是全硬件或是全軟件實現(xiàn),以及函數(shù)執(zhí)行時間約束。默認情況下協(xié)同函數(shù)庫中的函數(shù)既可以以軟件形式在微處理器上運行,也可以以硬件方式加載到可重構(gòu)硬件上執(zhí)行。
軟件綜合編譯生成系統(tǒng)描述的可執(zhí)行文件,并獲取其中調(diào)用到的軟硬件協(xié)同函數(shù)(即協(xié)同函數(shù)庫中實現(xiàn)相同接口的軟/硬件函數(shù))信息,包括硬件函數(shù)封裝的加速器的面積,協(xié)同函數(shù)執(zhí)行的性能約束等。
運行時動態(tài)軟硬件劃分軟件綜合階段所生成的可執(zhí)行文件將被加載到可重構(gòu)片上系統(tǒng)中執(zhí)行,軟硬件劃分算法根據(jù)動態(tài)鏈接器實時獲取的程序運行情況及片上系統(tǒng)的資源利用率,決定被調(diào)用的協(xié)同函數(shù)劃分將由微處理器(對應(yīng)軟件函數(shù))還是可重構(gòu)部件上(對應(yīng)硬件函數(shù))執(zhí)行。
過程級軟硬件協(xié)同設(shè)計的整個運行時環(huán)境的數(shù)據(jù)流如圖5。當(dāng)應(yīng)用程序調(diào)用某一函數(shù)時,運行時環(huán)境需對函數(shù)名進行分析,從而判斷是否具有相應(yīng)的硬件函數(shù)實現(xiàn),如果沒有,則繼續(xù)運行軟件代碼,否則在軟硬件函數(shù)運行時信息表中為其創(chuàng)建一個新的記錄并從硬件函數(shù)庫中讀入相應(yīng)的配置信息。這一數(shù)據(jù)結(jié)構(gòu)中主要包括軟硬件函數(shù)執(zhí)行時間、函數(shù)調(diào)用次數(shù)、硬件函數(shù)面積等將被提供給軟硬件劃分算法的參數(shù)信息。軟硬件動態(tài)鏈接過程根據(jù)劃分結(jié)果為函數(shù)選擇一種執(zhí)行位置(要么在微處理器上,要在FPGA上),如果調(diào)用的是硬件函數(shù),則首先查詢可重構(gòu)資源管理器,若該硬件函數(shù)尚未配置,則需要進行動態(tài)重構(gòu),接著運行硬件加速器,最后將執(zhí)行結(jié)果寫入數(shù)據(jù)區(qū)域。
可重構(gòu)資源由可重構(gòu)資源管理器進行管理,它是一個設(shè)備驅(qū)動程序,負責(zé)與可編程器件配置控制器等硬件電路(可編程器件廠商一般在其開發(fā)板上提供了配置控制器)通信,管理可編程器件上硬件模塊的配置和運行。在這里主要是查詢所需的硬件模塊狀態(tài),進行相應(yīng)配置和更新記錄操作,包括控制硬件模塊配置,更新硬件模塊配置信息、狀態(tài)信息和運行信息,以及從預(yù)留地址空間中分配端口地址等,最后返回所分配的地址。
簡單開發(fā)過程本過程包含3DES和Hamming編碼的系統(tǒng),利用開發(fā)工具提供的支持。程序員使用了軟硬件協(xié)同函數(shù)庫中的tripleDES函數(shù),并輸入了待處理的數(shù)據(jù)和密碼。此時程序員并不知道(也無從知道)函數(shù)的執(zhí)行方式(硬件執(zhí)行還是軟件執(zhí)行),也不需要去了解硬件模塊上的寄存器的狀態(tài)、數(shù)目、類型和通信等細節(jié)。
以下為核心部分代碼 tri_des_encrypt(buf,buf,sizeof(buf),key,sizeof(key));//調(diào)用協(xié)同函數(shù)進行協(xié)同編程 for(int j=0,k=0;j<(sizeof(buf)/3)+1;j++,k+=3) { fh[j]=*((unsigned int*)(buf+k)); hamming_encode(&fh[j]); } for(int j=0,k=0;j<(sizeof(buf)/3)+1;j++,k+=3) { hamming_decode(&fh[j]); tmp=(unsigned int*)(buf+k); *tmp=fh[j]; } tri_des_decrypt(buf,buf,sizeof(buf),key,sizeof(key)); 程序運行過程中,根據(jù)動態(tài)軟硬件劃分的結(jié)果來執(zhí)行函數(shù)。
本發(fā)明是在軟硬件協(xié)同函數(shù)庫的基礎(chǔ)上實施的,軟硬件協(xié)同函數(shù)庫的實現(xiàn)步驟和實例如下 一種軟硬件協(xié)同函數(shù)庫的構(gòu)造方法,其特征在于, 所述的軟硬件協(xié)同函數(shù)庫包括多個軟硬件協(xié)同函數(shù),每一個軟硬件協(xié)同函數(shù)包括頭文件、具體函數(shù)實現(xiàn)文件和硬件配置文件; 在具體函數(shù)實現(xiàn)文件中構(gòu)造每一個具體函數(shù)的軟件函數(shù)實現(xiàn)和硬件接口代碼;在軟件函數(shù)實現(xiàn)和硬件接口代碼中設(shè)置檢測硬件函數(shù)執(zhí)行時間或軟件函數(shù)執(zhí)行時間的代碼; 在硬件配置文件具有通過硬件實現(xiàn)具體函數(shù)的硬件描述語言代碼; 在所述的頭文件中聲明多個具體函數(shù)的名稱和參數(shù)形式;為程序調(diào)用具體的軟件函數(shù)實現(xiàn)和硬件接口代碼提供統(tǒng)一的函數(shù)接口; 調(diào)用軟硬件協(xié)同函數(shù)時,在新建的程序文件中添加所需調(diào)用函數(shù)的頭文件;在新建的程序文件中采用函數(shù)名調(diào)用的方式,調(diào)用頭文件提供的統(tǒng)一函數(shù)接口;在程序編譯時采用動態(tài)編譯方式,在動態(tài)編譯過程中根據(jù)劃分算法選擇該函數(shù)是調(diào)用軟件函數(shù)實現(xiàn)或硬件接口代碼。
檢測硬件函數(shù)執(zhí)行時間或軟件函數(shù)執(zhí)行時間為使用系統(tǒng)運行環(huán)境導(dǎo)出函數(shù)來實現(xiàn)。
說明所述的劃分算法可以采用任意的算法來實現(xiàn),只要能實現(xiàn)選擇是軟件函數(shù)實現(xiàn)或硬件接口代碼的功能即可。比如,有一種算法,根據(jù)當(dāng)前硬件是否空閑來決定,當(dāng)硬件空閑時,選擇硬件實現(xiàn)即調(diào)用硬件接口代碼。
軟硬件協(xié)同函數(shù)庫設(shè)計的步驟為 首先為軟硬件協(xié)同函數(shù)聲明一個對外接口(頭文件中的函數(shù)聲明);頭文件如何聲明在具體例子中有體現(xiàn)。
1.以軟件編程方式實現(xiàn)函數(shù)的軟件部分,該部分為一般軟件描述方式。
2.硬件接口代碼的實現(xiàn)。硬件接口的標(biāo)識是在軟件接口標(biāo)識前面增加了hw_前綴,區(qū)別協(xié)同函數(shù)軟硬件的不同實現(xiàn)方式。
3.1從可重構(gòu)資源管理器獲取硬件模塊端地址。利用系統(tǒng)函數(shù)mmap函數(shù)進行物理地址(即獲取到的地址)映射成虛擬地址。
3.2函數(shù)庫包含一個init函數(shù),該函數(shù)將在main函數(shù)調(diào)用前得到執(zhí)行,它完成兩件事,一件是打開物理內(nèi)存設(shè)備文件,為地址映射提供文件描述符參數(shù);一件是調(diào)用dl_get_cfl_path函數(shù)獲得當(dāng)前軟硬協(xié)同函數(shù)庫的絕對路徑,該函數(shù)也是動態(tài)鏈接器為編程模型提供的接口,程序中值得注意的地方在于剛進入函數(shù)時調(diào)用三個系統(tǒng)導(dǎo)出函數(shù),可以自動測量和保存該硬件函數(shù)的執(zhí)行時間,對于軟件函數(shù)也有類似代碼。
3.3其中必須必須聲明一個執(zhí)行參數(shù)傳遞和計算的函數(shù),它獲得虛擬地址后就能與硬件通信。該函數(shù)執(zhí)行的都是一些對寄存器的讀寫工作(寄存器讀寫對硬件開發(fā)人員是熟知的過程),為了實現(xiàn)運行時應(yīng)用程序劃分改變,協(xié)同函數(shù)的指令在編譯時不能直接編譯進應(yīng)用程序的主文件,所以將軟硬件協(xié)同函數(shù)庫編譯成共享庫文件,即聲明在頭文件中。
3.4可重構(gòu)資源管理器負責(zé)管理可重構(gòu)資源,調(diào)度硬件加速器的配置與執(zhí)行,它是操作系統(tǒng)的一部分,作為內(nèi)核驅(qū)動開發(fā)。我們僅為它提供編程接口。(只提供接口) 將軟件實現(xiàn)代碼和硬件接口代碼封裝。封裝封裝的內(nèi)容為軟件實現(xiàn)代碼和硬件接口代碼。封裝打包具體實現(xiàn)為采用編譯命令對所寫好的.c文件(即3des.c)進行編譯(在linux系統(tǒng)中,編譯命令為gcc-fPIC-c*.c。Gcc-shared-wl,-soname,lib3des.so.l-o lib3des.so.1.0*.o,在其他系統(tǒng)中可以采用其他C的交叉編譯器進行編譯).通過編譯以后整個程序就被封裝打包好,可供用戶調(diào)用。用戶可以通過封裝好的統(tǒng)一接口進行調(diào)用硬件接口函數(shù),通過硬件配置文件,實現(xiàn)該功能的硬件部分。
硬件實現(xiàn)的配置文件是采用硬件描述語言實現(xiàn),通過硬件開發(fā)工具進行設(shè)置,具體實現(xiàn)由所需實現(xiàn)功能相關(guān)。
將軟件函數(shù)和硬件接口代碼封裝在一起,并與硬件實現(xiàn)方式的配置文件一起構(gòu)成軟硬件協(xié)同函數(shù),這樣即完成了一個軟硬件協(xié)同函數(shù)的建立。要建立成庫,則需多實現(xiàn)幾個軟硬件協(xié)同函數(shù)即可。
所述的軟硬件協(xié)同函數(shù)可以采用包含頭文件方式被其他程序調(diào)用,調(diào)用的步驟為 1.將軟硬件協(xié)同函數(shù)庫復(fù)制到開發(fā)工具的根目錄下; 2.在新建的程序文件中添加所需調(diào)用函數(shù)的頭文件; 3.在新建的程序文件中采用函數(shù)名調(diào)用的方式,調(diào)用頭文件提供的統(tǒng)一函數(shù)接口。
4.在程序編譯時采用動態(tài)編譯方式,由程序運行環(huán)境依據(jù)當(dāng)前情況選擇軟件或硬件實現(xiàn)部分。
本發(fā)明的提供的軟硬件協(xié)同函數(shù)庫的構(gòu)造方法,包括以下步驟 首先為軟硬件協(xié)同函數(shù)聲明一個對外接口(頭文件中的函數(shù)聲明);軟硬件協(xié)同函數(shù)是對同一功能的不同方式實現(xiàn)軟件函數(shù)的實現(xiàn)是以軟件編碼方式實現(xiàn),硬件的實現(xiàn)則是由硬件接口代碼和函數(shù)功能實現(xiàn)的硬件配置文件構(gòu)成;將軟件函數(shù)和硬件接口代碼封裝在一起,并與硬件實現(xiàn)方式的配置文件一起構(gòu)成軟硬件協(xié)同函數(shù),由多個軟硬件協(xié)同函數(shù),形成一個抽象的軟硬件協(xié)同函數(shù)庫;形成的函數(shù)庫可以在其他程序中調(diào)用。
定義了一個頭文件,在其中聲明了軟件函數(shù)和硬件接口函數(shù)提供一個統(tǒng)一的函數(shù)調(diào)用接口,以便于用戶調(diào)用。
1)在協(xié)同函數(shù)的實現(xiàn)部分,硬件接口的標(biāo)識是在軟件接口標(biāo)識前面增加了hw_前綴,區(qū)別協(xié)同函數(shù)軟硬件的不同實現(xiàn)方式,以便系統(tǒng)在運行時依據(jù)當(dāng)前運行情況選擇軟件或硬件實現(xiàn)部分 2)使用系統(tǒng)函數(shù)mmap將硬件模塊實現(xiàn)部分的物理地址映射為虛擬地址,以便在虛擬地址空間運行的硬件接口部分與硬件模塊的具體實現(xiàn)部分通信。
3)使用系統(tǒng)運行環(huán)境導(dǎo)出函數(shù)統(tǒng)計協(xié)同函數(shù)軟件實現(xiàn)或硬件實現(xiàn)的執(zhí)行時間,以便為系統(tǒng)選擇軟件或硬件實現(xiàn)提供決策信息。
4)聲明一個執(zhí)行參數(shù)傳遞和計算的函數(shù)用于在獲得虛擬地址后就能與硬件通信。
軟件實現(xiàn)部分和硬件實現(xiàn)的接口部分打包到同一個共享庫中,與硬件實現(xiàn)的配置文件共同組成一個完整的協(xié)同函數(shù)。由多個軟硬件協(xié)同函數(shù)組成軟硬件協(xié)同函數(shù)庫。
軟硬件協(xié)同函數(shù)庫設(shè)計的實施例1 本實例中,采用Eclipse開發(fā)工具進行設(shè)計,軟件實體代碼和硬件接口代碼最后都通過動態(tài)鏈接控制實現(xiàn)。動態(tài)鏈接控制主要是讀取動態(tài)軟硬件劃分的決策結(jié)果,將應(yīng)用程序中對抽象函數(shù)的調(diào)用映射到具體的軟件實體代碼或硬件接口代碼上。動態(tài)鏈接技術(shù)在軟件設(shè)計中早已廣泛應(yīng)用,高級程序設(shè)計語言也提供了相應(yīng)的語法結(jié)構(gòu),如C語言中的函數(shù)指針,C++中的虛函數(shù)等。對于不同的操作這里要鏈接的對象從外部看來無論軟件、硬件都體現(xiàn)為函數(shù)代碼,因為我們對外提供的是一個統(tǒng)一的接口。(每個操作都被看成函數(shù)代碼,這是C語言程序設(shè)計的一個主要思想) 首先給出一段DES的C程序代碼(可擴展為其他語言),通過決策機制軟硬件劃分算法,決定是采用封裝好的硬件函數(shù)和接口函數(shù)或者是采用.h和.c的軟件函數(shù)執(zhí)行。
本發(fā)明的操作過程是,任意一臺現(xiàn)今主流配置的電腦作為開發(fā)工具,Eclipse作為開發(fā)工具。用戶通過該開發(fā)工具進行嵌入式系統(tǒng)的設(shè)計,在開發(fā)過程中可以調(diào)用軟硬件協(xié)同函數(shù)庫。
第一步,開啟電腦。
第二步,打開Eclipse開發(fā)工具。
第三步,將軟硬件協(xié)同函數(shù)庫拷貝到開發(fā)工具的根目錄下,如“C:\Eclipse\”目錄下 第三步,新建軟件工程。
第四步,添加程序源文件,并調(diào)用3des.h。調(diào)用的代碼為 #include<3des.h> 第五步,編寫軟硬件協(xié)同函數(shù)庫測試函數(shù)。(測試函數(shù)主要是定義我所調(diào)用的函數(shù)所需要的數(shù)據(jù),并調(diào)用該函數(shù)) 如調(diào)用的函數(shù)為一個加法函數(shù)add(a,b),那么在頭文件已經(jīng)包含的情況下我的測試函數(shù)如下(這是一個標(biāo)準(zhǔn)的C語言程序) int main() int c,d,e; c=4; d=5; e=add(c,d);//調(diào)用該函數(shù) ….. 第六步,進行工程的動態(tài)編譯(動態(tài)編譯為軟件設(shè)計人員都熟知的過程)。
實例1 函數(shù)實現(xiàn)具體實例 3DES的實現(xiàn)過程 1.設(shè)置頭文件首先為3des函數(shù)聲明一個對外接口(為簡單起見,這里假設(shè)函數(shù)只包含3des的加密和解密函數(shù)),它包含在3des.h文件中,應(yīng)用程序包含此文件就能利用庫中函數(shù)實現(xiàn)完成編程;代碼如下 /*3des.h*/----頭文件名; #define ENCRYPT 0 #define DECRYPT 1 typedef enum bool{false,true}bool; extern bool tri_des_encrypt(char*Out,char*In,long datalen,const char*Key,int keylen);----定義加密函數(shù); extern bool tri_des decrypt(char*Out,char*In,long datalen,const char*Key,int keylen);---定義解密函數(shù); 在一個文件對應(yīng)具體函數(shù)的文件,具體函數(shù)如3des里面,同時包括軟件實現(xiàn)和硬件接口代碼。
整個函數(shù)庫就是一個文件。
2.軟件函數(shù)采用傳統(tǒng)的軟件方式實現(xiàn)(這里不詳述) 3.硬件接口代碼的實現(xiàn) 3.1 int hw_tri_des_encrypt(char*Out,char*In,long datalen,const char*Key,int keylen)函數(shù)即為接口函數(shù),關(guān)鍵代碼如下 bool hw_tri_des_encrypt(char*Out,char*In,long datalen,const char*Key,intkeylen) { …… TripleDES(true,*datain,k
,k[1],k[2],dataout);//該處為調(diào)用參數(shù)傳遞和計算函數(shù) } …… return true; } 3.2函數(shù)中包含一個init函數(shù),該函數(shù)將在main函數(shù)調(diào)用前得到執(zhí)行,它完成兩件事,一件是打開物理內(nèi)存設(shè)備文件,將物理地址映射成虛擬地址;一件是調(diào)用dl_get_cfl_path函數(shù)獲得當(dāng)前軟硬協(xié)同函數(shù)庫的絕對路徑,該函數(shù)也是動態(tài)鏈接器為編程模型提供的接口,在程序中值得注意的地方在于剛進入函數(shù)時調(diào)用了dl_update_time_front和dl_get_time函數(shù),在函數(shù)結(jié)尾時調(diào)用了dl_hw_update_time函數(shù),這些函數(shù)將自動測量和保存該硬件函數(shù)的執(zhí)行時間,對于軟件函數(shù)也有類似代碼.這些函數(shù)為系統(tǒng)函數(shù),用以給協(xié)同函數(shù)庫開發(fā)人員提供相關(guān)信息。(以上三個函數(shù)為系統(tǒng)函數(shù)可以直接調(diào)用)關(guān)鍵代碼如下 static void init() { now=&dl_get_time;//保存系統(tǒng)當(dāng)前時間 upstime=&dl_sw_update_time;//保存軟件部分執(zhí)行時間 uphtime=&dl_hw_update_time;//保存硬件部分執(zhí)行時間 …… base_addr=mmap(0,XPAR_TRIPLEDES_0_HIGHADDR- XPAR_TRIPLEDES_0_BASEADDR,PROT_READ|PROT_WRITE,MAP_SHARED,fd,XPAR_TRIPLEDES_0 _BASEADDR);//將物理地址映射成虛擬地址 …… return; } 3.3TripleDES為執(zhí)行參數(shù)傳遞和計算的函數(shù),它獲得虛擬地址后就能與硬件通信。該函數(shù)執(zhí)行的都是一些對寄存器的讀寫工作,這是因為當(dāng)前3DES硬件實現(xiàn)與總線接口要通過IPIF為一個專(IPIF為專用名詞,它是總線與IP核相連的接口),使用IPIF提供的寄存器通信,這些寄存器的基地址與參數(shù)base_addr(在上面程序中提到該參數(shù))對應(yīng)的物理地址相同。為了實現(xiàn)運行時應(yīng)用程序劃分改變,協(xié)同函數(shù)的指令在編譯時不能直接編譯進應(yīng)用程序的主文件,所以將軟硬件協(xié)同函數(shù)庫編譯成共享庫文件,即聲明在3des.h中。該過程使用過硬件開發(fā)工具的設(shè)計人員熟知,因此不再詳述。
3.4可重構(gòu)資源管理器負責(zé)管理可重構(gòu)資源,調(diào)度硬件加速器的配置與執(zhí)行,是操作系統(tǒng)的一部分,作為內(nèi)核驅(qū)動開發(fā)。因此我們?yōu)槠涮峁┝说木幊探涌谌缫韵麓a所示。(通過該部分提高硬件函數(shù)的加速,我們僅提供接口具體實現(xiàn)由硬件設(shè)計人員設(shè)計) typedef struct address_range { unsigned long base; unsighed long high; } address_range;//地址范圍 address_range*configure(char*cfl_path,char*cf_relative_path,address_range* phy_address,address_range*ret_bal);//配置資源 int deconfigure(address_range*phy_address);//釋放資源 void clean_config_info();//清除設(shè)置 5.利用編譯命令對所寫好的.c文件包含了軟件函數(shù)和硬件接口代碼(即3des.c)進行編譯(在linux系統(tǒng)中編譯命令為gcc-fPIC-c*.c Gcc-shared-wl,-soname,lib3des.so.l-o lib3des.so.1.0*.o,在其他系統(tǒng)中可以采用其他C的交叉編譯器進行編譯)。
6.硬件實現(xiàn)的配置文件采用傳統(tǒng)的硬件開發(fā)工具如EDK等實現(xiàn)(這里不再詳細敘述) 7.將這編譯好的文件和硬件配置文件,保存到函數(shù)庫文件夾即可。
軟硬件系統(tǒng)函數(shù)庫調(diào)用實例該測試程序保存為3destest.c #include<stdio.h> #include<stdlib.h> #include<string.h> #include<memory.h> #include″3des.h″//該處為調(diào)用頭文件 int main(int argc,char*argv[]) { ……//前面都是一些函數(shù)加密的參數(shù)設(shè)置 tri_des_encrypt(buf,buf,sizeof(str),key,sizeof(key));//該處為調(diào)用協(xié)同函數(shù)庫中加密函數(shù)的統(tǒng)一對外接口 ……//這里都是一些函數(shù)解密的參數(shù)設(shè)置 tri_des_decrypt(buf,buf,sizeof(str),key,sizeof(key));//該處為調(diào)用協(xié)同函數(shù)庫中解密函數(shù)的統(tǒng)一對外接口 …… return 0; } 調(diào)用算法的自然語言描述為 如果該函數(shù)滿足硬件實施的條件(具體由劃分算法的標(biāo)準(zhǔn)確定) 則采用以下語句調(diào)用硬件實現(xiàn) hw_tri_des_encrypt(char*Out,char*In,long datal en,const char*Key,intkeylen); 否則,則采用以下語句調(diào)用軟件函數(shù) DES(char Out[8],char In[8],const PSubKey pSubKey,bool Type);。
考慮硬件預(yù)配置因素的動態(tài)軟硬件劃分方法的實施例1 考慮硬件預(yù)配置因素的動態(tài)軟硬件劃分方法,其流程圖見圖7. 算法性能測評 使用C語言描述我們提出的過程級軟硬件劃分算法。由于實際已有的軟硬件劃分算法大多采用進程作為劃分單位,或采用基本塊(指令級劃分),而本發(fā)明提出的是在過程級進行軟硬件劃分,以自定義的軟硬件抽象函數(shù)為劃分對象,與這些算法難以直接進行比較實驗。所以本文考慮平臺的特點,設(shè)計了以下三種方法來評估本文算法的性能,一個是無動態(tài)重構(gòu)支持;二是加入部分動態(tài)可重構(gòu)后的劃分;三是引入預(yù)配置后的劃分。三種方法都使用JPEG編碼系統(tǒng)進行驗證。
仿真或?qū)嶒灡砻鳠o動態(tài)重構(gòu)支持的軟硬件劃分性能最差,動態(tài)重構(gòu)下的劃分性能比前者提高了9.93%。引入預(yù)配置后,過程級軟硬件劃分的性能比無動態(tài)重構(gòu)支持的劃分提高了18.44%,比動態(tài)重構(gòu)下的劃分提高了9.45%。實驗表明,隨著可重構(gòu)資源利用效率的不斷提高,過程級軟硬件劃分的優(yōu)勢將更為明顯。
一種考慮硬件預(yù)配置因素的動態(tài)軟硬件劃分方法,其特征在于,在程序運行過程中,在可重構(gòu)硬件資源上已配置一個或多個函數(shù),對待劃分函數(shù)維護一個待劃分函數(shù)列表list(f1,…,fm),其中fk為硬件加速比,k為待劃分的一個函數(shù);k=1,…,m,m為待劃分函數(shù)個數(shù)
F對應(yīng)待劃分函數(shù)的集合;Ck為函數(shù)k被調(diào)用的次數(shù),Timeswk為函數(shù)k的軟件執(zhí)行時間;
為0時表示函數(shù)k當(dāng)前劃分為硬件,反之表示函數(shù)k當(dāng)前為軟件;Trfk對應(yīng)函數(shù)k的硬件實現(xiàn)函數(shù)的配置時間;Timehwk為函數(shù)k的硬件執(zhí)行時間;Commk為函數(shù)k的硬件實現(xiàn)函數(shù)的軟硬件通信代價,為硬件與軟件的參數(shù)傳遞時間(可以用傳統(tǒng)的仿真工具仿真出來,函數(shù)的軟件執(zhí)行時間可以由系統(tǒng)中統(tǒng)計函數(shù)執(zhí)行時間的函數(shù)得到); 3DES加密函數(shù)和解密函數(shù)使用一個硬件加速器,配置時間為Commk=9.40E-05s;Hamming編碼函數(shù)和解碼函數(shù)使用另一個加速器,
Commk=7.6E-06s對于一個復(fù)雜的嵌入式系統(tǒng),一次運行可能調(diào)用,這些函數(shù)上千次以上,所以Ck設(shè)為2000,根據(jù)以上參數(shù)可以算出3DES的f=2.07,Hamming編碼的f=0.01。
測試?yán)龑嶒炌瑫r運行兩項任務(wù),3DES加密函數(shù)和解密函數(shù)使用一個硬件加速器,配置時間為3.0179526s,Hamming編碼函數(shù)和解碼函數(shù)使用另一個加速器,配置時間為2.3684901秒,分別測試它們對1K或1M數(shù)據(jù)進行處理,在不同配置下程序所消耗的時間,其中static表示程序運行時加速器已經(jīng)靜態(tài)配置完畢,而dynamic表示加速器將在程序運行時動態(tài)配置;all software表示上四個函數(shù)執(zhí)行方式為純軟件執(zhí)行,all hardware為純硬件執(zhí)行,3des hardware表示3DES加/解密函數(shù)用純硬件執(zhí)行,而hamming編/解碼則用純軟件執(zhí)行,hamming hardware則正好相反,random hardware表示這四個函數(shù)的執(zhí)行方式是隨機的,這五個不同的配置可以通過替換劃分算法庫來實現(xiàn)。
由于軟件執(zhí)行速度慢,從而導(dǎo)致動態(tài)重構(gòu)情況下全軟件實現(xiàn)模式性能最差。3DES的軟硬件實現(xiàn)是影響程序性能的關(guān)鍵,在處理的數(shù)據(jù)較大的情況下,只將它動態(tài)劃分到硬件實現(xiàn),取得幾乎與靜態(tài)配置同樣高的性能,比純軟件實現(xiàn)至少快一個數(shù)量級,這是因為①3DES的加速比和執(zhí)行時間比Hamming更大;②3DES配置時間與運行時間比可以忽略。
權(quán)利要求
1.一種過程級軟硬件協(xié)同設(shè)計自動化開發(fā)方法,其特征在于,包括以下步驟
步驟A利用高級語言完成系統(tǒng)功能描述,系統(tǒng)功能描述中包括軟硬件協(xié)同函數(shù)的調(diào)用,所有的軟硬件協(xié)同函數(shù)都放置在同一個軟硬件協(xié)同函數(shù)庫中;
步驟B軟硬件函數(shù)的動態(tài)劃分在程序運行時,采用動態(tài)軟硬件劃分方法對程序調(diào)用的軟硬件協(xié)同函數(shù)進行劃分,即確定具體的軟硬件協(xié)同函數(shù)將要采用軟件實現(xiàn)還是硬件實現(xiàn);
步驟C鏈接和執(zhí)行步驟動態(tài)鏈接器根據(jù)動態(tài)軟硬件劃分方法的劃分結(jié)果,對具體的函數(shù)進行鏈接,對于采用軟件實現(xiàn)的函數(shù);就將該采用軟件實現(xiàn)的函數(shù)翻譯為軟件指令交給中央處理器執(zhí)行;對于采用硬件實現(xiàn)的函數(shù),則調(diào)用硬件實現(xiàn)的函數(shù)的配置文件,配置可重構(gòu)資源并執(zhí)行該硬件實現(xiàn)的函數(shù);
步驟D判斷和結(jié)束步驟;判斷是否所有的函數(shù)執(zhí)行完畢,如果執(zhí)行完畢就結(jié)束,否則返回用于劃分的參數(shù)到步驟B進入下一次循環(huán);所述的函數(shù)包括軟硬件協(xié)同函數(shù)和非軟硬件協(xié)同函數(shù),非軟硬件協(xié)同函數(shù)即普通函數(shù)。
2.根據(jù)權(quán)利要求1所述的過程級軟硬件協(xié)同設(shè)計自動化開發(fā)方法,其特征在于,
所述的動態(tài)連接器具體完成以下4個任務(wù)
第一個任務(wù)是將當(dāng)前函數(shù)區(qū)分成軟硬件協(xié)同函數(shù)和普通函數(shù)定義一個用于存放軟硬件協(xié)同函數(shù)庫的路徑的環(huán)境變量,程序運行時,對于程序調(diào)用的當(dāng)前函數(shù),取出該當(dāng)前函數(shù)的鏈接映射(link_map)中的存放調(diào)用來源的變量值(l_origin),將存放調(diào)用來源的變量值(l_origin)與環(huán)境變量的值比較,如果相同,則確定該當(dāng)前函數(shù)為軟硬件協(xié)同函數(shù);否則,為普通函數(shù);
第二個任務(wù)是檢測當(dāng)前調(diào)用的函數(shù)是否為軟硬件協(xié)同函數(shù),如果是,則將用于決定即將執(zhí)行函數(shù)的地址的變量(GOT)值修改為軟硬件協(xié)同函數(shù)庫中具體函數(shù)的入口地址,用于進行協(xié)同函數(shù)庫的訪問,如果不是,則調(diào)用elf_machine_fixup_plt函數(shù),elf_machine_fixup_plt函數(shù)的作用為定位普通函數(shù)執(zhí)行方式的地址;
第三個任務(wù)是給軟硬件協(xié)同函數(shù)庫提供注冊接口,為動態(tài)軟硬件劃分方法提供反饋的性能參數(shù),所述的性能參數(shù)包括當(dāng)前函數(shù)的結(jié)束時間、軟/硬件運行時間、軟/硬件調(diào)用次數(shù)、本軟硬件協(xié)同函數(shù)的軟/硬件總運行時間以及記錄所有軟硬件協(xié)同函數(shù)的軟/硬件總運行時間的變量;
第四個任務(wù)是使編譯后的可執(zhí)行文件使用修改后的動態(tài)鏈接器,具體為將操作系統(tǒng)鏈接(link_os_linux)和linux操作系統(tǒng)中的gnu鏈接改成動態(tài)鏈接器的絕對路徑。
3.根據(jù)權(quán)利要求1所述的過程級軟硬件協(xié)同設(shè)計自動化開發(fā)方法,其特征在于,所述的軟硬件協(xié)同函數(shù)庫的構(gòu)造方法為
所述的軟硬件協(xié)同函數(shù)庫包括多個軟硬件協(xié)同函數(shù),每一個軟硬件協(xié)同函數(shù)包括頭文件、具體函數(shù)實現(xiàn)文件和硬件配置文件;
在具體函數(shù)實現(xiàn)文件中構(gòu)造每一個具體函數(shù)的軟件函數(shù)實現(xiàn)和硬件接口代碼;在軟件函數(shù)實現(xiàn)和硬件接口代碼中設(shè)置檢測硬件函數(shù)執(zhí)行時間或軟件函數(shù)執(zhí)行時間的代碼;
在硬件配置文件具有通過硬件實現(xiàn)具體函數(shù)的硬件描述語言代碼;
在所述的頭文件中聲明多個具體函數(shù)的名稱和參數(shù)形式;為程序調(diào)用具體的軟件函數(shù)實現(xiàn)和硬件接口代碼提供統(tǒng)一的函數(shù)接口;
調(diào)用軟硬件協(xié)同函數(shù)時,在新建的程序文件中添加所需調(diào)用函數(shù)的頭文件;在新建的程序文件中采用函數(shù)名調(diào)用的方式,調(diào)用頭文件提供的統(tǒng)一函數(shù)接口;在程序編譯時采用動態(tài)編譯方式,在動態(tài)編譯過程中根據(jù)劃分算法選擇該函數(shù)是調(diào)用軟件函數(shù)實現(xiàn)或硬件接口代碼;
檢測硬件函數(shù)執(zhí)行時間或軟件函數(shù)執(zhí)行時間為使用系統(tǒng)運行環(huán)境導(dǎo)出函數(shù)來實現(xiàn)。
4.根據(jù)權(quán)利要求1~3任一項所述的過程級軟硬件協(xié)同設(shè)計自動化開發(fā)方法,其特征在于,所述的動態(tài)軟硬件劃分方法為分支界定算法或貪婪算法或考慮硬件預(yù)配置因素的動態(tài)軟硬件劃分方法,所述的考慮硬件預(yù)配置因素的動態(tài)軟硬件劃分方法具體為
在程序運行過程中,進行動態(tài)的軟硬件劃分,在可重構(gòu)硬件資源上進行一個或多個函數(shù)的配置,對待劃分函數(shù)維護一個待劃分函數(shù)列表list(f1,…,fm),其中fk為硬件加速比,k為待劃分的一個函數(shù);k=1,…,m,m為待劃分函數(shù)個數(shù),硬件加速比定義為F對應(yīng)待劃分函數(shù)的集合;Ck為函數(shù)k在程序運行過程中被調(diào)用的次數(shù),Timeswk為函數(shù)k的軟件執(zhí)行時間;
為0時表示函數(shù)k當(dāng)前劃分為硬件,反之表示函數(shù)k當(dāng)前為軟件;Trfk對應(yīng)函數(shù)k的硬件實現(xiàn)函數(shù)的配置時間;Timehwk為函數(shù)k的硬件執(zhí)行時間;Commk為函數(shù)k的硬件實現(xiàn)函數(shù)的軟硬件通信代價,為硬件與軟件的參數(shù)傳遞時間;
具體劃分步驟如下
步驟1從列表list(f1,…,fm)中選出最大值fi;
步驟2如果fi已經(jīng)被劃分為硬件,則從列表中刪除fi,更新列表,返回步驟1,否則,進入下一步;
步驟3檢測當(dāng)前的可重構(gòu)資源是否足夠,是則將函數(shù)i劃分為硬件,并配置到可重構(gòu)資源上,從列表中刪除fi,更新列表,返回步驟1;
否則,進入下一步;
步驟4fi與fj比較,fj為函數(shù)j的硬件加速比,函數(shù)j為已經(jīng)配置在可重構(gòu)資源上的函數(shù)中的一個函數(shù),且在所有的已經(jīng)配置在可重構(gòu)資源上的函數(shù)中,函數(shù)j所對應(yīng)的加速比最?。蝗绻鹒i大于fj,則將函數(shù)j劃分為軟件,從可重構(gòu)資源中刪除函數(shù)j,返回步驟3;如果fi小于fj,則進入步驟4.1;
步驟4.1檢測list是否為空,不空,則保存本次劃分結(jié)果,結(jié)束;如果是空,則計算關(guān)系矩陣Cst,選出該關(guān)系矩陣Cst中最大值元素cst,將cst對應(yīng)的函數(shù)t加入到待劃分函數(shù)列表list(f1,…,fm)中更新待劃分函數(shù)列表list(f1,…,fm),進入步驟4.2;
所述的Cst記錄函數(shù)調(diào)用次序信息,關(guān)系矩陣Cst為m*N個元素,N為m個待劃分的函數(shù)可能調(diào)用的所有函數(shù)的個數(shù);s元素表示當(dāng)前劃分的所有函數(shù),元素cij表示函數(shù)i被調(diào)用后立刻就調(diào)用了函數(shù)j的次數(shù)。
全文摘要
本發(fā)明提供了一種過程級軟硬件協(xié)同設(shè)計自動化開發(fā)方法,其特征在于,包括以下步驟步驟1利用高級語言完成系統(tǒng)功能描述,系統(tǒng)功能描述中包括軟硬件協(xié)同函數(shù)的調(diào)用;步驟2軟硬件函數(shù)的動態(tài)劃分;步驟3鏈接和執(zhí)行步驟;步驟4判斷和結(jié)束步驟;判斷是否所有的函數(shù)執(zhí)行完畢,如果執(zhí)行完畢就結(jié)束,否則返回用于劃分的參數(shù)到步驟2進入下一次循環(huán)。本發(fā)明使用過程級軟硬件統(tǒng)一編程模型,來屏蔽底層硬件實現(xiàn)的差異,達到可重構(gòu)器件對程序用戶透明的目的。該編程模型將硬件加速器封裝成C語言函數(shù),方便用戶編程,且支持運行時的動態(tài)軟硬件劃分,使劃分對程序員透明,提高了可重構(gòu)資源的利用率。
文檔編號G06F9/44GK101763265SQ20101002208
公開日2010年6月30日 申請日期2010年1月19日 優(yōu)先權(quán)日2010年1月19日
發(fā)明者李仁發(fā), 陳宇, 徐成, 吳強, 劉彥, 朱海, 袁虎, 鐘俊, 劉滔, 鄺繼順, 李蕊, 李肯立, 羅娟, 趙歡, 楊科華, 任小西, 楊書凡, 彭日光, 李春江, 黃瑜臣, 張維, 李浪 申請人:湖南大學(xué)