Beispiel #1
0
/**
 * \brief Deinitialize usart interface
 */
int32_t usart_os_deinit(struct usart_os_descriptor *const descr)
{
	ASSERT(descr);
	_usart_async_deinit(&descr->device);
	descr->io.read  = NULL;
	descr->io.write = NULL;

	sem_deinit(&descr->rx_sem);
	sem_deinit(&descr->tx_sem);
	aos_mutex_free(&descr->rx_mutex);
	aos_mutex_free(&descr->tx_mutex);
	krhino_buf_queue_del(&descr->kbuf);
	aos_free(descr->kbuf_data);

	return ERR_NONE;
}
Beispiel #2
0
/**
 * \brief Initialize usart interface
 */
int32_t usart_os_init(struct usart_os_descriptor *const descr, void *const hw, uint8_t *rx_buffer,
                      uint16_t rx_buffer_length, void *const func)
{
	int32_t rc;
	ASSERT(descr && hw && rx_buffer && rx_buffer_length);

	if (ERR_NONE != ringbuffer_init(&descr->rx, rx_buffer, rx_buffer_length)) {
		return ERR_INVALID_ARG;
	}

	descr->kbuf_data = aos_malloc(MAX_BUF_UART_BYTES);
	if (descr->kbuf_data == NULL) {
		return -1;
	}
	memset(descr->kbuf_data, 0, MAX_BUF_UART_BYTES);
	rc = krhino_buf_queue_create(&descr->kbuf, "buf_queue_uart", descr->kbuf_data, MAX_BUF_UART_BYTES, 1);
        
	rc = sem_init(&descr->rx_sem, 0);
	if (rc < 0) {
		return rc;
	}
	rc = sem_init(&descr->tx_sem, 0);
	if (rc < 0) {
		sem_deinit(&descr->rx_sem);
		return rc;
	}
	rc = aos_mutex_new(&descr->rx_mutex);
	if (rc < 0) {
		sem_deinit(&descr->rx_sem);
		sem_deinit(&descr->tx_sem);
		return rc;
	}
	rc = aos_mutex_new(&descr->tx_mutex);
	if (rc < 0) {
		sem_deinit(&descr->rx_sem);
		sem_deinit(&descr->tx_sem);
		aos_mutex_free(&descr->rx_mutex);
		return rc;
	}
	descr->sync_device.hw = hw;
	rc = _usart_async_init(&descr->device, hw);

	if (rc) {
		sem_deinit(&descr->tx_sem);
		sem_deinit(&descr->rx_sem);
		aos_mutex_free(&descr->rx_mutex);
		aos_mutex_free(&descr->tx_mutex);
		return rc;
	}

	descr->rx_buffer = NULL;
	descr->rx_size   = 0;
	descr->rx_length = 0;

	descr->io.read  = usart_async_read;
	descr->io.write = usart_sync_write;

	descr->device.usart_cb.tx_byte_sent = usart_os_process_byte_sent;
	descr->device.usart_cb.rx_done_cb   = usart_fill_rx_buffer;
	descr->device.usart_cb.tx_done_cb   = usart_os_transmission_complete;
	descr->device.usart_cb.error_cb     = usart_os_error;
	_usart_async_set_irq_state(&descr->device, USART_ASYNC_RX_DONE, true);
	_usart_async_set_irq_state(&descr->device, USART_ASYNC_ERROR, true);

	return ERR_NONE;
}
Beispiel #3
0
int __cdecl main(int argc,char *argv[])
{
	int i,arg, currit, modes, modenr;
	paramT *p;

#ifdef SHAREDMEM
	int shmid;
#endif

#ifdef WIN32
	DWORD procID;
	HANDLE hProcess;
	HANDLE hThread[10];
	DWORD IDThread;
	LARGE_INTEGER lpFrequency;
#endif

	p = (paramT*) malloc(MXPROC*sizeof(paramT));

	/* default initialisation */
	modes=0;
	p[0].mode=0;
	p[0].npes=NPES;
	p[0].mxsize=MXRUNSZ;
	p[0].minsize=MINRUNSZ;
	p[0].mxstrds=MXSTRDS;
	p[0].mxiters=MXIT;
	p[0].currentrep=1;
#ifdef HAVEOPT
	p[0].useoptasm=OPTASM;
#else
	p[0].useoptasm=0;
#endif
	arg=1;
	chartrev=CHARTREV;
	printf("\nECT memperf - Extended Copy Transfer Characterization\n");
	printf("Memory Performance Characterization Toolkit %s\n\n",VERSION);

#ifdef WIN32
	/* lookup clock frequency */
	QueryPerformanceFrequency(&lpFrequency);
	tic = (lpFrequency.LowPart / 1000000.0);
	tic += (lpFrequency.HighPart * (2^32) / 1000000.0);
#else
	tic=getcpufrequency();
#endif

	if (argc<2) {
#ifdef WIN32
		printf("Usage: %s -m <mode> [-p] [-s] [-n] [-r] [-i] [-c] [-o]\n",argv[0]);
#elif defined HAVEOPT
		printf("Usage: %s -m <mode> [-p] [-s] [-n] [-r] [-i] [-t] [-c] [-a] [-o]\n",argv[0]);
#else
		printf("Usage: %s -m <mode> [-p] [-s] [-n] [-r] [-i] [-t] [-c] [-o]\n",argv[0]);
#endif /*WIN32*/
		printf("       -m <mode>    :   0 = load sum test\n");
		printf("                        1 = const store test\n");
		printf("                        2 = load copy test\n");
		printf("                        3 = copy store test\n");
		printf("                        9 = all tests\n");
		printf("       [-c <nofrep> ]   Default: %d\n", NROFREP);
#ifdef HAVEOPT
		printf("       [-a <optasm> ]   0/1 = use/don't use special instructions\n");
		printf("                        2 = both methods, Default: %d\n", OPTASM);
#endif
		printf("       [-p <nProc>  ]   Default: %d\n",NPES);
		printf("       [-s <mxstrds>]   Default: %d\n",MXSTRDS);
		printf("       [-n <mxsize> ]   Default: %d (%d Bytes)\n",MXRUNSZ,8<<MXRUNSZ);
		printf("       [-r <minsize>]   Default: %d (%d Bytes)\n",MINRUNSZ,8<<MINRUNSZ);
		printf("       [-i <mxiters>]   Default: %d\n",MXIT);
		printf("       [-o          ]   Reversed Output\n");
#ifdef WIN32
		printf("       Evaluated clock resolution [MHz]: %.2f\n",tic);
#else
		printf("       [-t <tics/us>]   Default: %.2f\n",tic);
#endif
		exit(2);
	}

	while (arg<argc) {
		if (argv[arg][0]=='-') {
			if (argv[arg][1]=='p' && (arg+1)<argc) {
				arg++; p[0].npes=atoi(argv[arg]);
			}
			if (argv[arg][1]=='s' && (arg+1)<argc) {
				arg++; p[0].mxstrds=atoi(argv[arg]);
			}
			if (argv[arg][1]=='m' && (arg+1)<argc) {
				arg++; modes=atoi(argv[arg]);
			}
			if (argv[arg][1]=='n' && (arg+1)<argc) {
				arg++; p[0].mxsize=atoi(argv[arg]);
			}
			if (argv[arg][1]=='r' && (arg+1)<argc) {
				arg++; p[0].minsize=atoi(argv[arg]);
			}
			if (argv[arg][1]=='i' && (arg+1)<argc) {
				arg++; p[0].mxiters=atoi(argv[arg]);
			}
			if (argv[arg][1]=='o') {
				chartrev=1;
			}
			if (argv[arg][1]=='a' && (arg+1)<argc) {
				arg++;
#ifdef HAVEOPT
				p[0].useoptasm=atoi(argv[arg]);
#endif
			}
			if (argv[arg][1]=='c' && (arg+1)<argc) {
				arg++; nrofrep=atoi(argv[arg]);
			}
			if (argv[arg][1]=='t' && (arg+1)<argc) {
				arg++;
#ifndef WIN32
				tic=atof(argv[arg]);
#endif
			}
		}
		arg++;
	}

	p[0].mxsize=1<<p[0].mxsize;
	p[0].minsize=1<<p[0].minsize;

	/* set high process priority */
#ifdef WIN32
	procID = GetCurrentProcessId ();
	hProcess = OpenProcess(PROCESS_ALL_ACCESS,TRUE,procID);
	SetPriorityClass(hProcess, HIGH_PRIORITY_CLASS);
#else /* unix */
	setpriority(PRIO_PROCESS, 0,-20);    /* linux has no bind_to_cpu call */
#endif


#ifdef WIN32
	printf(  "Evaluated Clock Resolution: %.2f MHz\n\n",tic);
#else
	printf(  "Specified/Evaluated Clock Resolution (Option -t): %.2f MHz\n\n",tic);
#endif

	/* allocate shared memory (only once for all repetitions/modes */
#ifdef SHAREDMEM
	printf("Allocation of Shared Memory!\n");
	if ((shmid=shmget(IPC_PRIVATE,sizeof(double)*p[0].mxsize,IPC_CREAT | 0666))
		==-1) {perror("shmget");exit(99);}
	if ((shared = (double *) shmat(shmid,0,SHM_RND))==(double *) -1) {
		perror("shmat\n"); exit(99);
	}
#endif /* SHAREDMEM */

	for (modenr=0;modenr<=3;modenr++) {
		if ((modenr==modes) || (modes==9)) {
			p[0].mode=modenr;

			for (currit=1;currit<=nrofrep;currit++) {
				p[0].currentrep=currit;
				for (i=1;i<MXPROC;i++) {
					memcpy (&p[i],&p[0], sizeof(paramT));
				}

				switch (p[0].mode) {
				case 0:
					printf("Load Sum (%d)    - Working Set: %.0f KByte; Strides: %d\n",currit, (float) p[0].mxsize*8/1024,p[0].mxstrds);
					break;
				case 1:
					printf("Const Store (%d) - Working Set: %.0f KByte; Strides: %d\n",currit, (float) p[0].mxsize*8/1024,p[0].mxstrds);
					break;
				case 2:
					printf("Load Copy (%d)   - Working Set: 2*%.0f KByte; Strides: %d\n",currit, (float) p[0].mxsize*8/1024,p[0].mxstrds);
					break;
				case 3:
					printf("Copy Store (%d)  - Working Set: 2*%.0f KByte; Strides: %d\n",currit, (float) p[0].mxsize*8/1024,p[0].mxstrds);
					break;
				}
				if (p[0].npes==1)
					printf("                  Starting 1 process...\n                  Test running...\n");
				else
					printf("                  Starting %d processes...\n                  Tests running...\n", p[0].npes );

	/* start parallel execution */
#ifdef WIN32
				for (i=0;i<p[0].npes;i++) {

					p[i].par_cid=i;
				/*printf("Proc: %d, parcid: %d\n",i,p[i].par_cid);
				printf("Address %d\n",&p[i]);
				fflush(stdout);
				*/
					hThread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)memop,&p[i],0,&IDThread);

					if (hThread[i]==NULL) {
						fprintf(stderr, "Create Thread error\n");
						exit(0);
					}
				}

			/* wait for termination of child-threads */
				WaitForMultipleObjects (p[0].npes, hThread, TRUE, INFINITE);

#else  /* unix */

			/* init semaphores for barrier */
				sem_init();

				begin_parallel(p[0].npes);
				p[par_cid].par_cid=par_cid;

   /*
			printf("Proc: %d, parcid: %d\n",par_cid,p[par_cid].par_cid);
			printf("Address %d\n",&p[par_cid]);
			*/

				memop(&p[par_cid]);
				barrier();
				end_parallel();

				sem_deinit();

#endif /* WIN32 */
			}
		 analyze_rep(&p[0]);
		}
	}

	/* detach & destroy shared memory */
#ifdef SHAREDMEM
	if ((shmdt(shared))==-1) {
		perror("shmdt\n"); exit(99);
	}
	if ((shmctl(shmid,IPC_RMID,0))==-1) {
		perror("ShmRelease"); exit(99);
	}
#endif /* SHAREDMEM */

	free(p);
	return 0;
}