From a215fc47bbc8b0e75619a0bdcfd6953aa049fcfd Mon Sep 17 00:00:00 2001 From: Angus Gratton Date: Thu, 4 Apr 2024 15:44:50 +1100 Subject: [PATCH] usb-device-cdc: Fix short delays when timeout is 0. Previously even with timeout set to zero, a read could block for up to 1ms + machine.idle() timeout period. This work was funded through GitHub Sponsors. Signed-off-by: Angus Gratton --- micropython/usb/usb-device-cdc/usb/device/cdc.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/micropython/usb/usb-device-cdc/usb/device/cdc.py b/micropython/usb/usb-device-cdc/usb/device/cdc.py index d96dff21..46509ad0 100644 --- a/micropython/usb/usb-device-cdc/usb/device/cdc.py +++ b/micropython/usb/usb-device-cdc/usb/device/cdc.py @@ -367,9 +367,11 @@ class CDCInterface(io.IOBase, Interface): mv = mv[nbytes:] # check for timeout - if time.ticks_diff(time.ticks_ms(), start) > self._timeout: + if time.ticks_diff(time.ticks_ms(), start) >= self._timeout: return len(buf) - len(mv) + machine.idle() + def read(self, size): start = time.ticks_ms() @@ -404,7 +406,7 @@ class CDCInterface(io.IOBase, Interface): if n == len(b): break # Done, exit before we reach the sleep - if time.ticks_diff(time.ticks_ms(), start) > self._timeout: + if time.ticks_diff(time.ticks_ms(), start) >= self._timeout: break # Timed out machine.idle()