(華中科技大學 國家數控系統工程技術研究中心, 武漢 430074)
摘 要:主要研究Windows CE.NET下ARM9與DSP間通過HPI通信的驅動程序開發,該驅動程序通過中斷驅動模式控制數據的傳輸,以動態鏈接庫的形式包含到Windows CE.NET操作系統中。ARM9通過此驅動程序可方便地讀寫DSP的片內、片外存儲空間。在S3C2440A+TMS320C6713電路板上測得此驅動程序的數據傳輸速率可達100 Mbps,此研究對開發雙CPU的數控系統有一定參考價值。
關鍵詞:驅動程序; Windows CE.NET;主機接口; 數控系統
中圖分類號:TP336 文獻標志碼:A
文章編號:10013695(2009)03093603
Development of HPI device driver under Windows CE.NET
LI Zhengyi,TANG Xiaoqi
(National Numerical Control System Engineering Research Center, Huazhong University of Science Technology, Wuhan 430074, China)
Abstract:This paper mainly studied the hostport interface (HPI) device driver for the communication between ARM9 and DSP microprocessor under Windows CE.NET, it worked on the interruptdriven model and could be included into Windows CE.NET system in the form of dynamic link library. ARM9 could access the onchip and offchip memory storage filed of the DSP microprocessor through the HPI device driver quickly and the data transmission speed could reach 100 Mbps on the designed S3C2440A TMS320C6713 printed circuit board. For the design of double CPUs numerical control system, there is certain external meaning of using for reference.
Key words:device driver; Windows CE.NET; hostport interface(HPI); numerical control system
0 引言
在嵌入式數控系統開發中,為提高系統的性能和縮短系統開發周期,軟件開發上采用Windows CE.NET嵌入式實時操作系統,充分發揮了其繼承Windows操作系統圖形視窗的優點;控制主板設計上采用雙CPU結構,即基于RISC 體系的高性能ARM微處理器和浮點型高性能DSP微處理器。其中,ARM實現顯示和外部通信(如USB、以太網等);DSP負責數控系統的插補、速度控制等復雜計算。DSP與ARM之間通過HPI通信,ARM可由HPI訪問DSP片內、片外所有存儲空間,DSP在其內部則是通過硬件DMA完成數據傳輸[1],因此,HPI有較高的通信效率。文獻[2,3]中介紹了嵌入式Linux、VxWorks操作系統下的HPI驅動程序開發。與文獻[2,3]不同,本文研究嵌入式Windows CE.NET操作系統下的HPI驅動程序開發,同時設計了通過中斷信號控制HPI的通信,HPI驅動程序設計更完備。
本研究來源于高速、高精數控系統的研發,主要研究S3C2440A與TMS320C6713之間高速通信的實現。介紹了Windows CE.NET操作系統下S3C2440A與TMS320C6713之間通過HPI通信的流接口驅動程序的開發和在自主研發的雙CPU控制板上進行HPI通信的實驗結果。
1 HPI通信的硬件電路設計
在設計的基于S3C2440A+TMS320C6713的控制板中, S3C2440A與TMS320C6713之間由HPI通信,HPI電路主要為16位的數據、地址復用線和片選、讀寫控制線,兩片SN74CBTLV3383芯片控制HPI的16位數據、地址總線的導通,如圖1所示。此控制板應用到數控系統中,S3C2440A完成數控系統的人機交互,TMS320C6713完成數控系統插補、速度控制等。S3C2440A首先從上位機(完成圖形設計)接收用戶需要加工的零件信息(如G代碼);然后由HPI將其傳送到TMS320C6713;最后由TMS320C6713對零件加工信息進行處理后控制伺服、I/O等,實現零件的加工。
2 HPI通信的讀寫設計
Windows CE.NET下的設備驅動程序多采用流接口驅動程序模型開發,流接口驅動程序提供一組標準的流接口函數供應用程序調用。編寫流接口驅動程序主要是實現這些流接口函數,而開發流接口函數首要是實現設備接口相關的寄存器的讀寫。在本文的HPI流接口驅動程序開發中,S3C2440A將TMS320C6713端的HPI看成其外接的一異步RAM存儲器來訪問。首先,定義HPI資源針對S3C2440A讀寫操作的物理地址空間,分析讀寫時序實現HPI寄存器級別的讀寫訪問:
#defineHPI_BASE0x20000000
//將HPI地址設定到S3C2440A的外部CS4存儲區間
typedefstruct {
shortHPI_HPIC_WL; //寫HPIC低16位
shortHPI_HPIC_WH;//寫HPIC高16位
shortHPI_HPID_AUTO_WL; //寫HPID低位
shortHPI_HPID_AUTO_WH; //寫HPID高位
…//讀寫HPI其他寄存器
}HPIreg;//定義HPI寄存器讀寫的結構體
static volatile HPIreg* v_pHPIregs;
v_pHPIregs=(volatileHPIreg*)HPI_RegAlloc((PVOID)(HPI_BASE >> 8), sizeof (HPIreg)); /*將HPI的物理地址映射到應用程序能訪問的虛擬地址空間。接著,根據HPI通信協議對這些HPI寄存器讀寫操作進行組合,實現HPI通信基本功能(如配置HPI通信方式等基本功能)*/
HPI通信方式的配置由S3C2440A讀寫HPI的控制寄存器( HPIC )的組合實現:
void HPIC_Write ( shortHPIC_data )
{ //向HPIC寫HPI通信配置命令
v_pHPIregs -> HPI_HPIC_WL = HPIC_data;
v_pHPIregs->HPI_HPIA_WH = HPIC_data;
}
long HPIC_Read (void)
{//從HPIC讀取目前HPI通信的狀態
long data, datah;
data = v_pHPIregs->HPI_HPIC_RL;
datah = v_pHPIregs->HPI_HPIC_RH;
data = (data 0xffff) + (datah<<16);
return (data);
}
類似可以實現HPI通信相關的其他基本功能:如讀取當前傳輸的數據、當前數據傳輸的目的地址等。最后,在實現HPI通信基本功能的基礎上就可以編寫Windows CE.NET 下的HPI通信流接口函數。以下是S3C2440A通過HPI對TMS320C6713端存儲空間中的數據進行讀取的流接口函數:
DWORD HPI_Read ( //HPI讀函數
DWORD hOpenContext,//設備的句柄
LPVOID pBuffer,//接收數據的指針
DWORD dwCount )//讀取的字節數
{
DWORD dwElementRead = 0;
long *dwReadData = (long *) pBuffer;
for ( dwElementRead = 0; dwElementRead dwReadData [ dwElementRead ] = HPID_AUTO_Read(); return (dwElementRead); } /*HPI_IOControl實現HPI通信初始化,設定讀寫的起始地址,向TMS320C6713發送控制命令等*/ BOOL HPI_IOControl ( DWORD hOpenContext, DWORD dwCode, DWORD *pBufIn, DWORD dwLenIn, DWORD *pBufOut, DWORDdwLenOut,DWORD* pdwActualOut) { case IOCTL_HPI_INITILIZE: //初始化HPI通信 if ( HPI_VirtualAlloc( ) ) { /*配置S3C2440A的CS4存儲空間讀寫參數,打開74CBTLV3383門電路,準備HPI通信*/ v_pMEMregs->rBWSCON = (v_pMEMregs-> rBWSCON) | (1<<18) | (0x01<<16); v_pMEMregs->rBANKCON4 = (0x10<<13) | (0x100<<8) | (0x11<<6); …… } 類似可實現與HPI通信有關的其他流接口函數:HPI_Init、HPI_Deinit、HPI_Open、HPI_Close、HPI_PowerUp、HPI_PowerDown、HPI_Read、HPI_Write和HPI_Seek。組合這些流接口函數,即可構建Windows CE.NET下HPI流接口驅動程序。 Windows CE.NET下完整的流接口驅動程序可由Windows CE.NET嵌入式系統開發工具Platform Builder開發并以動態鏈接庫(.dll)的形式添加到Windows CE.NET系統中[4]。編寫完整的流接口驅動程序首先需要.h和.cpp或.c文件實現對硬件設備讀寫的操作,即實現流接口函數;其次,需要編寫.def文件導出流接口函數;最后,通過.reg文件(Windows CE.NET操作系統的注冊表文件)實現驅動程序的配置和加載。具體實現時,首先在Platform Builder中建立一個.dll工程,包含上述文件,接著是編譯、調試,生成.dll形式的HPI驅動程序文件。為了將開發好的驅動程序添加到Windows CE.NET操作系統映像中需修改Windows CE.NET操作系統的platform.bib文件,添加如下代碼: MODULES xxx.dll$(_FLATRELEASEDIR)\\xxx.dllNK 即可將HPI驅動程序文件(xxx.dll)包含到生成的Windows CE.NET操作系統映像中。xxx.dll為編譯生成的HPI流接口驅動程序文件名。 最后,在Platform Builder中重新生成Windows CE .NET操作系統映像,將生成的操作系統映像下載到控制板上,在Windows CE.NET啟動時將自動加載此HPI驅動程序。這樣在S3C2440A端的應用程序中就可像讀寫文件系統中普通文件一樣用簡潔的代碼實現通過HPI訪問TMS320C6713端的存儲空間,實現S3C2440A與TMS320C6713之間的透明傳輸,應用程序可不涉及底層硬件操作。 以下是S3C2440A向TMS320C6713的存儲空間寫入數據的應用程序的例子: hDrv=CreateFile(L\"HPI1:\",//設備文件名 GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL); //打開HPI通信接口,準備HPI通信 WriteFile (hDrv, (LPVOID)WriteDataArray, dwWriting, dwWritten, NULL ) //實現通過HPI向TMS320C6713的存儲空間中寫入數據 類似可實現S3C2440A通過HPI讀取TMS320C6713存儲空間中的數據等功能。 3 HPI通信的中斷控制 HPI通信實驗是在自主研發的一塊包含S3C2440A和TMS320C6713的數控系統控制板上進行,控制板如圖2所示。 其中S3C2440A上運行Windows CE.NET 5.0實時操作系統,其中斷響應時間為1 ms[5,6]。在TMS320C6713上運行μC/OSΠ操作系統[7],配置TMS320C6713從外部flash存儲器啟動并加載應用程序。HPI通信時,數據傳輸由TMS320C6713的請求發起,當TMS320C6713處理完當前數據需要S3C2440A發送更多數據時,TMS320C6713通過寫HPIC寄存器的HINT位觸發ARM的一外部中斷信號[5],S3C2440A響應中斷向TMS320C6713發送其需要的數據。同樣,S3C2440A也由寫HPIC寄存器的DSPINT位來觸發TMS320C6713中斷,通知TMS320C6713可以開始處理數據了。S3C2440A端Windows CE.NET下HPI通信的中斷服務函數為: WORD HPI_IST(void *dat) { pData= (ISTData*)dat; g_KeypadISTData.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); //建立中斷關聯事件 InterruptInitialize(g_KeypadISTData.sysIntr, g_KeypadISTData.hEvent, NULL,0) //初始化中斷,將中斷觸發與特定事件建立對應關系 WaitForSingleObject(pData->hEvent, INFINITE); //等待中斷觸發 HandleIOCTL(IOCTL_HPI_HINT);//清除中斷信號觸發標志 If (HINT_Pin_Set( )) //判斷中斷信號是否有效 …… //具體的中斷處理 InterruptDone(pData->sysIntr);//處理完中斷 …… } 在TMS320C6713端的中斷處理程序為: HPIC_Temp = HPI_getDspint( ); if(HPIC_Temp) //判斷是否有中斷信號 { ……//具體的中斷處理 HPI_FSET(HPIC, DSPINT,1);//清除中斷標志 } …… HPI_FSET(HPIC, HINT, 1); //需要S3C2440發送更多數據時觸發S3C2440A的中斷 4 HPI通信速度測量 實驗中用Visual Studio 2005 編程工具開發HPI通信速度測量應用程序[8]。通過S3C2440A在發送數據前將其一位配置為輸出的I/O口置為高電平,發送完后立即將其置為低電平來測量Windows CE.NET 下的HPI驅動程序的數據傳輸速度。實驗中,S3C2440A分別發送1、2、4、8、16 KB數據塊到TMS320C6713片外SDRAM存儲器(MT48LC4M32B),用Tektronix 的TDS3032 示波器測量出各次數據塊傳輸時此I/O引腳輸出的脈沖寬度(時間),如圖3所示。縱坐標為數據塊傳輸需要的時間;橫坐標為重復測量的次數j(0≤j<12)。各個容量為ui(i=0,1,2,3,4;ui分別取1、2、4、8、16 KB)的數據塊的傳輸都重復做12次,記錄每次數據傳輸需要的時間tij。 根據圖3舍棄各個容量為ui的數據塊傳輸時間值tij中誤差最大的值,計算剩余的tij平均值t i: ti=1/j ∑nj=0tij(0<n<12;i=0,1,2,3,4;0<j<12)(1) 其中:tij表示傳輸第i個數據塊(ui)的第j次重復實驗時測量的傳輸時間。 為去除數據傳輸時間ti中系統其他功能執行的時間,采用差分式求HPI驅動程序的數據傳輸速度:即依次用第i+1個傳輸時間ti+1減去第i個傳輸時間ti作為第i個數據塊傳輸的有效時間Δti=ti+1-ti;用第i+1個數據塊(ui+1)減去第i個數據塊(ui)作為有效傳輸數據量Δui,則當前數據傳輸速度vi=Δui/Δti,如表1所示。計算出開發的Windows CE.NET下的HPI驅動程序的數據傳輸速度可達100 Mbps,能滿足數控系統設計的需要。 表1 數據傳輸速度計算表 數據/KB平均時間/ms有效數據/時間/ms速度/Mbps 125.050 0 225.386 71 KB/0.336 728.097 6 425.732 02 KB/0.345 354.795 5 826.012 54 KB/0.280 5134.908 4 1627.104 08 KB/1.091 569.339 1 5 結束語 本文研究了Windows CE.NET下的HPI驅動程序開發,在研制的雙CPU數控系統控制板上實現了S3C2440A與TMS320C6713之間的高速通信,為研發雙CPU的數控系統提供了參考。此技術應用到高速、高精數控系統中,能達到良好的效果。 參考文獻: [1]TI. TMS320C6000 DSP host port interface(HPI) reference guide[R].[S.l.]: Texas Instruments Corporation, 2004. [2]陳育林,張秦艷.基于ARM S3C2410與TMS320C6416的接口設計[J]. 測控技術,2006, 25(11):8082. [3]王彬,王冰峰.ARM與DSP的通信接口研究和設計要點[J].工業控制計算機, 2007,20(2):2324. [4]BOLLING D. Programming Microsoft Windows CE[R].Washington: Microsoft Press, 2003. [5]Samsung Electronics Co Ltd. S3C2440A 32bit CMOS microcontroller user’s manual[R]. [S.l.]:Samsung Electronics Press, 2004. [6]Microsoft Corp. Microsoft Windows CE.NET 5.0 help drive development[EB/OL].(20060201).[20070612].http://www.microsoft.com/en/us/default.aspx. [7]LABROSSE J J. MicroC/OSΠ the realtime kernel[R]. Kansas: CMP Media LLC Press, 2002. [8]GRATTAN N, BRAIN M. Windows CE 3.0 application programming[R]. [S.l.]: Prentice Hall PTR, 2000.