Ø
Could it be that for that ASYN_MULTIDEVICE the callbacks are somehow all counted for the first channel?
No, this should work fine.
Pawel, please send the output of the following commands at the IOC shell prompt:
dbpr waveform1 10
dbpr waveform2 10
dbpr waveform3 10
dbpr waveform4 10
where waveform1-4 are the names of your waveform records.
Mark
From: [email protected] [mailto:[email protected]]
On Behalf Of Ralph Lange
Sent: Tuesday, April 11, 2017 1:06 PM
To: EPICS Tech Talk
Subject: Re: [AsynPortDriver] "Multiple interrupt callbacks between processing" warning with multiple arrays
But why is it only reporting for the first of the four channels?
Could it be that for that ASYN_MULTIDEVICE the callbacks are somehow all counted for the first channel?
On Tue, Apr 11, 2017 at 6:24 PM, Mark Rivers <[email protected]> wrote:
Hi Pawel,
What is the SCAN field of your waveform record? I suspect it is probably periodic ("1 second", etc.). For this application you should set it to SCAN="I/O Intr". Then the waveform record will process each time your driver does a callback to device support.
If the record is periodically processing at 1 second and your driver is doing callbacks faster than 1 Hz then you will see the error you report.
Mark
-----Original Message-----
From: [email protected] [mailto:[email protected]] On Behalf Of Pawel Plewinski
Sent: Tuesday, April 11, 2017 8:49 AM
To: [email protected]
Subject: [AsynPortDriver] "Multiple interrupt callbacks between processing" warning with multiple arrays
Hi,
I've recently written asyn-based device support for a custom device
communicating over PCIe. One of its functions is to periodically
retrieve 4 waveforms from 4 channels, which is done in a separate
thread, from which the callback function is called to notify asyn about
change. I heavily based the code on the AsynPortDriver example.
The driver works, however if the update rate is lower than 1 second,
strange warning appears in the console at the time of every refresh (and
that's only for one of 4 channels), namely:
2017/04/11 15:42:08.682 PIEZO:OSC-CH0-WAVEFORM
devAsynFloat64Array::interruptCallbackInput
\000\000\000\000\000@\205?\000\000\000\000\000\300\202?\000\000\000\000\000\000\204?\000\000\000\000\000\000\204?\000\000\000\000\000\300\202?\000\000\000\000\000\000\204?\000\000\000\000\000@\205?\000\000\000\000\000\000\204?\000\000\000\000\000\300\202?\000\000\000\000\000\000\204?
2017/04/11 15:42:08.682 PIEZO:OSC-CH0-WAVEFORM
devAsynFloat64Array::processCommon, warning, multiple interrupt
callbacks between processing
The parameters passed to the top level constructor are
: asynPortDriver(portName,
4, /* maxAddr */
(int)NUM_SCOPE_PARAMS,
asynInt32Mask | asynFloat64Mask |
asynFloat64ArrayMask | asynEnumMask | asynDrvUserMask, /* Interface mask
*/
asynInt32Mask | asynFloat64Mask |
asynFloat64ArrayMask | asynEnumMask, /* Interrupt mask */
ASYN_MULTIDEVICE, /* asynFlags. This driver does
not block and it is not multi-device, so flag is 0 */
1, /* Autoconnect */
0, /* Default priority */
0) /* Default stack size*/
The readback thread code:
void piezoPortDriver::readbackTask(void)
{
while (1) {
bool stopped = false;
lock();
auto new_data = osc->fetch_data(vtim, vdat);
unlock();
if (!stopped)
{
lock();
this->osc_update_trigger();
unlock();
}
callParamCallbacks();
for (int i = 0; i < 4; i++){
doCallbacksFloat64Array(vdat[i].data(), vdat[i].size(),
P_OscWaveform, i);
}
usleep(100000);
}
}
The fetch_data method reads four 1000-element double vectors from PCIe.
Could you give me some suggestions what may be wrong?
Regards,
Paweł Plewiński
Department of Microelectronics and Computer Science
Lodz University of Technology
|