第一次發佈這樣有可能會是超過必要的信息,但我想徹底:C RS232通訊。如何比較CPU時間?
我們的一個用C練習是創建一個將與空調制解調器通過RS232串行通信交換數據發送方和接收程序。我們使用了一個虛擬端口程序(如果您想測試,我使用eltima軟件的虛擬串行端口的試用版)。我們需要做4個版本:
1)使用先前創建學生預定庫,有發送者和reveiver等預製功能 2)使用inportb和outportb功能 3)使用OS INT86中斷,給DEVCPP(流血):通過REGS工會 4)使用內聯組件
編譯器寄存器的值。
所有的工作,但現在我們需要的比較基準時花費發送和接收字符的CPU時間所有不同版本。它具體說,我們必須找到以下內容:
平均值,標準偏差,最小值,最大值和99.5%,在課堂上
沒有任何解釋,所以我在這裏有點丟失了......我米猜測那些是正態分佈的許多試驗後的統計數字?但即使如此,我如何真正測量CPU週期呢?我會繼續搜索,但是我在這裏發帖,因爲截止日期是3天:D。的INT86版本
代碼示例:
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#define RS232_INIT_FUNCTION 0
#define RS232_SEND_FUNCTION 1
#define RS232_GET_FUNCTION 2
#define RS232_STATUS_FUNCTION 3
#define DATA_READY 0x01
#define PARAM 0xEF
#define COM1 0
#define COM2 1
void rs232init (int port, unsigned init_code)
{
union REGS inregs;
inregs.x.dx=port;
inregs.h.ah=RS232_INIT_FUNCTION;
inregs.h.al=init_code;
int86(0x14,&inregs,&inregs);
}
unsigned char rs232transmit (int port, char ch)
{
union REGS inregs;
inregs.x.dx=port;
inregs.h.ah=RS232_SEND_FUNCTION;
inregs.h.al=ch;
int86(0x14,&inregs,&inregs);
return (inregs.h.ah);
}
unsigned char rs232status(int port){
union REGS inregs;
inregs.x.dx=port;
inregs.h.ah=RS232_STATUS_FUNCTION;
int86(0x14, &inregs, &inregs);
return (inregs.h.ah); //Because we want the second byte of ax
}
unsigned char rs232receive(int port)
{
int x,a;
union REGS inregs;
while(!(rs232status(port) & DATA_READY))
{
if(kbhit()){
getch();
exit(1);
}
};
inregs.x.dx=port;
inregs.h.ah=RS232_GET_FUNCTION;
int86(0x14,&inregs,&inregs);
if(inregs.h.ah & 0x80)
{
printf("ERROR");
return -1;
}
return (inregs.h.al);
}
int main(){
unsigned char ch;
int d,e,i;
do{
puts("What would you like to do?");
puts("1.Send data");
puts("2.Receive data");
puts("0.Exit");
scanf("%d",&i);
getchar();
if(i==1){
rs232init(COM1, PARAM);
puts("Which char would you like to send?");
scanf("%c",&ch);
getchar();
while(!rs232status(COM1));
d=rs232transmit(COM1,ch);
if(d & 0x80) puts("ERROR"); //Checks the bit 7 of ah for error
}
else if(i==2){
rs232init(COM1,PARAM);
puts("Receiving character...");
ch=rs232receive(COM1);
printf("%c\n",ch);
}
}while(i != 0);
system("pause");
return 0;
}
運行一些統計什麼硬件/操作系統,你運行的?這對你的問題沒有多大幫助,但我很好奇。這個問題有點狡猾。 '用於發送和接收字符的CPU時間' - 從什麼地方開始計時?你可以說,I/O映射中的UART的「入」和「出」指令都是需要的。 –
我在Windows 7上,正如我所說我正在運行一個模擬器。它創建端口對,我們在這些端口上工作,但它模擬16550或8250 UART。我猜測,在使用進出指令時,它取決於指令的速度,它將如何解決?例如,內聯彙編應該是最快的,因爲你直接給寄存器賦值,並且他們準備發送,而使用預製庫必須經過函數,然後找到寄存器等。 – Konstantine