hi anders,

because that's the time-honored way to get robustness and relative simplicity at once, as in graphics applications that write to one buffer while drawing the other.

in answer to your second question, no; a well-mannered application only bites off what it can chew. conversely, it won't really require more buffers than two, especially on a limited-resource platform. the more data you cache, the more time you must allocate to deliver it. a continually-sampling application's duty cycle is typically much too high to juggle that much data without dropping some.

of course, the code is open-source, so you are free to experiment with these details to your heart's delight!

-steve

On 05/10/2011 11:21 AM, Anders Christian Sørensen wrote:
Hi Mike,

Thanks for the quick reply.

But why choose only two buffers, then? Couldn't there potentially be
more than one interrupt which would cause sbuf1 to be overwritten as well?

--Anders

On May 10, 2011, at 5:17 PM, mike healy wrote:

Hi Anders,

DMA0.RepeatTransfer(...) with sbuf1 when the current buffer is 0 tells
the DMA module on the MSP430 to transfer data to sbuf1 next time it
runs (which will be the next time shimmerAnalogSetup.
triggerConversion() in called in SampleTimer.fired()).
DMA0.RepeatTranser() does not move any data around.

This is to give the shimmer a chance to send the data from sbuf0 with
no fear of it being overwritten by the DMA (which operates in
event/interrupt context and so can preempt a task).

Mike


On Tue, May 10, 2011 at 4:03 PM, Anders Christian Sørensen
<[email protected] <mailto:[email protected]>> wrote:

    Hi,

    I'm wrapping my head around the BoilerPlate firmware, specifically
    the call graph and flow of data. So far so good, but I'm curious
    about the usage of the 'current_buffer' variable.

    async event void DMA0.transferDone(error_t success) {
    if(current_buffer == 0){
    call DMA0.repeatTransfer((void*)ADC12MEM0_, (void*)sbuf1,
    nbr_adc_chans);
    atomic timestamp1 = call LocalTime.get();
    //current_buffer = 1;
    }
    else {
    call DMA0.repeatTransfer((void*)ADC12MEM0_, (void*)sbuf0,
    nbr_adc_chans);
    atomic timestamp0 = call LocalTime.get();
    //current_buffer = 0;
    }
    if(nbr_digi_chans > 0)
    post clockin_result();
    else
    post sendSensorData();
    }

    This is the event handler where it starts. During the first
    sampling, the DMA0 is setup with 'sbuf0' as destination for the
    sensor data and 'current_buffer' i 0. Good. Now, when the first
    sampling is done and the data is ready in the DMA0, this data is
    accessible through 'sbuf0'. But why does this event handler then
    call DMA0.RepeatTransfer(...) with 'sbuf1' when 'current_buffer'
    is 0? To my best knowledge, at this point 'sbuf0' and 'sbuf1' will
    contain the same data.

    Am I wrong?

    Kind regards,
    Anders
    _______________________________________________
    Shimmer-users mailing list
    [email protected] <mailto:[email protected]>
    https://lists.eecs.harvard.edu/mailman/listinfo/shimmer-users





_______________________________________________
Shimmer-users mailing list
[email protected]
https://lists.eecs.harvard.edu/mailman/listinfo/shimmer-users

_______________________________________________
Shimmer-users mailing list
[email protected]
https://lists.eecs.harvard.edu/mailman/listinfo/shimmer-users

Reply via email to