Ir al contenido principal

Solución de Error "fno-tree-switch-conversion" de clangd con Xtensa-elf-g++ en sistemas GNU/Linux Debian x86_64

Esta solución ha sido probada en el microcontrolador ESP32 (Espressif)

Requisitos previos

  • GNU++11 como estándar del core
  • PlatformIO Core 6.1.18 o superior
  • curl 8.14.1 o superior (o alternativamente wget 1.25.0 o superior)
  • Python 3.13.5 o superior
  • Carpeta de instalación .platformio en /home/USUARIO/
  • Vim 9.2.1 o Neovim 0.11.5 o superior
  • LazyVim (opcional)
  • Mason.nvim 2.2.1 o superior
  • clangd 21.1.8 o superior

Creación de un proyecto en PlatformIO para ESP32 Pico

Crear la carpeta del proyecto

mkdir -p proyecto1
cd proyecto1/
pio --boards list | grep esp32
pio project init --board pico32 --ide vim
pio run -t compiledb

Correcion de error fno-tree-switch-conversion con archivo yaml

El compilador Clangd necesita de el compile_commands.json para encontrar las rutas que establece el compilador de Xtensa. Aunque hay problemas en la lectura de las cabeceras, por lo que es necesario hacer un archivo .clangd o clangd.yaml. Fuentes:

Link:compileflags (Clangd Docs)

Link:Suppress (Clangd Docs)

Link: Discusión de Github

En la carpeta raiz crear un archivo con el nombre: .clangd o clangd.yaml

:/proyecto1$ touch .clangd

Copiar este codigo a .clangd, e introducir la informacion segun sea.

CompileFlags:
  #Binario del compilador de Xtensa para archivos con extension .cpp
  Compiler: /home/USUARIO/.platformio/packages/toolchain-xtensa-esp32/bin/xtensa-esp32-elf-g++
  
  Add: [
    #Correccion de banderas de clangd a gcc
    "-D__GNUC__=8",
    "-D__GNUC_MINOR__=4",
    "-D__GNUC_PATCHLEVEL__=0",
    "-D__GXX_EXPERIMENTAL_CXX0X__=1",
    
    # Solucion para el error GLIBC
    "-D__GLIBC_USE(x)=0",
    "-D__GLIBC_PREREQ(x,y)=0",
    
    # Forzar modo para esp32 y no x86_64
    "-x", "c++",
    "-fno-exceptions",
    "-std=gnu++11",
    "--target=xtensa-esp32-elf",
    "-DARDUINO=10812",
    "-DARDUINO_ARCH_ESP32",
    "-DARDUINO_VARIANT=\"esp32\"",
    "-DESP32",

    # TOOLCHAIN (LibrerIa estándar de C/C++) ---
    "-isystem", "/home/USUARIO/.platformio/packages/toolchain-xtensa-esp32/xtensa-esp32-elf/include/c++/8.4.0",
    "-isystem", "/home/USUARIO/.platformio/packages/toolchain-xtensa-esp32/xtensa-esp32-elf/include/c++/8.4.0/xtensa-esp32-elf",
    "-isystem", "/home/USUARIO/.platformio/packages/toolchain-xtensa-esp32/lib/gcc/xtensa-esp32-elf/8.4.0/include",
    "-isystem", "/home/USUARIO/.platformio/packages/toolchain-xtensa-esp32/xtensa-esp32-elf/include",

    # CORE ARDUINO (Marco Arduino) ---
    "-I/home/USUARIO/.platformio/packages/framework-arduinoespressif32/cores/esp32",
    "-I/home/USUARIO/.platformio/packages/framework-arduinoespressif32/variants/esp32",

    # LIBRERIAS INTEGRADAS
    "-I/home/USUARIO/.platformio/packages/framework-arduinoespressif32/libraries/Wire/src",
    "-I/home/USUARIO/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src",
    "-I/home/USUARIO/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src",
    "-I/home/USUARIO/.platformio/packages/framework-arduinoespressif32/libraries/BluetoothSerial/src",
    "-I/home/USUARIO/.platformio/packages/framework-arduinoespressif32/libraries/FS/src",
    "-I/home/USUARIO/.platformio/packages/framework-arduinoespressif32/libraries/SD/src",
    "-I/home/USUARIO/.platformio/packages/framework-arduinoespressif32/libraries/HTTPClient/src",
    "-I/home/USUARIO/.platformio/packages/framework-arduinoespressif32/libraries/Update/src",
    "-I/home/USUARIO/.platformio/packages/framework-arduinoespressif32/libraries/WebServer/src",
  ]
  
  #Quitar todos los errores que arroja clangd y banderas que no puede interpretar
  Remove: [
    "-mlongcalls",
    "-mlong-calls",
    "-fno-tree-switch-conversion",
    "-fstrict-volatile-bitfields",
    "-mfix-esp32-erratum-76",
    "-fno-shrink-wrap",
    "-fno-tree-pre"
  ]

Diagnostics:
  Suppress: [
    "drv_unknown_argument", 
    "pp_file_not_found", 
    "unknown_argument",
    "illegal_use_of_builtin"
  ]

Comentarios

Entradas populares de este blog

Comunicación USB para WSL2 con Windows 11

Conexión USB en WSL2 con USBIPD Instalar USBIPD como Administrador en PowerShell winget install --id=dorssel.usbipd-win -e Configurar el PATH si no se detecta el software al invocar usbipd $folder = 'C:\Program Files\usbipd-win' $current = [Environment]::GetEnvironmentVariable('Path','User') if (-not $current.Split(';') -contains $folder) { [Environment]::SetEnvironmentVariable('Path', "$current;$folder", 'User') } Comprobar la versión usbipd --version Listar los puertos en uso usbipd list Compartir el dispositivo Sabiendo el puerto que se desea usar, ahora lo compartimos. Para ello, conecte y desconecte el dispositivo para identificarlo: usbipd bind --busid 2-2 Al detectar qué puerto se quiere pasar a WSL y conociendo el nombre de la máquina, ejecutamos: usbipd attach --busid 2-2 --wsl Debian El nombre de la máquina se puede ver en PowerShell haciendo: wsl -l -v Si la...