EPICS Controls Argonne National Laboratory

Experimental Physics and
Industrial Control System

1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  <20052006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  2022  2023  2024  Index 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  <20052006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  2022  2023  2024 
<== Date ==> <== Thread ==>

Subject: Re: Using subArray
From: Noboru Yamamoto <[email protected]>
To: Michael Abbott <[email protected]>
Cc: [email protected]
Date: Mon, 28 Nov 2005 10:50:40 +0900
Michael Abbott wrote:
I am writing device support for a subArray record so that I can read small slices from a very large array provided by a device. The device in question has limited memory, and so I cannot afford more than one copy of this array in memory, namely the copy in the device driver itself. My plan is to read the data like this:

    record(subArray, "SA")
    {
        field(DTYP, "My driver")
        field(INP,  "my driver's arguments")
        field(MALM, "1024")
        field(FTVL, "LONG")
    }

    $ caput SA.NELM 1024
    $ caput SA.INDX 1024000
    $ caput SA.PROC 0
    $ caget SA

Unfortunately there is one very interesting and annoying fly in the ointment. In subArrayRecord.c:readValue we see the following two lines of code:

    if (psa->indx >= psa->malm)
        psa->indx = psa->malm - 1;

Ooops. Most unhelpful!

This stupid code means that MALM, which is used to allocate the storage used by the subArray record, also determines the maximum index into the device array. I think this is missing the point of a subArray; it certainly gets in my way.

Now, it turns out I am lucky: malm is used to allocate storage *before* it calls my init_record, so I can fake malm back to the value I want to to be. However, this is hardly very satisfactory, and is going to have a mildly embarassing side effect: get_{graphic,control}_double will return bogus values for the upper limit on nelm.

Any thoughts on this?
We had similar problem when we tarted to construct KEKB control system.
So we developed a new record called Compact Subarray record. It just
copys amount it needs from a source record.
We need to add new API in dbaccess library, which is not present in the standard EPICS base, to support this record.


If you have an interest on this record, I will be happy to send source code.

Regards,

Noboru YAMAMOTO
EPICS group
KEK, JAPAN



References:
Using subArray Michael Abbott

Navigate by Date:
Prev: environmental variables Xu HuiJuan
Next: RE: Using subArray Abbott, MG (Michael)
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  <20052006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  2022  2023  2024 
Navigate by Thread:
Prev: Using subArray Michael Abbott
Next: Re: Using subArray Carl Lionberger
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  <20052006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  2022  2023  2024 
ANJ, 02 Sep 2010 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·