C RS232通信。如何比较CPU时间?

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(流血事件) 所有这些都工作了

第一次发布,所以可能会有更多的信息,但我想彻底:

我们在C语言中的一个练习是创建发送方和接收方程序,通过RS232串行通信与空调制解调器交换数据。我们使用了一个虚拟端口程序(如果您想进行测试,我使用了eltima软件的虚拟串行端口试用版)。我们被要求做4个版本:

1) 使用先前学生创建的预定库,该库具有发送方和接收方等预制函数 2) 使用输入端口B和输出端口B函数 3) 使用操作系统中断int86并通过REGS并集给出寄存器值 4) 使用内联汇编

编译:DevCPP(流血事件)

所有这些都工作了,但是现在我们需要根据发送和接收字符所花费的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;
}
#包括
#包括
#包括
#定义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(),它只会获取当前时间。两者都可以,真见鬼。