03-21-2019 11:39 AM
Hello,
I don't know if this is the proper Forum, but I'm trying to build a kernel module which uses DAQmx in a CentOs7.5. So far I've installed DAQmx for linux and successfully built an user space application given as an example by NI and I've tried to build a similar application in kernel space. When I tried to compile that I got this message :
"WARNING: "DAQmxStopTask" [...] undefined!"
I know that this message normally happens if a dependence is not properly set or loaded, but I know, through lsmod, that ni's modules are loaded in my machine, so I'd like to know how to proper interface DAQmx to a kernel module.
For reference, here is my code
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <linux/stringify.h>
#include <linux/cdev.h>
#include <asm/io.h>
#include <NIDAQmx.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Victor Costa");
MODULE_DESCRIPTION("DAQMX_LOADER using drivers");
MODULE_VERSION("0.1");
static int error=0;
static char errBuff[2048]={'\0'};
static TaskHandle taskHandle=0;
static double data[1000];
static void error_handler(void);
static int CVICALLBACK DoneCallback(TaskHandle taskHandle, int status, void *callbackData);
#define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else
static int __module_init (void)
{
printk(KERN_DEBUG "DAQMX<1>: Loading Module\n");
for(int i=0;i<1000;i++)
data[i] = 9.95;
DAQmxErrChk (DAQmxCreateTask("",&taskHandle));
DAQmxErrChk (DAQmxCreateAOVoltageChan(taskHandle,"Dev1/ao0","",-10.0,10.0,DAQmx_Val_Volts,NULL));
DAQmxErrChk (DAQmxCfgSampClkTiming(taskHandle,"",1000.0,DAQmx_Val_Rising,DAQmx_Val_ContSamps,1000));
DAQmxErrChk (DAQmxRegisterDoneEvent(taskHandle,0,DoneCallback,NULL));
/*********************************************/
// DAQmx Write Code
/*********************************************/
DAQmxErrChk (DAQmxWriteAnalogF64(taskHandle,1000,0,10.0,DAQmx_Val_GroupByChannel,data,NULL,NULL));
/*********************************************/
// DAQmx Start Code
/*********************************************/
DAQmxErrChk (DAQmxStartTask(taskHandle));
Error: error_handler();
return 0;
}
static void __module_exit (void)
{
printk(KERN_DEBUG "DAQMX<1>: Unloading Module\n");
}
module_init(__module_init);
module_exit(__module_exit);
static void error_handler(void)
{
if( DAQmxFailed(error) )
DAQmxGetExtendedErrorInfo(errBuff,2048);
if( taskHandle!=0 ) {
/*********************************************/
// DAQmx Stop Code
/*********************************************/
DAQmxStopTask(taskHandle);
DAQmxClearTask(taskHandle);
}
if( DAQmxFailed(error) )
printk(KERN_DEBUG"DAQMX<1> Error: %s\n",errBuff);
}
static int CVICALLBACK DoneCallback(TaskHandle taskHandle, int32 status, void *callbackData)
{
char errBuff[2048]={'\0'};
// Check to see if an error stopped the task.
DAQmxErrChk (status);
Error:
if( DAQmxFailed(error) ) {
DAQmxGetExtendedErrorInfo(errBuff,2048);
DAQmxClearTask(taskHandle);
printk(KERN_DEBUG"DAQMX<1> Error: %s\n",errBuff);
}
return 0;
}