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 2025 | 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 2025 |
<== Date ==> | <== Thread ==> |
---|
Subject: | Re: Using subArray |
From: | Noboru Yamamoto <[email protected]> |
To: | [email protected] |
Cc: | Michael Abbott <[email protected]>, [email protected] |
Date: | Wed, 30 Nov 2005 09:01:16 +0900 |
Hi, Carl Lionberger wrote:
The thought was that the subarray record would be purely a soft record, and any hardware device support would be for waveform records that the subarray would read from. The MALM code makes sense in this context because the API for the dbaccess (as Noburu alluded to) always starts at element 0 of the source record. Therefore it is impossible to index an element larger than the buffer space you have.In the case of a module which have more memory than the main memory on CPU board, you might want access part of memory using a subarray record.
I completely agree with Carl on using a waveform and a soft subArray record, if your can read entire data into a waveform record and you just need one subarray at a time.
You might consider writing a device support suite which supports a waveform record of the length you want and a couple of ao or longout records which control the index and length of the reference into the hardware..
Carl
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?