📄 dm6430-speed-test.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 + -