0

初めて投稿するので、必要以上の情報が含まれる可能性がありますが、徹底したいと思います。

C での演習の 1 つは、ヌル モデムを使用した RS232 シリアル通信を介してデータを交換する送信側と受信側のプログラムを作成することでした。仮想ポート プログラムを使用しました (テストしたい場合は、eltima ソフトウェアによる仮想シリアル ポートの試用版を使用しました)。4 つのバージョンを実行する必要がありました。

1) 送信者、受信者などの関数があらかじめ用意されている、前の学生によって作成された所定のライブラリを使用する 2) inportb 関数と outportb 関数を使用する 3) OS 割り込み int86 を使用し、REGS ユニオンを介してレジスタ値を与える 4) インライン アセンブリを使用する

コンパイラ: DevCPP (Bloodshed)。

すべてうまくいきましたが、文字の送受信に費やされる 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;
}
4

1 に答える 1

1

質問は少し未定義であるため、ここで必要な推測作業がいくつかあります。

キャラクターを送受信するための4つの異なる方法をリストしました。講師が探しているのは、指定されたメソッドを呼び出す(またはインラインアセンブリコードを入力する)から、メソッドから戻る(インラインコードを残す)までの時間です。電話の直前と電話の直後に時間を取って、違いを見つける必要があります。

あいまいさが少ないのはCPU時間です。clock()メソッドはこれを行うための最も簡単な方法ですが、これは講師が探しているものではない場合があります。

最後に統計がありますが、これは簡単です。たくさんの実行を行い、時間に関するいくつかの統計を実行します

于 2012-05-04T14:33:16.510 に答える