Skip to content

How to manage lifetimes with DMA #905

@Ralim

Description

@Ralim

Hia,

This is probably a misunderstanding; but I'm really not sure how to correctly handle the buffers used for DMA given their 'static requirement that I seem to run into.

For example, given a struct that contains the buffer to be used with DMA

#[derive(Debug, Format)]
pub struct DMAExample{
    buffer: [u32; 16], 
}
impl DMAExample {

  pub fn send<TO, CH>(&mut self, channel: CH, sm_tx: TO) -> (CH, TO)
    where
        CH: SingleChannel,
        TO: WriteTarget<TransmittedWord = u32>,
    {
        let tx_transfer = rp2040_hal::dma::single_buffer::Config::new(channel, &self.buffer, sm_tx).start();
        let (ch, _b, to) = tx_transfer.wait();
        (ch, to)
    }
}

The only way to get this to really work is to make self 'static which isn't really viable with re-use.
This is because I run into rp2040_hal::dma::single_buffer::Config::new requiring a 'static lifetime on the ReadTarget.

Am I missing something that will allow any other lifetime around this? Trying to encapsulate the ownership nicely? Given that the transfer.wait() call returns the buffer, my original plan was to persist the transfer item into the object to retrieve it but can't get that far.

I assume I'm missing something obvious, but also can't seem to find any online examples that deal with this (i.e. dont just use the dma in the main entry function; but actually have the buffer stored elsewhere).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions