Hi Mark,
I have a problem, which I have been ignoring for a while.
I have a device driver for a VME module based on asynPortDriver class. It is used with asyn R4.18, EPICS R3.14.12.2, vxWorks 6.6.
I have coded a couple of routines to disable interrupts when the IOC is shutdown (with CTRL-X), which does not work. Restarting the IOC which uses the asyn based driver with CTRL-X fails to come up. The IOC reaches some point in the booting sequence and then I suppose it crashes because the boot starts all over. I recover from that with a VME reset. Also, if I disable interrupts before rebooting all works fine.
I have created another device driver using the conventional approach, which does not use asyn. As far as I can tell most of the code if not the same is equivalent. With this device driver the interrupts get disabled on exit.
This is what I have in the asynPortDriver version of the device driver:
In the constructor I have:
epicsAtExit( rebootCbC,this);
then I have:
extern "C"{
…
static void rebootCbC( void* pvt){
drvV792* pthis=(drvV792*)pvt;
pthis->rebootCb();
}
}
void drvV792::rebootCb(){
//------------------------------------------------------------------------------
printf( "%s::rebootCb: Interrupts disabled and Soft reset\n",dname);
fflush(stdout);
epicsThreadSleep(1.0);
_wtReg( ILEV,0);
_wtReg( EVTR,0);
}
Writing 0 to the EVTR disables interrupts. Also writing 0 to the ILEV register disables interrupts.
In fact, the same rebootCB code, seems to work fine in the non-asyn driver.
Is something subtle taking place because of vxWorks?
Can you offer suggestion on how to make it work?
Thanks in advance,
Zen