/* VME test program 4 * */ #include #include #include #include #include #include #include #include #define KBYTES 1024 #define OUR_VME_ADDRESS 0x30000000 #define OUR_VME_MAPLEN 0x00100000 #define LOOPSIZE 1000000 int main( int argc, char *argv[] ) { int i, n; int vmedev; int bufsize; int loopcount; unsigned char *rbuf; unsigned char *wbuf; unsigned char *vmeaddr; 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 = (unsigned char *)mmap( (caddr_t)0, OUR_VME_MAPLEN, (PROT_READ | PROT_WRITE), MAP_PRIVATE, vmedev, OUR_VME_ADDRESS ); if( vmeaddr == NULL ) { fprintf( stderr, "Map error\n" ); return( -1 ); } time( &stm ); i = loopcount; while( i-- ) { memcpy( vmeaddr, wbuf, bufbytes ); } 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 ); memcpy( rbuf, vmeaddr, bufbytes ); munmap( vmeaddr, OUR_VME_MAPLEN ); 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; }