diff --git a/src/shared/drivers/dma/DMA.h b/src/shared/drivers/dma/DMA.h index 3bb976f0f48391b4631fdd6e1ff1f59cfc462a9b..6fd45988bc063a8d03344a04a3c1e17b31d08c67 100644 --- a/src/shared/drivers/dma/DMA.h +++ b/src/shared/drivers/dma/DMA.h @@ -416,4 +416,28 @@ public: DMAStream& operator=(const DMAStream&) = delete; }; +class DMAStreamGuard +{ +public: + DMAStreamGuard(DMAStream* ptr) : pStream(ptr) {} + + ~DMAStreamGuard() + { + if (pStream != nullptr) + { + DMADriver::instance().releaseStream(pStream->getStreamId()); + } + } + + DMAStreamGuard(const DMAStreamGuard&) = delete; + DMAStreamGuard& operator=(const DMAStreamGuard&) = delete; + + DMAStream* operator->() { return pStream; } + + inline DMAStream* get() { return pStream; } + +private: + DMAStream* pStream = nullptr; +}; + } // namespace Boardcore diff --git a/src/tests/drivers/test-dma-mem-to-mem.cpp b/src/tests/drivers/test-dma-mem-to-mem.cpp index d4970559df83786494acea4fdc851c308bff158b..fcfe2bfee6fe825200cfc28d9b70cecac934af7f 100644 --- a/src/tests/drivers/test-dma-mem-to-mem.cpp +++ b/src/tests/drivers/test-dma-mem-to-mem.cpp @@ -33,10 +33,10 @@ void printBuffer(uint8_t *buffer, size_t size); int main() { - DMAStream *stream = DMADriver::instance().automaticAcquireStreamBlocking( - DMADefs::Peripherals::PE_MEM_ONLY, std::chrono::seconds::zero()); + DMAStreamGuard stream(DMADriver::instance().automaticAcquireStreamBlocking( + DMADefs::Peripherals::PE_MEM_ONLY, std::chrono::seconds::zero())); - if (stream == nullptr) + if (stream.get() == nullptr) { printf("Error, cannot allocate dma stream\n"); return 0;