VisualTeensy, TeensyDebug and Audio


I'm struggling to get TeensyDebug to work with the Audio library, from within a VisualTeensy VS Code project.

If I compile the exact same code inside Teensyduino it does work as expected.

The code:
#include <Audio.h>
#include <Wire.h>
#include <SD.h>
#include <SPI.h>
#include <SerialFlash.h>
#include <TeensyDebug.h>

AudioSynthWaveform    waveform1;
AudioOutputI2S        i2s1;
AudioConnection       patchCord1(waveform1, 0, i2s1, 0);
AudioConnection       patchCord2(waveform1, 0, i2s1, 1);
AudioControlSGTL5000  sgtl5000_1;

void setup() {
  digitalWrite(LED_BUILTIN, HIGH);

void loop() {

Expected outcome: The built-in LED is on, while a sine audio tone is played. This is what happens when compiling with Teensyduino.

But when I compile my VS Code project (generated with VisualTeensy) the LED flashes rapidly and there is no audio tone. Also - there are no serial ports detected.
I suspect that the Teensy is resetting continuously?

Any help would be appreciated.

My setup:
Windows 10
Arduino 1.8.13
Teensyduino 1.53
h/w: Teensy 4.1 & Audio daughter-board
Sure, see the end of this post. It is then the makefile as generated by VisualTeensy.

I compared the commands that Teensyduino and VS Code used to compile my .cpp files - as far as I could see they used identical options.
Not sure about linking etc.

# Generated by VisualTeensy (
# Board              Teensy 4.1
# USB Type           Dual Serial
# CPU Speed          600 MHz
# Optimize           Debug
# Keyboard Layout    US English
# 2021/08/01 12:18
SHELL            := cmd.exe
export SHELL

TARGET_NAME      := MyApp
BOARD_ID         := TEENSY41

MCU              := imxrt1062

LIBS_SHARED_BASE := C:\Users\tviljoen\Documents\Arduino\libraries
LIBS_SHARED      := 

LIBS_LOCAL       := Audio SD SerialFlash SPI Wire TeensyDebug

CORE_BASE        := C:\Technical\Teensy\arduino-1.8.13_1.53\hardware\teensy\avr\cores\teensy4
GCC_BASE         := C:\Technical\Teensy\arduino-1.8.13_1.53\hardware\tools\arm\bin
UPL_PJRC_B       := C:\Technical\Teensy\arduino-1.8.13_1.53\hardware\tools
UPL_TYCMD_B      := C:\Technical\Teensy\arduino-1.8.13_1.53\hardware\tools

# Flags and Defines
FLAGS_CPU   := -mthumb -mcpu=cortex-m7 -mfloat-abi=hard -mfpu=fpv5-d16
FLAGS_OPT   := -Og
FLAGS_COM   := -g -Wall -ffunction-sections -fdata-sections -nostdlib -MMD

FLAGS_CPP   := -std=gnu++14 -fno-exceptions -fpermissive -fno-rtti -fno-threadsafe-statics -felide-constructors -Wno-error=narrowing
FLAGS_C     := 
FLAGS_S     := -x assembler-with-cpp
FLAGS_LD    := -Wl,--print-memory-usage,--gc-sections,--relax,--defsym=__rtc_localtime=$(shell powershell [int](Get-Date -UFormat +%s)[0]) -T$(CORE_BASE)/imxrt1062_t41.ld

LIBS        := -larm_cortexM7lfsp_math -lm -lstdc++


AR_FLAGS    := rcs
NM_FLAGS    := --numeric-sort --defined-only --demangle --print-size

# Colors
COL_CORE    := 
COL_LIB     := 
COL_SRC     := 
COL_LINK    := 
COL_ERR     := 
COL_OK      := 

# Folders and Files
USR_SRC         := src
LIB_SRC         := lib
CORE_SRC        := $(CORE_BASE)

BIN             := .vsteensy/build
USR_BIN         := $(BIN)/src
CORE_BIN        := $(BIN)/core
LIB_BIN         := $(BIN)/lib
CORE_LIB        := $(BIN)/core.a
TARGET_HEX      := $(BIN)/$(TARGET_NAME).hex
TARGET_ELF      := $(BIN)/$(TARGET_NAME).elf
TARGET_LST      := $(BIN)/$(TARGET_NAME).lst
TARGET_SYM      := $(BIN)/$(TARGET_NAME).sym

CC              := $(GCC_BASE)/arm-none-eabi-gcc
CXX             := $(GCC_BASE)/arm-none-eabi-g++
AR              := $(GCC_BASE)/arm-none-eabi-gcc-ar
NM              := $(GCC_BASE)/arm-none-eabi-gcc-nm
SIZE            := $(GCC_BASE)/arm-none-eabi-size
OBJDUMP         := $(GCC_BASE)/arm-none-eabi-objdump
OBJCOPY         := $(GCC_BASE)/arm-none-eabi-objcopy
UPL_PJRC        := "$(UPL_PJRC_B)/teensy_post_compile" -test -file=$(TARGET_NAME) -path=$(BIN) -tools="$(UPL_PJRC_B)" -board=$(BOARD_ID) -reboot
UPL_TYCMD       := $(UPL_TYCMD_B)/tyCommanderC upload $(TARGET_HEX) --autostart --wait --multi
UPL_CLICMD      := $(UPL_CLICMD_B)/teensy_loader_cli -mmcu=$(MCU) -v $(TARGET_HEX)
UPL_JLINK       := $(UPL_JLINK_B)/jlink -commanderscript .vsteensy/flash.jlink

# Source and Include Files
# Recursively create list of source and object files in USR_SRC and CORE_SRC
# and corresponding subdirectories.
# The function rwildcard is taken from

rwildcard =$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))

#User Sources -----------------------------------------------------------------
USR_C_FILES     := $(call rwildcard,$(USR_SRC)/,*.c)
USR_CPP_FILES   := $(call rwildcard,$(USR_SRC)/,*.cpp)
USR_S_FILES     := $(call rwildcard,$(USR_SRC)/,*.S)
USR_OBJ         := $(USR_S_FILES:$(USR_SRC)/%.S=$(USR_BIN)/%.o) $(USR_C_FILES:$(USR_SRC)/%.c=$(USR_BIN)/%.o) $(USR_CPP_FILES:$(USR_SRC)/%.cpp=$(USR_BIN)/%.o)

# Core library sources --------------------------------------------------------
CORE_CPP_FILES  := $(call rwildcard,$(CORE_SRC)/,*.cpp)
CORE_C_FILES    := $(call rwildcard,$(CORE_SRC)/,*.c)
CORE_S_FILES    := $(call rwildcard,$(CORE_SRC)/,*.S)
CORE_OBJ        := $(CORE_S_FILES:$(CORE_SRC)/%.S=$(CORE_BIN)/%.o) $(CORE_C_FILES:$(CORE_SRC)/%.c=$(CORE_BIN)/%.o) $(CORE_CPP_FILES:$(CORE_SRC)/%.cpp=$(CORE_BIN)/%.o)

# User library sources (see
LIB_DIRS_SHARED := $(foreach d, $(LIBS_SHARED), $(LIBS_SHARED_BASE)/$d/ $(LIBS_SHARED_BASE)/$d/utility/)      # base and /utility
LIB_DIRS_SHARED += $(foreach d, $(LIBS_SHARED), $(LIBS_SHARED_BASE)/$d/src/ $(dir $(call rwildcard,$(LIBS_SHARED_BASE)/$d/src/,*/.)))                          # src and all subdirs of base

LIB_DIRS_LOCAL  := $(foreach d, $(LIBS_LOCAL), $(LIBS_LOCAL_BASE)/$d/ $(LIBS_LOCAL_BASE)/$d/utility/ )        # base and /utility
LIB_DIRS_LOCAL  += $(foreach d, $(LIBS_LOCAL), $(LIBS_LOCAL_BASE)/$d/src/ $(dir $(call rwildcard,$(LIBS_LOCAL_BASE)/$d/src/,*/.)))                          # src and all subdirs of base

LIB_CPP_SHARED  := $(foreach d, $(LIB_DIRS_SHARED),$(call wildcard,$d*.cpp))
LIB_C_SHARED    := $(foreach d, $(LIB_DIRS_SHARED),$(call wildcard,$d*.c))
LIB_S_SHARED    := $(foreach d, $(LIB_DIRS_SHARED),$(call wildcard,$d*.S))

LIB_CPP_LOCAL   := $(foreach d, $(LIB_DIRS_LOCAL),$(call wildcard,$d/*.cpp))
LIB_C_LOCAL     := $(foreach d, $(LIB_DIRS_LOCAL),$(call wildcard,$d/*.c))
LIB_S_LOCAL     := $(foreach d, $(LIB_DIRS_LOCAL),$(call wildcard,$d/*.S))


# Includes -------------------------------------------------------------
INCLUDE         := -I./$(USR_SRC) -I$(CORE_SRC)
INCLUDE         += $(foreach d, $(LIB_DIRS_SHARED), -I$d)
INCLUDE         += $(foreach d, $(LIB_DIRS_LOCAL), -I$d)

# Generate directories --------------------------------------------------------
DIRECTORIES     :=  $(sort $(dir $(CORE_OBJ) $(USR_OBJ) $(LIB_OBJ)))
generateDirs    := $(foreach d, $(DIRECTORIES), $(shell if not exist "$d" mkdir "$d"))

#$(info dirs: $(DIRECTORIES))

# Rules:

.PHONY: directories all rebuild upload uploadTy uploadCLI clean cleanUser cleanCore


rebuild: cleanUser all

clean: cleanUser cleanCore cleanLib
	@echo $(COL_OK)cleaning done$(COL_RESET)

upload: all

uploadTy: all

uploadCLI: all

uploadJLink: all

# Core library ----------------------------------------------------------------
$(CORE_BIN)/%.o: $(CORE_SRC)/%.S
	@echo $(COL_CORE)CORE [ASM] $(notdir $<) $(COL_ERR)
	@"$(CC)" $(S_FLAGS) $(INCLUDE) -o $@ -c $<

$(CORE_BIN)/%.o: $(CORE_SRC)/%.c
	@echo $(COL_CORE)CORE [CC]  $(notdir $<) $(COL_ERR)
	@"$(CC)" $(C_FLAGS) $(INCLUDE) -o $@ -c $<

$(CORE_BIN)/%.o: $(CORE_SRC)/%.cpp
	@echo $(COL_CORE)CORE [CPP] $(notdir $<) $(COL_ERR)
	@"$(CXX)" $(CPP_FLAGS) $(INCLUDE) -o $@ -c $<

	@echo $(COL_LINK)CORE [AR] $@ $(COL_ERR)
	@$(AR) $(AR_FLAGS) $@ $^
	@echo $(COL_OK)Teensy core built successfully &&echo.

# Shared Libraries ------------------------------------------------------------
	@echo $(COL_LIB)LIB [ASM] $(notdir $<) $(COL_ERR)
	@"$(CC)" $(S_FLAGS) $(INCLUDE) -o $@ -c $<

$(LIB_BIN)/%.o: $(LIBS_SHARED_BASE)/%.cpp
	@echo $(COL_LIB)LIB [CPP] $(notdir $<) $(COL_ERR)
	@"$(CXX)" $(CPP_FLAGS) $(INCLUDE) -o $@ -c $<

	@echo $(COL_LIB)LIB [CC]  $(notdir $<) $(COL_ERR)
	@"$(CC)" $(C_FLAGS) $(INCLUDE) -o $@ -c $<

# Local Libraries -------------------------------------------------------------
	@echo $(COL_LIB)LIB [ASM] $(notdir $<) $(COL_ERR)
	@"$(CC)" $(S_FLAGS) $(INCLUDE) -o $@ -c $<

$(LIB_BIN)/%.o: $(LIBS_LOCAL_BASE)/%.cpp
	@echo $(COL_LIB)LIB [CPP] $(notdir $<) $(COL_ERR)
	@"$(CXX)" $(CPP_FLAGS) $(INCLUDE) -o $@ -c $<

$(LIB_BIN)/%.o: $(LIBS_LOCAL_BASE)/%.c
	@echo $(COL_LIB)LIB [CC]  $(notdir $<) $(COL_ERR)
	@"$(CC)" $(C_FLAGS) $(INCLUDE) -o $@ -c $<

# Handle user sources ---------------------------------------------------------
$(USR_BIN)/%.o: $(USR_SRC)/%.S
	@echo $(COL_SRC)USER [ASM] $< $(COL_ERR)
	@"$(CC)" $(S_FLAGS) $(INCLUDE) -o "$@" -c $<

$(USR_BIN)/%.o: $(USR_SRC)/%.c
	@echo $(COL_SRC)USER [CC]  $(notdir $<) $(COL_ERR)
	@"$(CC)" $(C_FLAGS) $(INCLUDE) -o "$@" -c $<

$(USR_BIN)/%.o: $(USR_SRC)/%.cpp
	@echo $(COL_SRC)USER [CPP] $(notdir $<) $(COL_ERR)
	@"$(CXX)" $(CPP_FLAGS) $(INCLUDE) -o "$@" -c $<

# Linking ---------------------------------------------------------------------
	@echo $(COL_LINK)
	@echo [LD]  $@ $(COL_ERR)
	@$(CC) $(LD_FLAGS) -o "$@" $(USR_OBJ) $(LIB_OBJ) $(CORE_LIB) $(LIBS)
	@echo $(COL_OK)User code built and linked to libraries &&echo.

%.lst: %.elf
	@echo [LST] $@
	@$(OBJDUMP) -d -S --demangle --no-show-raw-insn "$<" > "$@"
	@echo $(COL_OK)Sucessfully built project$(COL_RESET) &&echo.

%.sym: %.elf
	@echo [SYM] $@
	@$(NM) $(NM_FLAGS) "$<" > "$@"

%.hex: %.elf
	@echo $(COL_LINK)[HEX] $@
	@$(OBJCOPY) -O ihex -R.eeprom "$<" "$@"

# Cleaning --------------------------------------------------------------------
	@echo $(COL_LINK)Cleaning user binaries...$(COL_RESET)
	@if exist $(USR_BIN) rd /s/q "$(USR_BIN)"
	@if exist "$(TARGET_LST)" del $(subst /,\,$(TARGET_LST))

	@echo $(COL_LINK)Cleaning core binaries...$(COL_RESET)
	@if exist $(CORE_BIN) rd /s/q "$(CORE_BIN)"
	@if exist $(CORE_LIB) del  $(subst /,\,$(CORE_LIB))

	@echo $(COL_LINK)Cleaning user library binaries...$(COL_RESET)
	@if exist $(LIB_BIN) rd /s/q "$(LIB_BIN)"

# compiler generated dependency info ------------------------------------------
-include $(CORE_OBJ:.o=.d)
-include $(USR_OBJ:.o=.d)
-include $(LIB_OBJ:.o=.d)
I had only a T4.0 with audio card available,
but I only could get it working with #include "Arduino.h" inserted on top of sketch.
(this is was Arduino IDE inserts also)
I have no headphone with me, so cannot test if it is working properly.
Seems not, no serial port, no LED on

only way to get sketch working is to eliminate TeensyDebug from sketch AND makefile
So there must be some issues

Edit: adding -DGDB_DUAL_SERIAL to makefile did not help (as indicated in other thread)

@TeeVil, if you got it working, please report also here
Last edited:
IIRC Teensydebug copies a Boards.txt.local to the Arduino folder. which is not parsed by VisualTeensy. This file sets the optimization level to -Og and adds -DGDB_DUAL_SERIAL as WMXZ already mentioned. Additionally it exchanges the loader by some gdbtool which I don't know. Might need some more tweaks in the makefile to make it work.

I remember getting it to work once but it wasn't much help so I didn't work on the integration further.
I've re-installed everything, and now it doesn't even work on Teensyduino. So its probably not a VisualTeensy-specific issue?

Has anybody been able to use TeensyDebug along with the Audio library, at all?
If I try that the program just doesn't seem to start.

I've simplified the example code even further. Trying to execute the following:
#include <Audio.h>
#include <Wire.h>
#include <SD.h>
#include <SPI.h>
#include <SerialFlash.h>

#include <TeensyDebug.h>
#pragma GCC optimize ("O0")

void setup() {
  digitalWrite(LED_BUILTIN, HIGH);

void loop() {

with "USB type" = "Dual Serial" and "GDB" = "Use Dual Serial".
If I try that the LED just never comes on, and there are no serial ports.

I also now get the following warning:
.\libraries\TeensyDebug\src/TeensyDebug.h:91:0: warning: "O_CREAT" redefined
 #define O_CREAT         0x200

.\hardware\tools\arm\arm-none-eabi\include\sys\_default_fcntl.h:38:0: note: this is the location of the previous definition
 #define O_CREAT  _FCREAT
But it seems that _FCREAT is set to 0x200, so it is probably not a problem.
Sigh. Now I get the same problem even when removing ALL the #include's except TeensyDebug.

I can swear it worked earlier. Maybe I forgot something in the re-install?

Maybe its a sign to give up on the debugger, for me in any case.
If you use makefiles (as you do with VisualTeensy) you should include Arduino.h on top of the sketch
(this is what is done with .ino files and Arduino IDE)
My understanding is that TeensyDebug, changes basic functionality, so TeensyDebug may be not compatible or keeping up with TD development

I must confess, I never used TeensyDebug, but was only curious.
I also do not get any ports or led blinking if I include TeesyDebug.h
Sorry yes I did include Arduino.h when using VS Code. But now I'm back to Teensyduino, still get the same result.

I definitely got the debugging to work (sort-of) before so I'm not sure what changed.

Thanks for your feedback in any case - at least it proves the problem is repeatable. (Or we're both making the same mistakes :) )
I tried TeensyDebug on PlatformIO. All tests done with PlatformIO 5.1.1. Got the following results:
1. Teensy Platform 4.13.0 (based on Teensyduino 1.54): Debugging does not work, program does not start. Same problem I had previously.
2. Teensy Platform 4.12.0 (based on Teensyduino 1.53): Debugging works! (But I did very limited testing...must check if it works along with Audio lib)

So yeah I suspect Teensyduino 1.54 and TeensyDebug does not like each other.
IIRC TeensyDebug exchanges the linker script. I assume that the TeensyDebug script is based on the one from 1.53 (or earlier). On the other hand TD 1.54 has a new linker script and probably relies on the new one.... @ftrias will know. Did you try to file an issue at his GitHub repo?

EDIT: I was probably wrong (don't find a changed linker script in the repo...)
IIRC TeensyDebug exchanges the linker script. I assume that the TeensyDebug script is based on the one from 1.53 (or earlier). On the other hand TD 1.54 has a new linker script and probably relies on the new one.... @ftrias will know. Did you try to file an issue at his GitHub repo?

EDIT: I was probably wrong (don't find a changed linker script in the repo...)

Funny the "EDIT" showed on hitting reply that wasn't there before ...

Indeed in TSET using the Arduino Builder run from command line ... back when TeensyDebug was tested ... all that was done when 'Debug' was selected was adding this line to the batch file to start GDB with files already in the build:
start "%tools%\GDB.cmd" "%arduino%\hardware\tools\arm\bin\arm-none-eabi-gdb.exe" "%temp1%\%sketchname%.elf"