Listing 1. Real-Time Code Skeleton to Test A/D and D/A Conversion

#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <rtl.h>
#include <time.h>
#include <rtl_fifo.h>

// #includes for DAQ cards here

#define PERIODIC_FREQ_HZ        10000.0
#define FRAME_PERIOD_NS
  ((hrtime_t)((1.0/PERIODIC_FREQ_HZ)*1000000000.0))

pthread_t periodic_thread;
int AI_board_handle = 0;
int AO_board_handle = 1;

void *Periodic_entry_point(void)
{
     static double volts[MAX_RESULT_QTY+1];
     static u16 adc_data[MAX_RESULT_QTY];
     static u16 dac_data0;
pthread_make_periodic_np(pthread_self(),
                      gethrtime(),FRAME_PERIOD_NS);
pthread_setfp_np(pthread_self(),1);

// Initialize DAQ boards here

while (1)
{
    pd_ain_get_samples(AI_board_handle,
                        MAX_RESULT_QTY,
                        adc_data, &samples);

  for (i = 0; i < (CL_SIZE+1); i++)
   {volts[i+1]=
     ((float)(adc_data[i]^0x8000)*.00030518)-10.0;}
    //  output to AO board
        dac_data0 = (volts[1]+10.0)*3276.6;
        ret = pd_ao32_writex(AO_board_handle, 0,
                               dac_data0,0,0);
       pd_ain_sw_cl_start(AI_board_handle);
   // multiplies for timing test
         for (i = 0; i < 5000; i++) z=x*y;
         pthread_wait_np();
     }
}

int init_module(void)
{
   pthread_attr_t attrib;
   sched_param.sched_priority
     sched_get_priority_max(SCHED_FIFO);
   pthread_attr_setschedparam(&attrib,&sched_param);
// create the thread
   pthread_create(&periodic_thread, &attrib,
                    Periodic_entry_point,NULL);
   pthread_wakeup_np(periodic_thread);
}

void cleanup_module(void)
{
     pthread_delete_np(periodic_thread);
}

