C RS232通信。如何比较CPU时间?
第一次发布,所以可能会有更多的信息,但我想彻底: 我们在C语言中的一个练习是创建发送方和接收方程序,通过RS232串行通信与空调制解调器交换数据。我们使用了一个虚拟端口程序(如果您想进行测试,我使用了eltima软件的虚拟串行端口试用版)。我们被要求做4个版本: 1) 使用先前学生创建的预定库,该库具有发送方和接收方等预制函数 2) 使用输入端口B和输出端口B函数 3) 使用操作系统中断int86并通过REGS并集给出寄存器值 4) 使用内联汇编 编译:DevCPP(流血事件) 所有这些都工作了,但是现在我们需要根据发送和接收字符所花费的CPU时间来比较所有不同的版本。它特别指出,我们必须找到以下内容: 平均值、标准偏差、最小值、最大值和99.5% 课堂上什么都没解释,所以我在这里有点迷茫……我猜这些是经过多次正态分布试验后的统计数字?但即便如此,我如何实际测量这台计算机的CPU周期呢?我会继续搜索,但同时我会在这里发布,因为最后期限是3天:D int86版本的代码示例:C RS232通信。如何比较CPU时间?,c,time,serial-port,cpu,C,Time,Serial Port,Cpu,第一次发布,所以可能会有更多的信息,但我想彻底: 我们在C语言中的一个练习是创建发送方和接收方程序,通过RS232串行通信与空调制解调器交换数据。我们使用了一个虚拟端口程序(如果您想进行测试,我使用了eltima软件的虚拟串行端口试用版)。我们被要求做4个版本: 1) 使用先前学生创建的预定库,该库具有发送方和接收方等预制函数 2) 使用输入端口B和输出端口B函数 3) 使用操作系统中断int86并通过REGS并集给出寄存器值 4) 使用内联汇编 编译:DevCPP(流血事件) 所有这些都工作了
#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;
}
#包括
#包括
#包括
#定义RS232_初始化_函数0
#定义RS232_发送_功能1
#定义RS232_获取_函数2
#定义RS232_状态_功能3
#定义数据\u就绪0x01
#定义参数0xEF
#定义COM1 0
#定义COM2 1
void rs232init(int端口,无符号init_代码)
{
工会条例;
inregs.x.dx=端口;
inregs.h.ah=RS232_初始_函数;
inregs.h.al=初始代码;
int86(0x14,&inregs,&inregs);
}
未签名字符rs232transmit(int端口,字符ch)
{
工会条例;
inregs.x.dx=端口;
inregs.h.ah=RS232_发送_功能;
h.al=ch;
int86(0x14,&inregs,&inregs);
返回值(单位:h.ah);
}
无符号字符rs232status(int端口){
工会条例;
inregs.x.dx=端口;
inregs.h.ah=RS232_状态_功能;
int86(0x14,&inregs,&inregs);
return(inregs.h.ah);//因为我们需要ax的第二个字节
}
无符号字符rs232receive(int端口)
{
int x,a;
工会条例;
同时(!(rs232status(端口)和数据_就绪))
{
if(kbhit()){
getch();
出口(1);
}
};
inregs.x.dx=端口;
在regs.h.ah=RS232_GET_函数中;
int86(0x14,&inregs,&inregs);
if(单位:英寸h.ah&0x80)
{
printf(“错误”);
返回-1;
}
返回值(单位:h.al);
}
int main(){
无符号字符ch;
int d,e,i;
做{
puts(“您想做什么?”);
看跌期权(“1.发送数据”);
看跌期权(“2.接收数据”);
卖出(“0.退出”);
scanf(“%d”、&i);
getchar();
如果(i==1){
rs232init(COM1,参数);
puts(“您希望发送哪个字符?”);
scanf(“%c”和“ch”);
getchar();
而(!rs232status(COM1));
d=RS232传输(COM1,ch);
if(d&0x80)put(“ERROR”);//检查ah的第7位是否有错误
}
else如果(i==2){
rs232init(COM1,参数);
放置(“接收字符…”);
ch=rs232receive(COM1);
printf(“%c\n”,ch);
}
}而(i!=0);
系统(“暂停”);
返回0;
}
这里需要一些猜测,因为这个问题有点未定义
您已经列出了发送/接收字符的四种不同方法。我怀疑你的讲师在寻找的是从调用给定的方法(或输入内联汇编代码)到从该方法返回(保留内联代码)的时间。您需要在通话前和通话后抓紧时间,找出它们的区别
cpu时间不那么模棱两可。clock()方法是实现这一点的最直接的方法,但是这可能不是讲师想要的
最后是简单明了的统计数据。进行一系列的运行,并运行一些关于时报的统计数据您运行的是什么硬件/操作系统?这对你的问题没有多大帮助,但我很好奇。这个问题有点离题。”发送和接收字符所花费的CPU时间,从什么时间到哪里?你可以说,I/O映射中的UART之间的“输入”和“输出”指令就是所需的全部。我在Windows 7上,正如我所说,我正在运行一个模拟器。它创建端口对,我们处理这些端口对,但它模拟16550或8250UART。我猜当使用in和out指令时,它取决于指令的解析速度?例如,内联汇编应该是最快的,因为您直接给寄存器赋值,它们就可以发送了,而使用预制库必须遍历函数,然后找到寄存器等等。我将检查clock()方法。与此同时,我在论坛上询问了关于这件事的澄清,如果我得到答复,我将再次发布。给出的澄清是计算程序从进入功能到退出功能所需的时间。我猜这意味着我会放两个函数来显示时间的前后?这可以用clock()方法完成吗?正确,一个函数之前,一个函数之后。至于哪些函数,如果需要cpu时间,则clock()将起作用。但是,您也可以使用gettimeofday(),它只会获取当前时间。两者都可以,真见鬼。