summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCédric Berger <[email protected]>2026-02-01 21:08:03 +0100
committerCédric Berger <[email protected]>2026-02-01 21:08:03 +0100
commitb73df6c22e4743f9232f7922fe2cf0fbd05a3a2e (patch)
treecbc738198112e8563fe85e7b78dfdd48c095a01d
parentdc00f3536f7f636ffea639430faa2d828317137c (diff)
Limit events processed by tud_task_ext() / tuh_task_ext()
-rw-r--r--src/device/usbd.c9
-rw-r--r--src/host/usbh.c9
-rw-r--r--src/tusb_option.h10
3 files changed, 24 insertions, 4 deletions
diff --git a/src/device/usbd.c b/src/device/usbd.c
index 1e21c667a..8f3a7a226 100644
--- a/src/device/usbd.c
+++ b/src/device/usbd.c
@@ -666,8 +666,13 @@ void tud_task_ext(uint32_t timeout_ms, bool in_isr) {
return;
}
- // Loop until there is no more events in the queue
- while (1) {
+ // Loop until there are no more events in the queue or CFG_TUD_TASK_EVENTS_PER_RUN is reached
+ for (unsigned epr = 0;; epr++) {
+#if CFG_TUD_TASK_EVENTS_PER_RUN > 0
+ if (epr >= CFG_TUD_TASK_EVENTS_PER_RUN) {
+ TU_LOG_USBD("USBD event limit (" TU_XSTRING(CFG_TUD_TASK_EVENTS_PER_RUN) ") reached\r\n");
+ }
+#endif
dcd_event_t event;
if (!osal_queue_receive(_usbd_q, &event, timeout_ms)) {
return;
diff --git a/src/host/usbh.c b/src/host/usbh.c
index a725b7c8b..cc99c0a53 100644
--- a/src/host/usbh.c
+++ b/src/host/usbh.c
@@ -599,8 +599,13 @@ void tuh_task_ext(uint32_t timeout_ms, bool in_isr) {
return;
}
- // Loop until there is no more events in the queue
- while (1) {
+ // Loop until there are no more events in the queue or CFG_TUH_TASK_EVENTS_PER_RUN is reached
+ for (unsigned epr = 0;; epr++) {
+#if CFG_TUH_TASK_EVENTS_PER_RUN > 0
+ if (epr >= CFG_TUH_TASK_EVENTS_PER_RUN) {
+ TU_LOG_USBH("USBH event limit (" TU_XSTRING(CFG_TUH_TASK_EVENTS_PER_RUN) ") reached\r\n");
+ }
+#endif
hcd_event_t event;
if (!osal_queue_receive(_usbh_q, &event, timeout_ms)) { return; }
diff --git a/src/tusb_option.h b/src/tusb_option.h
index abf5e0608..d34f2b710 100644
--- a/src/tusb_option.h
+++ b/src/tusb_option.h
@@ -560,6 +560,11 @@
#define CFG_TUD_INTERFACE_MAX 16
#endif
+// max events processed in one tud_task_ext() call, 0 for unlimited
+#ifndef CFG_TUD_TASK_EVENTS_PER_RUN
+ #define CFG_TUD_TASK_EVENTS_PER_RUN 16
+#endif
+
// default to max hardware endpoint, but can be smaller to save RAM
#ifndef CFG_TUD_ENDPPOINT_MAX
#define CFG_TUD_ENDPPOINT_MAX TUP_DCD_ENDPOINT_MAX
@@ -679,6 +684,11 @@
#define CFG_TUH_MEM_DCACHE_LINE_SIZE CFG_TUSB_MEM_DCACHE_LINE_SIZE
#endif
+// max events processed in one tuh_task_ext() call, 0 for unlimited
+#ifndef CFG_TUH_TASK_EVENTS_PER_RUN
+ #define CFG_TUH_TASK_EVENTS_PER_RUN 16
+#endif
+
//------------- CLASS -------------//
#ifndef CFG_TUH_HUB