2012-05-04 65 views
0

第一次發佈這樣有可能會是超過必要的信息,但我想徹底: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; 
} 
+0

運行一些統計什麼硬件/操作系統,你運行的?這對你的問題沒有多大幫助,但我很好奇。這個問題有點狡猾。 '用於發送和接收字符的CPU時間' - 從什麼地方開始計時?你可以說,I/O映射中的UART的「入」和「出」指令都是需要的。 –

+0

我在Windows 7上,正如我所說我正在運行一個模擬器。它創建端口對,我們在這些端口上工作,但它模擬16550或8250 UART。我猜測,在使用進出指令時,它取決於指令的速度,它將如何解決?例如,內聯彙編應該是最快的,因爲你直接給寄存器賦值,並且他們準備發送,而使用預製庫必須經過函數,然後找到寄存器等。 – Konstantine

回答

1

這裏有一些需要猜測,因爲這個問題是有點不確定。

你所列出的發送/接收字符四種不同的方法。我懷疑你的講師正在尋找的是從給定方法(或輸入內聯彙編代碼)到從方法返回(離開內聯代碼)時的時間。您需要在通話之前和通話之後獲取時間並找出差異。

更加明確的CPU時間。 clock()方法是最直接的方法,但這可能不是講師要找的。

最後的統計數據,這很簡單。做了一堆運行的,並在次

+0

我將檢查clock()方法。與此同時,我在論壇上詢問了有關此事的澄清,如果我得到答案,我會再次發帖。 – Konstantine

+0

給出的澄清是計算程序需要進入功能退出的時間。我猜這意味着我會把兩個函數顯示時間前後?這可以用clock()方法完成嗎? – Konstantine

+0

正確,一個功能之前,一個功能之後。至於哪些函數,如果你想要cpu時間,那麼clock()就可以工作。但是,您也可以使用gettimeofday(),並且只會獲取當前時間。可以做到這一點。 – JoeyG