初めて投稿するので、必要以上の情報が含まれる可能性がありますが、徹底したいと思います。
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;
}