В настоящее время мы не планируем проводить сертификацию своего оборудования во всевозможных компетентных организациях. Но мы проводим собственную сертификацию, результаты которой и приводятся на этой странице.
Изначально предполагалось, что если переписать программу с задействованием функции select ($man 2 select), программа тестирования будет работать быстрее. Ожидания не оправдались. Выявленные задержки в работе, относительно программы тестирования применяемой для MS DOS, связаны с наличием и "эффективным использованием" буфера FIFO порта RS-232 операционной системой. Так как используются очень коротенькие команды, большинство прерываний порта RS-232 происходит по таймауту. То есть передача команды в PowerAnt происходит очень быстро, PowerAnt быстро отсылает ответ. Если ответ меньше размера буфера FIFO порта RS-232, то отчет о выполнении команды приходит в управляющую программу по таймауту.
Тестирование производилось при помощи следующей программы:
// Description: Program for PowerAnt speed test #include <stdio.h> #include <fcntl.h> #include <errno.h> #include <string.h> #include <termios.h> #include <unistd.h> #include <time.h> void init_raw_tty( int fd ){ struct termios newtio; bzero(&newtio, sizeof(newtio)); newtio.c_cflag = B9600 | CS8 | CLOCAL | CREAD /*| CSTOPB */; newtio.c_iflag = IGNPAR; newtio.c_oflag = 0; /* set input mode (non-canonical, no echo,...) */ newtio.c_lflag = 0; newtio.c_cc[VTIME] = 1; newtio.c_cc[VMIN] = 1; /* blocking read until 5 chars received */ tcflush(fd, TCIFLUSH); tcsetattr(fd,TCSANOW,&newtio); } FILE * powerants; int powerants_int; void printAnswer( void ){ int inCh; do { inCh = fgetc(powerants); if( inCh > 0 ){ printf("%c",inCh); if( inCh == 0x0D ){ printf("\n"); }; } else { printf("Non blocking output!\n"); // Ввод блокирующий, то есть этого сообщения мы никогда не увидим exit( 0 ); }; } while( inCh != 0x0D ); } int main( int ArgC, char * ArgV[] ){ if( ArgC < 4 ){ fprintf( stderr, "ERROR: some parameters are missing (f.e. /dev/ttyS1 3600 '??')\n"); return 0; }; powerants_int = open(ArgV[1],O_RDWR | O_NOCTTY ); if(! powerants_int ){ fprintf( stderr, "ERROR: (open) %s\n", strerror( errno ) ); return -1; }; printf("Working with %s, 9600 8N1\n",ArgV[1]); init_raw_tty( powerants_int ); powerants = fdopen( powerants_int, "w+b" ); fputc( 0x1B, powerants ); // Прочистка буфера приема PowerAnt int x = atoi( ArgV[2] ); printf("Cycles:%i\n",(x)); printf("Command:'%s'\n",ArgV[3]); time_t start = time( NULL ); while( x-- ){ fputs( ArgV[3], powerants ); fputc( 0x0D, powerants ); //fprintf(powerants,"%s\r",ArgV[2]); //fflush( powerants ); //printf("%s\n",ArgV[2]); printAnswer(); }; printf("Time:%li\n",(time(NULL) - start )); fclose(powerants); return 0; };Следует отметить, что эта программа использует "стандартный" блокирующий ввод, поэтому в результат тестирования значительно отличается от ожидаемого. На результат тестирования в большей мере повлияла не столько скорость взаимодействия с устройством, сколько время переключения контекстов задачи и буферизации ввода-вывода.
Тестирование производилось при помощи следующего сценария:
echo 3600 '?%' ./powerant_1 /dev/ttyS1 3600 '?%' 2>&1 >3600_1.txt echo 3600 '?=' ./powerant_1 /dev/ttyS1 3600 '?=' 2>&1 >3600_2.txt echo 3600 '??' ./powerant_1 /dev/ttyS1 3600 '??' 2>&1 >3600_3.txt echo 3600 '=A' ./powerant_1 /dev/ttyS1 3600 '=A' 2>&1 >3600_4.txt echo 3600 '=abcdefgh' ./powerant_1 /dev/ttyS1 3600 '=abcdefgh' 2>&1 >3600_5.txt
PowerAnt - тип SwSe - /dev/ttyS1, 9600 8N1
Перед выполнением теста выполнена установка режима работы порта "по умолчанию", то есть:
$setserial /dev/ttyS1 ^low_latency
Команда | Передано + принято байт за цикл | Число циклов | Передано + принято байт | Время выполнения теста (сек) | Скорость (байт/сек) | Практически (циклов/сек) | Теоретически (циклов/сек) | Циклы % |
---|---|---|---|---|---|---|---|---|
?%<CR> +%<CR> | 6 | 3600 | 21600 | 72 | 300 | 50 | 160 | 31,25% |
?=<CR> +=ABCDEFGHIJKLMN<CR> | 20 | 3600 | 72000 | 140 | 514,29 | 25,71 | 48 | 53,57% |
??<CR> +? PowerAnt v2_8c SWSE<CR> | 26 | 3600 | 93600 | 145 | 645,52 | 24,83 | 36,92 | 67,24% |
=A<CR> +=<CR> | 6 | 3600 | 21600 | 72 | 300 | 50 | 160 | 31,25% |
=abcdefgh<CR> +=<CR> | 13 | 3600 | 46800 | 99 | 472,73 | 36,36 | 73,85 | 49,24% |
Тесты пройдены без ошибок. Полученная скорость работы устройства значительно отличается от теоретической, что связанно с тем, что программа передает и получает ОЧЕНЬ малые объемы данных. То есть в данном случае на результаты тестирования в большей мере повлияло время переключения контекста задачи, чем сам ввод-вывод.
Перед выполнением теста выполнена установка режима быстрой работы порта, то есть:
$setserial /dev/ttyS1 low_latency
Команда | Передано + принято байт за цикл | Число циклов | Передано + принято байт | Время выполнения теста (сек) | Скорость (байт/сек) | Практически (циклов/сек) | Теоретически (циклов/сек) | Циклы % |
---|---|---|---|---|---|---|---|---|
?%<CR> +%<CR> | 6 | 3600 | 21600 | 43 | 502,33 | 83,72 | 160 | 52,33% |
?=<CR> +=ABCDEFGHIJKLMN<CR> | 20 | 3600 | 72000 | 109 | 660,55 | 33,03 | 48 | 68,81% |
??<CR> +? PowerAnt v2_8c SWSE<CR> | 26 | 3600 | 93600 | 137 | 683,21 | 26,28 | 36,92 | 71,17% |
=A<CR> +=<CR> | 6 | 3600 | 21600 | 43 | 502,33 | 83,72 | 160 | 52,33% |
=abcdefgh<CR> +=<CR> | 13 | 3600 | 46800 | 72 | 650 | 50 | 73,85 | 67,71% |
Тесты пройдены без ошибок. Полученная скорость работы устройства несколько меньше чем в MS DOS, но не настолько катастрофически меньшей, чем в тесте с выключенной опцией low_latency. Судя по тестам, выполняемым командами '??', '?=', '=abcdefgh', задержка в выполнении команд связана с малыми объемами передаваемых и принимаемых данных за один цикл.
$cat /etc/issue ASPLinux release 9 (Ural) Kernel 2.4.20-9asp on an i686 $gcc --version gcc (GCC) 3.2.2 20030222 (ASPLinux 3.2.2-5asp) Copyright (C) 2002 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
В документации на ($man setserial) сказано, что установка опции low_latency сделает работу порта более быстрой (что и наблюдается), но увеличит нагрузку на систему (что тоже наблюдается).
$setserial /dev/ttyS1 low_latency $time ./powerant_1 /dev/ttyS1 3600 '?%' 2>&1 >3600_1.txt real: 0m43.869s user: 0m0.160s sys: 0m0,160s $setserial /dev/ttyS1 ^low_latency $time ./powerant_1 /dev/ttyS1 3600 '?%' 2>&1 >3600_1.txt real: 1m12.010s user: 0m0.000s sys: 0m0,010s