我使用ch365 做的 一塊 d/a 卡,工作模式 純PCI 本地地址模式 (D4=1;); 實測的單字節(jié)do 速度平均才120k次/s,(在軟件循環(huán)中循環(huán)N次單字節(jié) do操作 / N次單字節(jié) do操作 所耗費的時間),軟件的循環(huán)中未做其他任何耗時操作(幾乎不占用cpu 時間);
截取測試 代碼片段如下:
#define _outp_Pci(Do_Value) nPCI1006_Set_Do_Byte(Do_Value,iIndex); #define _inp_Pci() nPCI1006_Get_Di_Byte(iIndex);
#define _outpw_Pci(Do_Value) nPCI1006_Set_Do_Word(Do_Value,iIndex); #define _inpw_Pci() nPCI1006_Get_Di_Word(iIndex);
#define _outpd_Pci(Do_Value) nPCI1006_Set_Do_Dword(Do_Value,iIndex); #define _inpd_Pci() nPCI1006_Get_Di_Dword(iIndex);
//nPCI1006_Set_Do_Byte 就是 重新DDK 編譯過的驅(qū)動和DLL, 換了名字; //實際上就是 //BOOL WINAPI CH365mWriteIoByte( // 向I/O端口寫入一個字節(jié) // ULONG iIndex, // 指定CH365設(shè)備序號 // PVOID iAddr, // 指定I/O端口的地址 // UCHAR iByte ); // 待寫入的字節(jié)數(shù)據(jù) //其中 iAddr 是固定的; //Do_Value 同iByte ;
void __fastcall TfrmSpeedTest::btnIoTestClick(TObject *Sender) { UpgradeMrkThreadPriority(); //提高本線程優(yōu)先級
ULONG i=0;
ULONG time=GetTickCount();
long times_bak,times;
times_bak=times=StrToInt(Edit3->Text); //循環(huán)次數(shù); bool volH=true;
switch (Write_Mode) { case 1: while(times--) //byte //就是這個 { if(volH==true) _outp_Pci(0xff); else _outp_Pci(0x00); volH=!volH; } break; case 2: while(times--) //word { if(volH==true) _outpw_Pci(0xff); else _outpw_Pci(0x00); volH=!volH; } break; case 4: while(times--) //dword { if(volH==true) _outpd_Pci(0xff); else _outpd_Pci(0x00);
volH=!volH; } break; default: break; } ULONG time2=GetTickCount();
float cps_speed=(float)(times_bak * Write_Mode)*1000.0 /(float)(time2 -time);
Ed_Speed->Text=FloatToStr(cps_speed/1000.0); //顯示速度 LabSpeed->Caption="KByte/sec";
RestoreMrkThreadPriority(); //恢復(fù)本線程優(yōu)先級 return;
}
即使算上while()耗時,速度也應(yīng)該不會高于200k次/s; 修改與不修改 速度寄存器的 寫周期值,也沒有明顯的變化;
這是為什么??????
我很久之前做的另一塊卡是使用了 硬件重定位地址 的工作模式(D4=0),工作速度居然可以達到1.4M, 為什么目前這塊卡 (使用的 純PCI 本地地址模式)卻速度降了幾乎10倍?