我使用ch365 做的 一块 d/a 卡,工作模式 纯PCI 本地地址模式 (D4=1;); 实测的单字节do 速度平均才120k次/s,(在软件循环中循环N次单字节 do操作 / N次单字节 do操作 所耗费的时间),软件的循环中未做其他任何耗时操作(几乎不占用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 编译过的驱动和DLL, 换了名字; //实际上就是 //BOOL WINAPI CH365mWriteIoByte( // 向I/O端口写入一个字节 // ULONG iIndex, // 指定CH365设备序号 // PVOID iAddr, // 指定I/O端口的地址 // UCHAR iByte ); // 待写入的字节数据 //其中 iAddr 是固定的; //Do_Value 同iByte ;
void __fastcall TfrmSpeedTest::btnIoTestClick(TObject *Sender) { UpgradeMrkThreadPriority(); //提高本线程优先级
ULONG i=0;
ULONG time=GetTickCount();
long times_bak,times;
times_bak=times=StrToInt(Edit3->Text); //循环次数; 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(); //恢复本线程优先级 return;
}
即使算上while()耗时,速度也应该不会高于200k次/s; 修改与不修改 速度寄存器的 写周期值,也没有明显的变化;
这是为什么??????
我很久之前做的另一块卡是使用了 硬件重定位地址 的工作模式(D4=0),工作速度居然可以达到1.4M, 为什么目前这块卡 (使用的 纯PCI 本地地址模式)却速度降了几乎10倍?