Hi Mark,
I don't see the printf message in the console output. I see no evidence that rebootCB() is called.
This is how I have implemented the _wtReg function:
asynStatus drvV792::_wtReg( uint off,word v){
//------------------------------------------------------------------------------
// Reads a register at off offset wrt base and returns the read value in v.
//------------------------------------------------------------------------------
volatile word* padr=(word*)(_pmem+off);
if(!_pmem) return(asynError);
*padr=v;
//printf( "%s::_wtReg: off=0x%x, v=%d\n",dname,off,v);
return(asynSuccess);
}
I will try the read after write in rebootCB().
Thank you Mark,
Zen
> -----Original Message-----
> From: Mark Rivers [mailto:[email protected]]
> Sent: Wednesday, June 27, 2012 9:01 PM
> To: Szalata, Zenon M.; Williams Jr., Ernest L.
> Cc: [email protected]
> Subject: RE: epicsAtExit
>
> Hi Zen,
>
> With the asyn driver do you see the printf message, i.e. is the
> drvV792::rebootCb() function being called?
>
> Perhaps the VME writes to disable interrupts are not actually being done
> because they are cached, and the cache is never flushed before the system
> shuts down. Have you declared ILEV and EVTR to be volatile? What happens if
> you do a read from those registers after the writes, which should flush the
> cache?
>
> Mark
>
> ________________________________
> From: Szalata, Zenon M. [[email protected]]
> Sent: Wednesday, June 27, 2012 7:40 PM
> To: Mark Rivers; Williams Jr., Ernest L.
> Cc: [email protected]
> Subject: epicsAtExit
>
> 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
- Replies:
- RE: epicsAtExit Mark Rivers
- Re: epicsAtExit Andrew Johnson
- References:
- epicsAtExit Szalata, Zenon M.
- RE: epicsAtExit Mark Rivers
- Navigate by Date:
- Prev:
Re: LabVIEW EPICS connection Dale L. Brewe
- Next:
RE: epicsAtExit Mark Rivers
- Index:
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
<2012>
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
- Navigate by Thread:
- Prev:
Re: epicsAtExit Eric Norum
- Next:
RE: epicsAtExit Mark Rivers
- Index:
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
<2012>
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
|