1010// ----------------------------------------------------------------------------
1111
1212#include <modm/platform/device.hpp>
13+ #include <modm/processing/fiber.hpp>
1314#include "itm.hpp"
1415
1516%% if options["buffer.tx"]
@@ -74,14 +75,18 @@ Itm::enable(uint8_t prescaler)
7475void
7576Itm::writeBlocking(uint8_t data)
7677{
77- while(not write(data)) ;
78+ modm::this_fiber::poll([&]{ return write(data); }) ;
7879}
7980
8081void
8182Itm::flushWriteBuffer()
8283{
8384%% if options["buffer.tx"]
84- while(!isWriteFinished()) update();
85+ while(!isWriteFinished())
86+ {
87+ update();
88+ modm::this_fiber::yield();
89+ }
8590%% else
8691 return;
8792%% endif
9196Itm::write(uint8_t data)
9297{
9398%% if options["buffer.tx"]
99+ update();
94100 if (txBuffer.push(data)) return true;
95101 update();
96102 return txBuffer.push(data);
@@ -109,16 +115,6 @@ Itm::write(const uint8_t *data, std::size_t length)
109115 return sent;
110116}
111117
112- bool
113- Itm::isWriteFinished()
114- {
115- %% if options["buffer.tx"]
116- return txBuffer.isEmpty();
117- %% else
118- return true;
119- %% endif
120- }
121-
122118std::size_t
123119Itm::discardTransmitBuffer()
124120{
@@ -138,6 +134,16 @@ Itm::discardTransmitBuffer()
138134#undef PORT
139135%% endif
140136
137+ bool
138+ Itm::isWriteFinished()
139+ {
140+ %% if options["buffer.tx"]
141+ return txBuffer.isEmpty() and ITM->PORT[0].u32 != 0;
142+ %% else
143+ return ITM->PORT[0].u32 != 0;
144+ %% endif
145+ }
146+
141147bool
142148Itm::write_itm(uint32_t data, uint8_t size)
143149{
0 commit comments