2012-05-04 4 views
0

Первый раз посылка так что, вероятно, собирается быть больше информации, чем это необходимо, но я хочу быть полным:C RS232 comm. Как сравнить время процессора?

Один из наших упражнений в C было создание программ отправителя и получателя, которые будут обмениваться данными через последовательный порт RS232 связи с нульмодемному. Мы использовали программу виртуального порта (я использовал пробную версию Virtual Serial Port по программному обеспечению eltima, если вы хотите протестировать). Мы должны были сделать 4 версии:

1) с помощью заранее определенной библиотеки, созданной предыдущим студентом, который имел отправителя и Reveiver т.д. Premade функции 2) с помощью inportb и outportb функций 3) Использование ОС прерывания int86 и давая регистрирует значения через соединение REGS 4) Использование встроенной сборки

Компилятор: DevCPP (Bloodshed).

Все работало, но теперь нам необходимо сравнить все разные версии на основе времени процессора, которое расходуется на отправку и получение символа. Он, в частности, говорит, что мы должны найти следующее:

среднее, стандартное отклонение, минимум, максимум и 99,5%

Ничего не было объяснено в классе, так что я немного потерял здесь ... Я Думаю, это статистические числа после многих испытаний нормального распределения? Но даже тогда, как я на самом деле измеряю циклы процессора на этом? Я продолжу поиск, но я размещаюсь здесь в среднем, потому что крайний срок составляет 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

Какое оборудование/ОС вы используете? Это не сильно поможет вашему вопросу, но мне любопытно. Вопрос немного коварный. «Время процессора, затрачиваемое на отправку и получение символа» - приурочено от чего? Вы могли бы сказать, что инструкции «внутри» и «вне», от и до UART на карте ввода-вывода - все, что необходимо. –

+0

Я нахожусь в Windows 7 и, как я уже сказал, я запускаю эмулятор. Он создает пары портов, и мы работаем над ними, но имитирует UART 16550 или 8250. Я предполагаю, что при использовании инструкций ввода и вывода это зависит от инструкции относительно того, насколько быстро он будет разрешаться? Например, встроенная сборка должна быть самой быстрой, поскольку вы непосредственно передаете значения в регистры, и они готовы к отправке, тогда как использование готовой библиотеки должно проходить через функции, а затем находить регистры и т. Д. И т. Д. – Konstantine

ответ

1

Существует несколько догадок здесь требуется, потому что вопрос немного не определено.

Вы указали четыре разных метода отправки/приема символа. То, что я подозреваю, ваш лектор ищет, - это время, когда вы вызываете предложенный метод (или вводите свой встроенный ассемблерный код) до момента возврата из метода (оставьте встроенный код). Вам нужно будет захватить время перед вызовом и сразу после разговора и найти их разницу.

Менее двусмысленный - это время процессора. Метод clock() - это самый простой способ сделать это, однако это может быть не то, что ищет лектор.

И, наконец, статистика, которая проста. Сделайте кучу прогонов и запустите некоторую статистику по времени

+0

Я проверю часы() метод. Тем временем я спросил на наших форумах о разъяснении по этому вопросу, я отправлю сообщение снова, если я получу ответ – Konstantine

+0

Прояснение, которое было дано, было подсчет времени, в течение которого программа должна была войти в функцию, чтобы выйти из нее. Я предполагаю, что это означает, что я поставлю 2 функции, которые показывают время до и после?Можно ли это сделать с помощью метода clock()? – Konstantine

+0

Правильно, одна функция перед тем, одна функция после. Что касается функций, если вы хотите cpu time, тогда будет работать clock(). Однако вы также можете использовать gettimeofday() и просто получите текущее время. Могли сделать и то, и другое. – JoeyG