李浩 關(guān)冰
(1.中國運載火箭技術(shù)研究院,北京 100076;2.北京時代民芯科技有限公司,北京 100076)
現(xiàn)代工業(yè)過程中需要實現(xiàn)對數(shù)據(jù)的精確采集,包括溫度、壓力、電壓等,數(shù)據(jù)種類多,采集頻率高[1]。傳統(tǒng)的工業(yè)數(shù)據(jù)采集硬件一般基于單片機處理器,軟件基于裸機“主函數(shù)+中斷”架構(gòu),該架構(gòu)模塊間耦合比較嚴(yán)重,可靠性不夠高[2];所有的業(yè)務(wù)邏輯集中在主函數(shù)中,對一些關(guān)鍵指令的響應(yīng)不夠及時,實時性不夠強;在完成軟件設(shè)計后如果需要更改設(shè)計,需要對軟件邏輯進(jìn)行結(jié)構(gòu)重組,擴展性不夠高。因此,本文采用“dsp+fpga”的硬件架構(gòu),基于sysbios實時操作系統(tǒng)進(jìn)行軟件設(shè)計,提高軟件可靠性、實時性及擴展性,滿足數(shù)據(jù)采用及處理的系統(tǒng)需求。
數(shù)據(jù)采樣及處理軟件需要完成電壓、溫度、壓力等模擬量的數(shù)據(jù)采集,并進(jìn)行a/d轉(zhuǎn)換和數(shù)據(jù)處理,并將處理結(jié)果發(fā)送給上位機,數(shù)據(jù)采樣的種類不少于10種類,采樣的頻率范圍為1hz-1khz。本文面向上述數(shù)據(jù)采樣和處理的需求,開展系統(tǒng)方案設(shè)計。
為了完成上述數(shù)據(jù)采樣及處理的功能要求,本文設(shè)計了“dsp+fpga”的硬件系統(tǒng)框架,具體架構(gòu)如圖1所示。Tms320c6678是ti公司的一款多核處理器芯片,片內(nèi)集成8個c66x內(nèi)核[3],本系統(tǒng)中作為主控制器,主要完成數(shù)據(jù)的數(shù)據(jù)和發(fā)送,掛接一路網(wǎng)口用于與上位機監(jiān)控軟件通信。Kintex-7是xilinx公司的一款高性能fpga芯片,擁有大量的可編程資源[4],在本系統(tǒng)中作為協(xié)控器,主要完成數(shù)據(jù)的采集和a/d數(shù)據(jù)轉(zhuǎn)換。
圖1 硬件架構(gòu)設(shè)計Fig.1 Hardware architecture design
Sysbios是ti設(shè)計的一款嵌入式實時操作系統(tǒng)(rtos)的內(nèi)核,它能夠滿足應(yīng)用程序?qū)崟r調(diào)度和同步的需求,幫助用戶高效地利用內(nèi)存和cpu[5]。Sysbios的主要功能如下:
(1)提供配置錯誤檢查和調(diào)試檢測模塊;
(2)提供了硬件中斷,軟件中斷,任務(wù),后臺線程等多線程服務(wù);
(3)提供動態(tài)內(nèi)存管理服務(wù);
(4)提供完全使用C語言編寫的中斷服務(wù)函數(shù);
(5)提供靜態(tài)配置和動態(tài)配置服務(wù)。
本文采用層次化及模塊化的設(shè)計思路設(shè)計數(shù)據(jù)采樣處理軟件,主要措施如下:將功能相關(guān)、耦合性強的函數(shù)歸類,每一類作為一個集合劃分為一個單獨的模塊,每一個模塊用一個獨立的源文件和頭文件表示;將若干功能相近、接口類似的模塊歸類,每一類作為一個集合劃分為一個單獨的層次,每一個層次放置在一個文件夾中。采用分層架構(gòu)設(shè)計,基于“剝離”策略將不同功能的代碼分離,實現(xiàn)每層功能的高內(nèi)聚,各層功能的低耦合;采用通用模塊化設(shè)計,每一層由若干子模塊組成,通過不同模塊的組合調(diào)用滿足多任務(wù)的使用需求。
整個軟件從結(jié)構(gòu)上分為四層:第一層為應(yīng)用層,主要完成數(shù)據(jù)的采集、處理和發(fā)送,由數(shù)據(jù)采集中斷、數(shù)據(jù)預(yù)處理任務(wù)、數(shù)據(jù)細(xì)處理任務(wù)及數(shù)據(jù)發(fā)送任務(wù)組成;第二層是服務(wù)層,主要提供一些用于數(shù)據(jù)采樣處理的服務(wù)支撐功能,由宏定義、數(shù)據(jù)結(jié)構(gòu)、內(nèi)存讀取、協(xié)議校驗、組幀通信等模塊組成;第三次是內(nèi)核層,主要提供實時操作系統(tǒng)內(nèi)核功能,由sysbios的task、hwi、swi、clock、semaphore、mailbox、mutex等模塊組成;第四次是硬件支撐層,主要提供硬件底層驅(qū)動,主要由定時器、時間戳、flash、ddr、boot及以太網(wǎng)等模塊組成。軟件分層結(jié)構(gòu)示意圖如圖2所示。
圖2 軟件分層架構(gòu)Fig.2 Software hierarchical architecture
與非實時操作系統(tǒng)的時間片輪轉(zhuǎn)調(diào)度不同,sysbios實時操作系統(tǒng)的多線程調(diào)度采用搶占式調(diào)度方法,即根據(jù)線程的優(yōu)先級決定將cpu的執(zhí)行權(quán)分配給哪個線程,sysbios系統(tǒng)中斷的優(yōu)先級要高于任務(wù),任務(wù)的優(yōu)先級數(shù)字越高表示任務(wù)的優(yōu)先級越高。優(yōu)先級高的中斷線程能夠搶占優(yōu)先級低的中斷線程,優(yōu)先級高的任務(wù)線程能夠搶 占優(yōu)先級低的任務(wù)線程,硬件中斷線程能夠搶占任務(wù)線程[6]。sysbios的任務(wù)有4個狀態(tài),每個狀態(tài)在一定的條件下可以進(jìn)行轉(zhuǎn)移,詳見圖3。
圖3 任務(wù)狀態(tài)轉(zhuǎn)移表Fig.3 Task state transition table
本文采用數(shù)據(jù)采集、數(shù)據(jù)處理及數(shù)據(jù)發(fā)送在獨立的任務(wù)中運行的方式,其中數(shù)據(jù)處理又分為數(shù)據(jù)預(yù)處理和數(shù)據(jù)細(xì)處理,設(shè)計3個任務(wù)和1個中斷用于完成上述功能,其中數(shù)據(jù)采集中斷負(fù)責(zé)響應(yīng)硬件中斷和采集中斷數(shù)據(jù),數(shù)據(jù)預(yù)處理任務(wù)負(fù)責(zé)完成耗時較短的數(shù)據(jù)處理,數(shù)據(jù)細(xì)處理任務(wù)負(fù)責(zé)完成耗時較長的數(shù)據(jù)處理,數(shù)據(jù)處理結(jié)果發(fā)送任務(wù)負(fù)責(zé)完成數(shù)據(jù)處理后的結(jié)果報送。各線程的棧大小及優(yōu)先級設(shè)置如表1所示。
表1 多線程優(yōu)先級及堆棧設(shè)計Tab.1 Multithreading priority and stack design
郵箱是sysbios線程間通信的方式之一,與信號量相比,郵箱除了可以完成線程間的同步外,還可以在郵箱之間增加數(shù)據(jù)緩沖區(qū)用于線程間同步數(shù)據(jù)傳輸。本文設(shè)計了3個郵箱,用于3個任務(wù)和1個中斷之間的流程同步和數(shù)據(jù)傳輸,具體內(nèi)容如表2所示。
表2 多線程同步方式設(shè)計Table 2 Design of multithread synchronization mode
軟件多線程流程如圖4所示,其中數(shù)據(jù)采集中斷收到中斷信號后,采集中斷中的源數(shù)據(jù),對源數(shù)據(jù)的類型進(jìn)行判斷,將源數(shù)據(jù)放置在郵箱,根據(jù)數(shù)據(jù)類型,調(diào)用mailbox_post將未處理的采樣數(shù)據(jù)發(fā)送到數(shù)據(jù)預(yù)處理任務(wù)或數(shù)據(jù)細(xì)處理任務(wù);數(shù)據(jù)預(yù)處理任務(wù)循環(huán)調(diào)用mailbox_pend來等待消息郵箱中的消息,如果等到了則進(jìn)行數(shù)據(jù)的預(yù)處理,預(yù)處理的任務(wù)不能包含task_sleep、semaphore_pend等會導(dǎo)致任務(wù)掛起的函數(shù),不能執(zhí)行耗時超過10ms的數(shù)據(jù)處理算法,數(shù)據(jù)處理結(jié)束后將結(jié)果標(biāo)記為預(yù)處理結(jié)果,然后調(diào)用mailbox_post將處理后的數(shù)據(jù)發(fā)送到數(shù)據(jù)發(fā)送任務(wù)中;數(shù)據(jù)細(xì)處理任務(wù)循環(huán)調(diào)用mailbox_pend來等待消息郵箱中的消息,如果等到了則進(jìn)行數(shù)據(jù)的細(xì)處理,細(xì)處理任務(wù)可以包含task_sleep、semaphore_pend等會導(dǎo)致任務(wù)掛起的函數(shù),可以調(diào)用耗時超過10ms的數(shù)據(jù)處理算法,數(shù)據(jù)處理結(jié)束后將結(jié)果標(biāo)記為細(xì)處理結(jié)果,然后調(diào)用mailbox_post將處理后的數(shù)據(jù)發(fā)送到數(shù)據(jù)發(fā)送任務(wù)中;數(shù)據(jù)發(fā)送任務(wù)循環(huán)調(diào)用mailbox_pend來等待消息郵箱中的消息,如果等到了則判斷郵箱中的數(shù)據(jù)來自哪個任務(wù),根據(jù)不同的任務(wù)源對數(shù)據(jù)進(jìn)行組幀,最后將數(shù)據(jù)通過以太網(wǎng)總線向目的地址發(fā)送。如此便構(gòu)成了一個完成的數(shù)據(jù)采集、處理及發(fā)送的多線程信息流過程。
圖4 軟件多線程處理流程Fig.4 Software multithreading process
通過該多線程結(jié)構(gòu),可以使得中斷服務(wù)程序的運行時間大大縮短,增強了整個中斷機制的實時性,不需要設(shè)置中斷嵌套便能實現(xiàn)各種頻率的數(shù)據(jù)完整采集,簡化了中斷處理設(shè)計的流程。
本文將軟件固化到c6678處理器中,并進(jìn)行數(shù)據(jù)采集處理試驗,并將試驗結(jié)果發(fā)送到上位機進(jìn)行顯示,主要包括電壓、溫度、壓力及振動傳感器數(shù)據(jù),界面顯示結(jié)果正常,軟件監(jiān)控數(shù)據(jù)類型如表3所示,對存儲的數(shù)據(jù)進(jìn)行分析未發(fā)生丟幀現(xiàn)象。
表3 軟件監(jiān)控數(shù)據(jù)類型Tab.3 Software monitoring data type
本文給出了基于sysbios的數(shù)據(jù)采集處理軟件設(shè)計方案,并成功在“dsp+fpga”硬件系統(tǒng)上實現(xiàn)了分層架構(gòu)設(shè)計、多線程并發(fā)調(diào)度,與傳統(tǒng)的“中斷+主循環(huán)”方式比實時性更高、擴展性更強、可靠性更改。本方法具備一定的通用性和實用性,可在類似工程項目中參考使用。