Первый раз посылка так что, вероятно, собирается быть больше информации, чем это необходимо, но я хочу быть полным: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;
}
Какое оборудование/ОС вы используете? Это не сильно поможет вашему вопросу, но мне любопытно. Вопрос немного коварный. «Время процессора, затрачиваемое на отправку и получение символа» - приурочено от чего? Вы могли бы сказать, что инструкции «внутри» и «вне», от и до UART на карте ввода-вывода - все, что необходимо. –
Я нахожусь в Windows 7 и, как я уже сказал, я запускаю эмулятор. Он создает пары портов, и мы работаем над ними, но имитирует UART 16550 или 8250. Я предполагаю, что при использовании инструкций ввода и вывода это зависит от инструкции относительно того, насколько быстро он будет разрешаться? Например, встроенная сборка должна быть самой быстрой, поскольку вы непосредственно передаете значения в регистры, и они готовы к отправке, тогда как использование готовой библиотеки должно проходить через функции, а затем находить регистры и т. Д. И т. Д. – Konstantine