Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

USB serial locks up under load #1932

Open
ali1234 opened this issue Sep 15, 2024 · 2 comments
Open

USB serial locks up under load #1932

ali1234 opened this issue Sep 15, 2024 · 2 comments

Comments

@ali1234
Copy link

ali1234 commented Sep 15, 2024

To reproduce, build and flash this code to a Pico (not Pico W because the LED won't blink):

#include <stdio.h>
#include <pico/stdlib.h>

#define LED_PIN 25

int main() {
    stdio_init_all();
    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);
    while(true) {
        gpio_put(LED_PIN, 0);
        getchar();
        gpio_put(LED_PIN, 1);
    }
}

Now on PC run this, redirecting to whatever serial port the Pico is on:

cat /dev/zero | pv > /dev/ttyACM0

Expected result: the LED blinks whenever a character is received, for as long as you leave cat running. (Note it will appear to be always on and dim, because this happens very fast.)

Actual result: the LED stops blinking / turns off after about 1 to 10 seconds. pv shows that data is no longer moving - the port is stalled because it thinks the buffer is full. But the pico is deadlocked inside getchar() presumably because it thinks the buffer is empty. If you run cat again, it will blink again, for a while, and then lock up again.

This seems easier to reproduce in real code on a RP2350, but example code fails on RP2040 as well.

@ali1234
Copy link
Author

ali1234 commented Sep 16, 2024

While attempting to debug this I accidentally left the Pico halted in the debugger which triggers the "XHCI died" linux bug, disabling all USB ports on the host computer and forcing a reboot. After the reboot I could no longer reproduce the serial locking up. I didn't even reflash the Pico after rebooting so it is definitely the same firmware. So this seems like a Linux serial port bug.

@peterharperuk
Copy link
Contributor

I tried your example and couldn't reproduce it either.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants