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