/* VME test program 2 * */ #include #include #include #include #include #include #include #define KBYTES 1024 #define OUR_VME_ADDRESS 0x30000000 #define LOOPSIZE 1000000 int main( int argc, char *argv[] ) { int i, n; int vmedev; int bufsize; int loopcount; unsigned long vmeaddr; unsigned char *rbuf; unsigned char *wbuf; size_t bufbytes; time_t stm; time_t etm; double dtm, spd; if( argc != 3 ) { fprintf( stderr, "Usage: %s device size(KB)\n", argv[0] ); return( 0 ); } bufsize = atoi( argv[2] ); bufbytes = bufsize * KBYTES; loopcount = LOOPSIZE / bufsize; printf( "* Program: %s Bufbytes: %d\n", argv[0], bufbytes ); rbuf = memalign( 64, bufbytes ); if( rbuf == NULL ) { printf( "Cannot allocate Read Buffer: %d bytes\n", bufbytes ); return 0; } wbuf = memalign( 64, bufbytes ); if( wbuf == NULL ) { printf( "Cannot allocate Write Buffer: %d bytes\n", bufbytes ); free( rbuf ); return 0; } vmedev = open( argv[1], O_RDWR ); if( vmedev < 0 ) { fprintf( stderr, "Cannot open %s\n", argv[1] ); return( -1 ); } for( i = 0; i < bufbytes; i++ ) wbuf[i] = (i & 255); memset( rbuf, 0, bufbytes ); vmeaddr = OUR_VME_ADDRESS; time( &stm ); i = loopcount; while( i-- ) { if( lseek( vmedev, vmeaddr, SEEK_SET ) != vmeaddr ) { fprintf( stderr, "LSEEK error in loop\n" ); close( vmedev ); free( wbuf ); free( rbuf ); return( -1 ); } if( (n = write( vmedev, wbuf, bufbytes )) != bufbytes ) { fprintf( stderr, "WRITE error in loop %d %d/%d\n", i, n, bufbytes ); close( vmedev ); free( wbuf ); free( rbuf ); return( -1 ); } } time( &etm ); printf( "Device: %s, BufferSize %dKbytes (= %d), Loopcount %d\n", argv[1], bufsize, bufbytes, loopcount ); printf( "Start: %s", asctime( localtime( &stm ) ) ); printf( "Stop: %s", asctime( localtime( &etm ) ) ); dtm = difftime( etm, stm ); spd = (double)loopcount * (double)bufbytes / dtm / (double)1000000.0; printf( "Speed: %lf Mbytes/sec (%lf sec)\n", spd, dtm ); if( lseek( vmedev, vmeaddr, SEEK_SET ) != vmeaddr ) { fprintf( stderr, "LSEEK error for read\n" ); close( vmedev ); free( rbuf ); free( wbuf ); return( -1 ); } if( read( vmedev, rbuf, bufbytes ) != bufbytes ) { fprintf( stderr, "READ error \n" ); close( vmedev ); free( rbuf ); free( wbuf ); return( -1 ); } close( vmedev ); /* Check the contents */ for( i = 0; i < bufbytes; i++ ) { if( rbuf[i] != wbuf[i] ) { fprintf( stderr, "Error at 0x%08x: w:%02d r:%02d\n", i, wbuf[i], rbuf[i] ); } } free( rbuf ); free( wbuf ); return 0; }