Skip to content

RP2040: USB CDC output drops characters with -scheduler=cores on TinyGo 0.41.1 #5377

@rdon-key

Description

@rdon-key

Summary

On Raspberry Pi Pico / RP2040, USB CDC output appears to drop characters when using -scheduler=cores.

The same program prints correctly with TinyGo 0.40.1, but the output becomes corrupted with TinyGo 0.41.1.

Environment

  • Board: Raspberry Pi Pico / RP2040
  • Host OS: Windows 11
  • CPU: AMD Ryzen 5 5600G
  • Shell: Git Bash / MINGW64
  • Install method: Scoop
  • USB connection: onboard USB CDC
  • Serial monitor: tinygo flash -monitor
  • TinyGo 0.40.1:
    • tinygo version 0.40.1 windows/amd64 (using go version go1.24.13 and LLVM version 20.1.1)
  • TinyGo 0.41.1:
    • tinygo version 0.41.1 windows/amd64 (using go version go1.24.13 and LLVM version 20.1.1)

Reproducer

package main

import "time"

func main() {
	time.Sleep(2 * time.Second)

	println("start usb only")

	for i := 0; i < 100; i++ {
		if i == 0 || i%10 == 0 {
			println("rounds ok:", i, "/ 100")
		}
		time.Sleep(10 * time.Millisecond)
	}

	println("test finished")
}

Commands

TinyGo 0.40.1:

scoop reset tinygo@0.40.1
C:/Users/user/scoop/shims/tinygo.exe flash -target=pico -scheduler=cores -monitor main_usb_only.go

TinyGo 0.41.1:

scoop reset tinygo@0.41.1
C:/Users/user/scoop/shims/tinygo.exe flash -target=pico -scheduler=cores -monitor main_usb_only.go

I also checked -scheduler=tasks with TinyGo 0.41.1:

C:/Users/user/scoop/shims/tinygo.exe flash -target=pico -scheduler=tasks -monitor main_usb_only.go

Observed behavior

With TinyGo 0.40.1 and -scheduler=cores, the output appears correct:

Connected to COM3. Press Ctrl-C to exit.
start usb only
rounds ok: 0 / 100
rounds ok: 10 / 100
rounds ok: 20 / 100
rounds ok: 30 / 100
rounds ok: 40 / 100
rounds ok: 50 / 100
rounds ok: 60 / 100
rounds ok: 70 / 100
rounds ok: 80 / 100
rounds ok: 90 / 100
test finished

With TinyGo 0.41.1 and -scheduler=cores, the output drops characters:

Connected to COM3. Press Ctrl-C to exit.
ds ok:  100y
rounds ok: 10 / 100
rounds ok: 20 / 100
rounds ok: 30 / 100
rk: 40 / 100
rou 100
rnds ok: 60
rounds ok: 70 / 100
rounds ok: 80 / 100
r100
test finished

With TinyGo 0.41.1 and -scheduler=tasks, the same program prints correctly:

Connected to COM3. Press Ctrl-C to exit.
start usb only
rounds ok: 0 / 100
rounds ok: 10 / 100
rounds ok: 20 / 100
rounds ok: 30 / 100
rounds ok: 40 / 100
rounds ok: 50 / 100
rounds ok: 60 / 100
rounds ok: 70 / 100
rounds ok: 80 / 100
rounds ok: 90 / 100
test finished

Expected behavior

USB CDC output should not drop characters when using -scheduler=cores.

The output should be consistent with the behavior of TinyGo 0.40.1 and with -scheduler=tasks.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions