Hi Zen,
If you don't see the printf message in the console output then something is wrong.
My IpUnidig driver does exactly the same thing your driver does: register a C-linkage callback function with epicsAtExit, which in turn calls a C++ class member function. I just added a printf to the C++ member function, and it does print the message when I type "reboot" at the vxWorks prompt.
void IpUnidig::rebootCallback()
{
ipUnidigRegisters r = regs_;
printf("IpUnidig::rebootCallback, disabling interrupts\n");
fflush(stdout);
epicsThreadSleep(0.5);
*r.intEnableRegisterLow = 0;
*r.intEnableRegisterHigh = 0;
rebooting_ = 1;
}
ioc13lab> reboot
IpUnidig::rebootCallback, disabling interrupts
Note that until I added the epicsThreadSleep(0.5) my printf message was truncated, and it is possible you would not see it at all in spite of the fflush(). Try adding the epicsThreadSleep() to make sure the printf message is indeed not being printed.
Mark
-----Original Message-----
From: Szalata, Zenon M. [mailto:[email protected]]
Sent: Thursday, June 28, 2012 11:10 AM
To: Mark Rivers; Williams Jr., Ernest L.
Cc: [email protected]
Subject: RE: epicsAtExit
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 Szalata, Zenon M.
- References:
- epicsAtExit Szalata, Zenon M.
- RE: epicsAtExit Mark Rivers
- RE: epicsAtExit Szalata, Zenon M.
- Navigate by Date:
- Prev:
RE: epicsAtExit Szalata, Zenon M.
- Next:
Re: epicsAtExit Andrew Johnson
- 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 Szalata, Zenon M.
- Next:
RE: epicsAtExit Szalata, Zenon M.
- 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
|