Listing 1. Real-Time Code Skeleton to Test A/D and D/A Conversion #include #include #include #include #include #include #include #include // #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); }