Embedded Development Board Learning


Visual Studio Code for ARM with CMake #5 VSC Tasks

Fecha: febrero 13, 2023

Autor: Guillermo Garcia

Categorías: Visual Studio Code Etiquetas:

Visual Studio Code como entorno de desarrollo para proyecto Embedded Systems

En el artículo pasado Visual Studio Code for ARM with CMake #4 J-Link se realizó la conversión del firmware J-Link en nuestra placa NUCLEO-G071RB.

Además se crearon archivos J-Link commander con los comandos necesarios para realizar la programación de la placa mediante el depurador J-Link.

En este artículo vamos a crear tareas de Visual Studio Code (VSC Tasks) para ejecutar los comandos. Para realizar la compilación, programación del archivo ejecutable y el borrado de memoria flash en nuestra placa.

Archivo de configuración

Aún son necesarias algunas configuraciones en Visual Studio Code antes de crear las tareas vamos a crear un archivo de configuración.

Para que necesitamos este archivo ?. Visual Studio Code cuenta con dos formas de configuración.

  • User setting – Que es aplicada a todo el entorno a nivel de interfaz gráfica y comportamiento funcional.
  • Workspace Settings – Es una configuración especifica en un proyecto, esta configuración solo se aplicara cuando el workspace este abierto.

Es importante saber que la configuración Workspace Settings en un proyecto específico anula la configuración User setting.

Para que Visual Studio Code pueda aplicar la configuración deseada en un proyecto específico es necesario definir un archivo con esas características llamado settings.json en el directorio .vscode dentro de nuestro proyecto.

settings.json

Creamos el archivo repasemos el contenido del directorio .vscode :

VSC Tasks Contenido del directorio vscode

Vamos a declarar algunas variables para almacenar los datos de nuestro hardware y herramientas de compilación en el archivo settings.json con el objetivo de no tener que cambiar en diversos archivos si deseamos cambiar a otro hardware.

{
    "cmake.configureOnOpen": false,
    "SetNameExecuteBuildFile": "VSC_G071RB",
    "SetDeviceARM": "STM32G071RB",
    "SetPathToolchainARM": "C:/Program Files (x86)/GNU Arm Embedded Toolchain/10 2021.10/bin",
    "SetPathJlinkGDB": "C:/Program Files/SEGGER/JLink/JLinkGDBServerCL.exe",
    "files.associations": {
        "stm32g0xx_it.h": "c",
        "main.h": "c",
        "stm32g0xx_hal.h": "c",
        "stm32g071xx.h": "c"
    }
}

SetNameExecuteBuildFile : Contiene el nombre de nuestro archivo ejecutable sin la extensión.

SetDeviceARM : Contiene el hardware que utilizamos para que J-Link pueda identificarlo.

SetPathToolchainARM : La ruta donde se instaló el compilador GCC

SetPathJlinkGDB : La ruta donde se instaló el software SEGGER y el especifico el ejecutable JLinkGDBServerCL.exe.

VSC tasks

Visual Studio Code proporciona la funcionalidad de tareas para extender la integración de herramientas externas que automatizan procesos mediante la línea de comandos.

VSC Tasks Integrar con herramientas externas a través de tareas

Las tareas en Visual Studio Code se pueden configurar para ejecutar scripts e iniciar procesos de modo, que muchas herramientas externas existentes se puedan usar desde Visual Studio Code.

Vamos a crear una serie de tareas para iniciar procesos mediante línea de comandos, repacemos los comandos que hemos utilizado a lo largo de la serie.

CMake Init Buid

Inicializa el proceso de configuración.

CMake Build

Inicializa el proceso de compilación.

CMake Clear and Build

Este comando Limpia el directorio build y inicia el proceso de compilación.

J-Link Flash

Descarga el archivo ejecutable en el MCU.

J-Link Erase Flash

Borra toda la memoria flash en el MCU.

tasks.json

Las VSC tasks especificas en un proyecto se configurar desde un archivo llamado tasks.json en el directorio .vscode.

Creamos el archivo tasks.json en el directorio .vscode, crearemos cinco tareas que ejecuten desde la línea de comandos los procesos mostrados anteriormente.

VSC Tasks Directorio vscode

Agregamos las instrucciones para indicar que inicie una consola cmd.exe y en seguida colocamos las tareas.

{
    "version": "2.0.0",
    "windows": {
        "options": {
            "shell": {
                "executable": "cmd.exe",
                "args": [
                    "/d", "/c"
                ]
            }
        }
    },
    "tasks": [
        {
            "type": "shell",
            "label": "Run Build",
            "command": "cmake --build .",
            "options": {
                "cwd": "${workspaceFolder}/build"
            },
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": {
                "base": "$gcc", 
                "fileLocation": ["relative", "${workspaceFolder}/build"]
            }
        },
        {
            "type": "shell",
            "label": "Run Clean & Build",
            "command": "cmake --build . --clean-first",
            "options": {
                "cwd": "${workspaceFolder}/build"
            },
            "group": "build",
            "problemMatcher": {
                "base": "$gcc", 
                "fileLocation": ["relative", "${workspaceFolder}/build"]
            }
        },
        {
            "type": "shell",
            "label": "Run Init make",
            "command": "cmake -DCMAKE_MAKE_PROGRAM=make.exe -G \"Unix Makefiles\" ..",
            "options": {
                "cwd": "${workspaceFolder}/build"
            },
            "group": "build",
            "problemMatcher": {
                "base": "$gcc", 
                "fileLocation": ["relative", "${workspaceFolder}/build"]
            }
        },
        {
            "type": "shell",
            "label": "Run Flash",
            "command": "JLink.exe -device ${config:SetDeviceARM} -CommandFile ${workspaceFolder}/.vscode/Run_Flash.jlink",
            "group": "build",
            "problemMatcher": {
                "base": "$gcc", 
                "fileLocation": ["relative", "${workspaceFolder}/.vscode"]
            }
        },
        {
            "type": "shell",
            "label": "Run Erase Flash",
            "command": "JLink.exe -device ${config:SetDeviceARM} -CommandFile ${workspaceFolder}/.vscode/Run_Erase_Flash.jlink",
            "group": "build",
            "problemMatcher": {
                "base": "$gcc", 
                "fileLocation": ["relative", "${workspaceFolder}/.vscode"]
            }
        }
    ]
}

Los argumentos más importantes en la creación de una tarea son :

label : Es el nombre con el que se identifica dicha tarea.

command : Las instrucciones que se ejecutan en la línea de comandos.

Recordemos las variables que se definieron en el archivo settings.json, vamos a acceder a su valor con la declaración ${config:SetDeviceARM}.

Run Task

Ahora con esta configuración solo es cuestión de ejecutar la tarea deseada para que el proceso se realice.

Para acceder al control de comandos mediante Show All commands Ctrl + Shift + P

Seleccionamos Tasks: Run Task

VSC Tasks Task Run

Se muestran todas las tareas creadas en este Workspace.

VSC Tasks Numero de tareas creadas

Para probar todos los procesos borramos el contenido del directorio build.

  • Run Init make
VSC Tasks Run Init make en ejecución
  • Run Build
VSC Tasks Run build en ejecución
  • Run Erase Flash
VSC Tasks Run erase flash en ejecución
  • Run flash
VSC Tasks Run flash en ejecución

Comprobamos el funcionamiento de las tareas a hora podemos compilar, borrar la memoria flash y descargar nuestro archivo ejecutable en la placa NUCLEO-G071RB de manera más automatizada gracias a las tareas de Visual Studio Code.



Card image cap
Guillermo Garcia I am an embedded systems software engineer. I like constant learning, IoT systems and sharing knowledge


Comentarios... no existen comentarios.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subscribe


Subscribe to receive the latest content.
Loading