Skip to content
Snippets Groups Projects
Commit e5841634 authored by Fabrizio Monti's avatar Fabrizio Monti
Browse files

[DMA] DMAStreams are now allocated inside the std::map, without requiring new...

[DMA] DMAStreams are now allocated inside the std::map, without requiring new and delete operators and reducing the use of pointers.
parent e9de7aae
No related branches found
No related tags found
No related merge requests found
...@@ -247,42 +247,38 @@ namespace Boardcore ...@@ -247,42 +247,38 @@ namespace Boardcore
void DMADriver::IRQhandleInterrupt(DMADefs::DMAStreamId id) void DMADriver::IRQhandleInterrupt(DMADefs::DMAStreamId id)
{ {
auto stream = streams[id]; DMAStream& stream = streams.at(id);
stream->readFlags(); stream.readFlags();
stream->clearAllFlags(); stream.clearAllFlags();
// Run the callbacks if neccessary // Run the callbacks if necessary
if (stream->halfTransferCallback && stream->halfTransferFlag) if (stream.halfTransferCallback && stream.halfTransferFlag)
{ stream.halfTransferCallback();
stream->halfTransferCallback();
} if (stream.transferCompleteCallback && stream.transferCompleteFlag)
if (stream->transferCompleteCallback && stream->transferCompleteFlag) stream.transferCompleteCallback();
{
stream->transferCompleteCallback(); if (stream.errorCallback &&
} (stream.transferErrorFlag || stream.fifoErrorFlag ||
if (stream->errorCallback && stream.directModeErrorFlag))
(stream->transferErrorFlag || stream->fifoErrorFlag ||
stream->directModeErrorFlag))
{ {
stream->errorCallback(); stream.errorCallback();
} }
// Wakeup the thread if the user is waiting // Wakeup the thread if the user is waiting
if (stream->waitingThread) if (stream.waitingThread)
{
IRQwakeupThread(stream); IRQwakeupThread(stream);
} }
}
void DMADriver::IRQwakeupThread(DMAStream* stream) void DMADriver::IRQwakeupThread(DMAStream& stream)
{ {
// Wakeup the waiting thread // Wakeup the waiting thread
stream->waitingThread->wakeup(); stream.waitingThread->wakeup();
// If the waiting thread has a higher priority than the current // If the waiting thread has a higher priority than the current
// thread then reschedule // thread then reschedule
if (stream->waitingThread->IRQgetPriority() > if (stream.waitingThread->IRQgetPriority() >
miosix::Thread::IRQgetCurrentThread()->IRQgetPriority()) miosix::Thread::IRQgetCurrentThread()->IRQgetPriority())
{ {
miosix::Scheduler::IRQfindNextThread(); miosix::Scheduler::IRQfindNextThread();
...@@ -290,7 +286,7 @@ void DMADriver::IRQwakeupThread(DMAStream* stream) ...@@ -290,7 +286,7 @@ void DMADriver::IRQwakeupThread(DMAStream* stream)
// Clear the thread pointer, this way the thread will be sure it is // Clear the thread pointer, this way the thread will be sure it is
// not a spurious wakeup // not a spurious wakeup
stream->waitingThread = nullptr; stream.waitingThread = nullptr;
} }
DMADriver& DMADriver::instance() DMADriver& DMADriver::instance()
...@@ -338,7 +334,9 @@ DMAStreamGuard DMADriver::acquireStreamBlocking( ...@@ -338,7 +334,9 @@ DMAStreamGuard DMADriver::acquireStreamBlocking(
// if (streams.size() == 0) // if (streams.size() == 0)
// RCC->AHB1ENR |= RCC_AHB1ENR_DMA1EN; // RCC->AHB1ENR |= RCC_AHB1ENR_DMA1EN;
return DMAStreamGuard((streams[id] = new DMAStream(id, channel))); streams.insert(
std::pair<DMADefs::DMAStreamId, DMAStream>(id, DMAStream(id, channel)));
return DMAStreamGuard(&(streams.at(id)));
} }
DMAStreamGuard DMADriver::automaticAcquireStreamBlocking( DMAStreamGuard DMADriver::automaticAcquireStreamBlocking(
...@@ -361,7 +359,9 @@ DMAStreamGuard DMADriver::automaticAcquireStreamBlocking( ...@@ -361,7 +359,9 @@ DMAStreamGuard DMADriver::automaticAcquireStreamBlocking(
if (streams.count(id) == 0) if (streams.count(id) == 0)
{ {
// Stream is free // Stream is free
return DMAStreamGuard(streams[id] = new DMAStream(id, channel)); streams.insert(std::pair<DMADefs::DMAStreamId, DMAStream>(
id, DMAStream(id, channel)));
return DMAStreamGuard(&(streams.at(id)));
} }
} }
...@@ -388,7 +388,6 @@ void DMADriver::releaseStream(DMADefs::DMAStreamId id) ...@@ -388,7 +388,6 @@ void DMADriver::releaseStream(DMADefs::DMAStreamId id)
if (streams.count(id) != 0) if (streams.count(id) != 0)
{ {
delete streams[id];
streams.erase(id); streams.erase(id);
cv.broadcast(); cv.broadcast();
} }
......
...@@ -134,11 +134,11 @@ public: ...@@ -134,11 +134,11 @@ public:
private: private:
DMADriver(); DMADriver();
void IRQwakeupThread(DMAStream* stream); void IRQwakeupThread(DMAStream& stream);
miosix::FastMutex mutex; miosix::FastMutex mutex;
miosix::ConditionVariable cv; miosix::ConditionVariable cv;
std::map<DMADefs::DMAStreamId, DMAStream*> streams; std::map<DMADefs::DMAStreamId, DMAStream> streams;
public: public:
DMADriver(const DMADriver&) = delete; DMADriver(const DMADriver&) = delete;
...@@ -396,9 +396,7 @@ private: ...@@ -396,9 +396,7 @@ private:
else else
{ {
while (!getEventStatus()) while (!getEventStatus())
{
readFlags(); readFlags();
}
result = true; result = true;
} }
...@@ -415,6 +413,9 @@ private: ...@@ -415,6 +413,9 @@ private:
public: public:
DMAStream(const DMAStream&) = delete; DMAStream(const DMAStream&) = delete;
DMAStream& operator=(const DMAStream&) = delete; DMAStream& operator=(const DMAStream&) = delete;
DMAStream(DMAStream&&) noexcept = default;
DMAStream& operator=(DMAStream&&) noexcept = default;
}; };
/** /**
...@@ -428,10 +429,8 @@ public: ...@@ -428,10 +429,8 @@ public:
~DMAStreamGuard() ~DMAStreamGuard()
{ {
if (pStream != nullptr) if (pStream != nullptr)
{
DMADriver::instance().releaseStream(pStream->getStreamId()); DMADriver::instance().releaseStream(pStream->getStreamId());
} }
}
DMAStreamGuard(const DMAStreamGuard&) = delete; DMAStreamGuard(const DMAStreamGuard&) = delete;
DMAStreamGuard& operator=(const DMAStreamGuard&) = delete; DMAStreamGuard& operator=(const DMAStreamGuard&) = delete;
......
...@@ -91,9 +91,7 @@ int main() ...@@ -91,9 +91,7 @@ int main()
void printBuffer(uint8_t* buffer, size_t size) void printBuffer(uint8_t* buffer, size_t size)
{ {
for (size_t i = 0; i < size - 1; i++) for (size_t i = 0; i < size - 1; i++)
{
printf("%x,", buffer[i]); printf("%x,", buffer[i]);
}
printf("%x\n", buffer[size - 1]); printf("%x\n", buffer[size - 1]);
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment