⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dm6430-speed-test.c

📁 rt 6430 采集卡 linux下驱动源代码
💻 C
字号:
/*	FILE NAME: dm6430-speed-test.c	FILE DESCRIPTION: Speed test sample program		Sample program to measure the PC and driver speed with an 		Interrupt Service Routine (ISR).  The sampling rate can be set		by the user.  There are demonstrations of the three different		IRQ handling modes.  The interrupts are generated on A/D Fifo		half full.	PROJECT NAME: Linux DM6430 Driver, Library, and Example Programs	PROJECT VERSION: (Defined in README.TXT)	Copyright 2004 RTD Embedded Technologies, Inc.  All Rights Reserved.*/#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/poll.h>#include <unistd.h>#include <dm6430lib.h>char *program_name_p;static voidusage(void) {    fprintf(	stderr,	"\n"        "Usage: %s MINOR_NUMBER"        "\n",	program_name_p    );    exit(EXIT_FAILURE);}static voidverify_success(int status, const char *message_p) {    if (status == -1) {	perror(message_p);	exit(EXIT_FAILURE);    }}static intisstdindata(int timeout) {    struct pollfd	in = {0, POLLIN | POLLERR | POLLPRI, 0};    int			num_fds;    while (((num_fds = poll(&in, 1, timeout)) == -1) && (errno == EINTR))	;    return ((num_fds == 1) && (in.revents & (POLLIN | POLLPRI)));}#define ADCHANNEL1	DM6430HR_AIN1		// A/D channel#define IRQCHANNEL1	DM6430HR_INT1		// IRQ channel#define GAIN1		DM6430HR_GAINx1		// Gain#define SE_DIFF1	DM6430HR_SE_SE		// Single endedint descriptor;short InputBuffer[512];voidspeed_test_isr(void) {    int			full_flag;    int			status;    unsigned long	irqcounter;    status = GetIRQCounter6430(descriptor, IRQCHANNEL1, &irqcounter);    verify_success(status, "GetIRQCounter6430() FAILED");    fprintf(stdout, "channel %d : %ld counts\n", IRQCHANNEL1, irqcounter);    status = IsADFIFOFull6430(descriptor, &full_flag);    verify_success(status, "IsADFIFOFull6430() FAILED");    if (full_flag) {	fprintf(stdout, "\t\tOverrun found\n");	return;    }    status = GetAutoincData6430(	descriptor,	rSTR_AD_6430,	DM6430HR_STR_TYPE_WORD,	InputBuffer,	(sizeof(InputBuffer) / 2)    );    verify_success(status, "GetAutoincData6430() FAILED");}intmain(int argument_count, char **arguments_p_p) {    double		Actual_PACER_RATE;    int			irq_type = 1;    int			full_flag;    int			status;    unsigned int	minor_number;    unsigned long	RATE = 200;    unsigned long	irqcounter;    unsigned long	local_counter = 0;    program_name_p = arguments_p_p[0];    if (argument_count != 2) {	fprintf(stderr, "Invalid number of options given.\n");	usage();    }    if (sscanf(arguments_p_p[1], "%u", &minor_number) == 0) {	fprintf(stderr, "Invalid device minor number.\n");	usage();    }    fprintf(stdout, "Interrupt example started\n");    fprintf(stdout, "Conversion rate in Hz: ");    scanf("%ld", &RATE);    fprintf(stdout, "IRQ handling mode?\n");    fprintf(stdout, "    [1] Callback\n");    fprintf(stdout, "    [2] Counter poll\n");    fprintf(stdout, "    [3] Counter poll with streaming read\n");    fprintf(stdout, "\nMode: ");    scanf("%d", &irq_type);    switch (irq_type) {	case 1:	case 2:	case 3:	    break;	default:	    fprintf(stderr, "Invalid IRQ handling mode.\n");	    exit(EXIT_FAILURE);	    break;    }    descriptor = OpenBoard6430(minor_number);    verify_success(descriptor, "OpenBoard6430() FAILED");    status = InitBoard6430(descriptor);    verify_success(status, "InitBoard6430() FAILED");    status = SetPacerClock6430(descriptor, RATE, &Actual_PACER_RATE);    verify_success(status, "SetPacerClock6430() FAILED");    status = SetStartTrigger6430(descriptor, DM6430HR_START_TRIG_SOFTWARE);    verify_success(status, "SetStartTrigger6430() FAILED");    status = SetStopTrigger6430(descriptor, DM6430HR_STOP_TRIG_SOFTWARE);    verify_success(status, "SetStopTrigger6430() FAILED");    status = SetConversionSelect6430(descriptor, DM6430HR_CONV_PACER_CLOCK);    verify_success(status, "SetConversionSelect6430() FAILED");    status = SetChannelGain6430(descriptor, ADCHANNEL1, GAIN1, SE_DIFF1);    verify_success(status, "SetChannelGain6430() FAILED");    status = SetIRQ0Source6430(descriptor, IRQS_AD_FIFO_HALF_6430);    verify_success(status, "SetIRQ0Source6430() FAILED");    status = EnableIRQ6430(descriptor, IRQCHANNEL1);    verify_success(status, "EnableIRQ6430() FAILED");    switch (irq_type) {	case 1:	    status = InstallCallbackIRQHandler6430(		descriptor,		speed_test_isr,		IRQCHANNEL1	    );	    verify_success(status, "InstallCallbackIRQHandler6430() FAILED");	    status = StartConversion6430(descriptor);	    verify_success(status, "StartConversion6430() FAILED");	    fprintf(stdout, "Press Enter to exit...\n");	    isstdindata(-1);	    break;		case 2:	    status = StartConversion6430(descriptor);	    verify_success(status, "StartConversion6430() FAILED");	    fprintf(stdout, "Press Enter to exit...\n");	    while (!isstdindata(1)) {		status = GetIRQCounter6430(		    descriptor, IRQCHANNEL1, &irqcounter		);		verify_success(status, "GetIRQCounter6430() FAILED");		status = IsADFIFOFull6430(descriptor, &full_flag);		verify_success(status, "IsADFIFOFull6430() FAILED");   		if (full_flag) {		    fprintf(stdout, "\t\tOverrun found, exit\n");		    break;		}		if (irqcounter != local_counter) {		    int	sample;		    local_counter = irqcounter;		    fprintf(			stdout,			"Channel %d : %ld counts\n",			IRQCHANNEL1,			irqcounter		    );		    for (sample = 0; sample < 512; sample++) {			status = ReadADData6430(			    descriptor, &InputBuffer[sample]			);			verify_success(status, "ReadADData6430() FAILED");		    }        	}    	    }	    break;	case 3:	    status = StartConversion6430(descriptor);	    verify_success(status, "StartConversion6430() FAILED");	    fprintf(stdout, "Press Exter to exit...\n");	    while (!isstdindata(1)) {		status = GetIRQCounter6430(		    descriptor, IRQCHANNEL1, &irqcounter		);		verify_success(status, "GetIRQCounter6430() FAILED");		status = IsADFIFOFull6430(descriptor, &full_flag);		verify_success(status, "IsADFIFOFull6430() FAILED");   		if (full_flag) {		    fprintf(stdout, "\t\tOverrun found, exit\n");		    break;        	}		if (irqcounter != local_counter) {		    local_counter = irqcounter;		    fprintf(			stdout,			"Channel %d : %ld counts\n",			IRQCHANNEL1,			irqcounter		    );		    status = GetAutoincData6430(			descriptor,			rSTR_AD_6430,			DM6430HR_STR_TYPE_WORD,			InputBuffer,			(sizeof(InputBuffer) / 2)		    );		    verify_success(status, "GetAutoincData6430() FAILED");		}	    }	    break;    }    fprintf(stdout, "interrupt example done\n");    status = RemoveIRQHandler6430(descriptor, IRQCHANNEL1);    verify_success(status, "RemoveIRQHandler6430() FAILED");    status = DoneTimer6430(descriptor);    verify_success(status, "DoneTimer6430() FAILED");    exit(EXIT_SUCCESS);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -