李浩 關冰
(1.中國運載火箭技術研究院,北京 100076;2.北京時代民芯科技有限公司,北京 100076)
現代工業過程中需要實現對數據的精確采集,包括溫度、壓力、電壓等,數據種類多,采集頻率高[1]。傳統的工業數據采集硬件一般基于單片機處理器,軟件基于裸機“主函數+中斷”架構,該架構模塊間耦合比較嚴重,可靠性不夠高[2];所有的業務邏輯集中在主函數中,對一些關鍵指令的響應不夠及時,實時性不夠強;在完成軟件設計后如果需要更改設計,需要對軟件邏輯進行結構重組,擴展性不夠高。因此,本文采用“dsp+fpga”的硬件架構,基于sysbios實時操作系統進行軟件設計,提高軟件可靠性、實時性及擴展性,滿足數據采用及處理的系統需求。
數據采樣及處理軟件需要完成電壓、溫度、壓力等模擬量的數據采集,并進行a/d轉換和數據處理,并將處理結果發送給上位機,數據采樣的種類不少于10種類,采樣的頻率范圍為1hz-1khz。本文面向上述數據采樣和處理的需求,開展系統方案設計。
為了完成上述數據采樣及處理的功能要求,本文設計了“dsp+fpga”的硬件系統框架,具體架構如圖1所示。Tms320c6678是ti公司的一款多核處理器芯片,片內集成8個c66x內核[3],本系統中作為主控制器,主要完成數據的數據和發送,掛接一路網口用于與上位機監控軟件通信。Kintex-7是xilinx公司的一款高性能fpga芯片,擁有大量的可編程資源[4],在本系統中作為協控器,主要完成數據的采集和a/d數據轉換。

圖1 硬件架構設計Fig.1 Hardware architecture design
Sysbios是ti設計的一款嵌入式實時操作系統(rtos)的內核,它能夠滿足應用程序實時調度和同步的需求,幫助用戶高效地利用內存和cpu[5]。Sysbios的主要功能如下:
(1)提供配置錯誤檢查和調試檢測模塊;
(2)提供了硬件中斷,軟件中斷,任務,后臺線程等多線程服務;
(3)提供動態內存管理服務;
(4)提供完全使用C語言編寫的中斷服務函數;
(5)提供靜態配置和動態配置服務。
本文采用層次化及模塊化的設計思路設計數據采樣處理軟件,主要措施如下:將功能相關、耦合性強的函數歸類,每一類作為一個集合劃分為一個單獨的模塊,每一個模塊用一個獨立的源文件和頭文件表示;將若干功能相近、接口類似的模塊歸類,每一類作為一個集合劃分為一個單獨的層次,每一個層次放置在一個文件夾中。采用分層架構設計,基于“剝離”策略將不同功能的代碼分離,實現每層功能的高內聚,各層功能的低耦合;采用通用模塊化設計,每一層由若干子模塊組成,通過不同模塊的組合調用滿足多任務的使用需求。
整個軟件從結構上分為四層:第一層為應用層,主要完成數據的采集、處理和發送,由數據采集中斷、數據預處理任務、數據細處理任務及數據發送任務組成;第二層是服務層,主要提供一些用于數據采樣處理的服務支撐功能,由宏定義、數據結構、內存讀取、協議校驗、組幀通信等模塊組成;第三次是內核層,主要提供實時操作系統內核功能,由sysbios的task、hwi、swi、clock、semaphore、mailbox、mutex等模塊組成;第四次是硬件支撐層,主要提供硬件底層驅動,主要由定時器、時間戳、flash、ddr、boot及以太網等模塊組成。軟件分層結構示意圖如圖2所示。

圖2 軟件分層架構Fig.2 Software hierarchical architecture
與非實時操作系統的時間片輪轉調度不同,sysbios實時操作系統的多線程調度采用搶占式調度方法,即根據線程的優先級決定將cpu的執行權分配給哪個線程,sysbios系統中斷的優先級要高于任務,任務的優先級數字越高表示任務的優先級越高。優先級高的中斷線程能夠搶占優先級低的中斷線程,優先級高的任務線程能夠搶 占優先級低的任務線程,硬件中斷線程能夠搶占任務線程[6]。sysbios的任務有4個狀態,每個狀態在一定的條件下可以進行轉移,詳見圖3。

圖3 任務狀態轉移表Fig.3 Task state transition table
本文采用數據采集、數據處理及數據發送在獨立的任務中運行的方式,其中數據處理又分為數據預處理和數據細處理,設計3個任務和1個中斷用于完成上述功能,其中數據采集中斷負責響應硬件中斷和采集中斷數據,數據預處理任務負責完成耗時較短的數據處理,數據細處理任務負責完成耗時較長的數據處理,數據處理結果發送任務負責完成數據處理后的結果報送。各線程的棧大小及優先級設置如表1所示。

表1 多線程優先級及堆棧設計Tab.1 Multithreading priority and stack design
郵箱是sysbios線程間通信的方式之一,與信號量相比,郵箱除了可以完成線程間的同步外,還可以在郵箱之間增加數據緩沖區用于線程間同步數據傳輸。本文設計了3個郵箱,用于3個任務和1個中斷之間的流程同步和數據傳輸,具體內容如表2所示。

表2 多線程同步方式設計Table 2 Design of multithread synchronization mode
軟件多線程流程如圖4所示,其中數據采集中斷收到中斷信號后,采集中斷中的源數據,對源數據的類型進行判斷,將源數據放置在郵箱,根據數據類型,調用mailbox_post將未處理的采樣數據發送到數據預處理任務或數據細處理任務;數據預處理任務循環調用mailbox_pend來等待消息郵箱中的消息,如果等到了則進行數據的預處理,預處理的任務不能包含task_sleep、semaphore_pend等會導致任務掛起的函數,不能執行耗時超過10ms的數據處理算法,數據處理結束后將結果標記為預處理結果,然后調用mailbox_post將處理后的數據發送到數據發送任務中;數據細處理任務循環調用mailbox_pend來等待消息郵箱中的消息,如果等到了則進行數據的細處理,細處理任務可以包含task_sleep、semaphore_pend等會導致任務掛起的函數,可以調用耗時超過10ms的數據處理算法,數據處理結束后將結果標記為細處理結果,然后調用mailbox_post將處理后的數據發送到數據發送任務中;數據發送任務循環調用mailbox_pend來等待消息郵箱中的消息,如果等到了則判斷郵箱中的數據來自哪個任務,根據不同的任務源對數據進行組幀,最后將數據通過以太網總線向目的地址發送。如此便構成了一個完成的數據采集、處理及發送的多線程信息流過程。

圖4 軟件多線程處理流程Fig.4 Software multithreading process
通過該多線程結構,可以使得中斷服務程序的運行時間大大縮短,增強了整個中斷機制的實時性,不需要設置中斷嵌套便能實現各種頻率的數據完整采集,簡化了中斷處理設計的流程。
本文將軟件固化到c6678處理器中,并進行數據采集處理試驗,并將試驗結果發送到上位機進行顯示,主要包括電壓、溫度、壓力及振動傳感器數據,界面顯示結果正常,軟件監控數據類型如表3所示,對存儲的數據進行分析未發生丟幀現象。

表3 軟件監控數據類型Tab.3 Software monitoring data type
本文給出了基于sysbios的數據采集處理軟件設計方案,并成功在“dsp+fpga”硬件系統上實現了分層架構設計、多線程并發調度,與傳統的“中斷+主循環”方式比實時性更高、擴展性更強、可靠性更改。本方法具備一定的通用性和實用性,可在類似工程項目中參考使用。