Sepro's docs Open documentation

VsCode et les projets Mbed

Cette page détaille l’utilisation de VsCode et de mbed pour générer un exécutable pour ARM CortexM.

VS code est l’IDE utilisé dans le BTS pour développer pour la cible Nucleo F746ZG. Afin qu’il soit fonctionnel pour notre chaîne de développement, un certain nombre de paramètres doivent être personnalisés.

Si vous avez importé un projet template depuis notre GIT, il est immédiatement fonctionnel. vous n’avez qu’à vérifier la compilation de celui-ci.

Nous allons synthétiser l’utilisation de Vscode et détailler la configuration du projet template proposé.

Développer avec VSCODE

Créer un projet à partir d’un projet template

Maintenant que la chaine de compilation est installée, vous allez pouvoir tester la compilation, le téléversement et l’exécution de votre projet

  1. Cloner le projet template

Cas Linux

git clone https://gitlab.sn-kastler.fr/modeles/mbed6_template.git <nomProjet>

Cas Windows

git clone -b Windows https://gitlab.sn-kastler.fr/modeles/mbed6_template.git <NomProjet>
  1. Se déplacer dans le dossier
cd <nomProjet>
  1. Installer mbed et les librairies à partir des fichiers *.lib

Attention, La commande mbed update télécharge + de 1Go de données la première fois…Soyez patient !

mbed update

Ouvrir le projet dans vscode

Fichier -> Ouvrir un dossier

Compiler et exécuter un programme

Dans Vscode

Executer -> Exécuter sans débogage

Le projet se compile (plusieurs minutes la première fois, puis est téléversé sur la carte.

Lors du premier téléversement, une fenêtre s’ouvre pour confirmer que vous voulez utiliser JLink. Cocher la case “Do not show this message again” et cliquer sur Accept

Jlink

Exécuter le programme

Une fois le programme téléversé sur la carte, il attend que vous l’exécutiez

Vscode en attente

Cliquer sur la flèche bleu pour lancer le programme

Flèche exec

Rediriger la sortie écran.

La sonde intégrée Jlink permet de rediriger la sortie écran vers un terminal (/dev/ttyACM0)

Pour cela,

  • Cliquer sur l’onglet terminal de VSCODE.
  • Entrer la commande suivante

Si screen n’est pas installé faite-le !

screen /dev/ttyACM0

ou bien si vous utilisez cu

cu -l /dev/ttyACMO

Dans le programme, les printf() seront redirigés vers ce terminal série.

printf("LO WORLD \r\n");

N’oubliez pas de préciser \n\r dans votre code pour revenir à la ligne !

Pour quitter screen

Ctrl-A k

Ajouter une librairie ou une classe

  • Cas d’une librairie existante

Si vous ajoutez une librairie de composant avec mbed add, elle est immédiatement fonctionnelle.

  • Cas d’une nouvelle librairie/classe

Pour que votre classe soient correctement compilée, vous devez indiquer son chemin depuis la racine de votre projet.

Exemple : classe CMoteur

  1. Créer un dossier CMoteur à la racine de votre projet
  2. Créer un fichier CMoteur.h et CMoteur.cpp dans le dossier CMoteur
  3. Inclure la classe CMoteur dans le fichier concerné (main.cpp par exemple)

    #include "CMoteur/Cmoteur.h"
    

Projet Mbed6Template

Le template est hébergé sur notre git, Mbed6Template

Vous pouvez le cloner comme indiqué ci-dessous

git clone https://gitlab.sn-kastler.fr/modeles/mbed6_template.git

Fichiers et dossiers importants du template

.
├── main.cpp
├── mbed_app.json
├── mbed_config.h
├── mbed-os.lib
├── readme.md
├── STM32F7x6.svd
└── .vscode
    ├── c_cpp_properties.json
    ├── .cortex-debug.peripherals.state.json
    ├── .cortex-debug.registers.state.json
    ├── launch.json
    ├── settings.json
    └── tasks.json

Répertoire principal

main.cpp

Le fichier main.cpp contient un “Hello World” qui allume et éteint la led1 toutes les 100ms

#include "mbed.h"

#define SLEEP_TIME 100ms // (msec)
DigitalOut led1(LED1);

int main() {
  while (true) {
    printf("LO world \r\n");
    led1 = !led1;
    ThisThread::sleep_for(SLEEP_TIME);
  }
}

mbed-app.json

Ce fichier est le fichier de configuration des options spécifques à certaines cartes.
Ici, nous précisons que nous voulons activer l’affichage des nombres réels pour toutes les cartes.

{
    "target_overrides": {
 	"*": {
            "target.printf_lib": "minimal-printf",
            "platform.minimal-printf-enable-floating-point": true,
            "platform.minimal-printf-set-floating-point-max-decimals": 6,
            "platform.minimal-printf-enable-64-bit": false
        },
        "K64F": {
            "platform.stdio-baud-rate": 9600
        }
    }
}

mbed-os.lib

Le fichier contient un lien vers la version de mbed-os qui doit être utilisé par le projet. Le fichier, comme tous les .lib est utilisé lorsqu’on exécute mbed update

Dans notre cas, la version téléchargée est la 6.15.0

https://github.com/ARMmbed/mbed-os/#4cfbea43cabe86bc3ed7a5287cd464be7a218938

STM32F7x6.svd

Ce fichier est le fichier de définition de la carte Nucleo STM32F746ZG. Il contient l’adresse de tous les registres mémoires. Il est utilisé pour voir l’état des registres lors du débogage du projet.

Sous répertoire .vscode

Ce sous répertoire contient la configuration utilisé par VsCode pour la chaine de cross compilation Il est indispensable au projet et dépend de la configuration des outils installé sur le PC.

Fichier c_cpp_properties.json

Ce fichier contient les directives de compilation propre à la carte et à l’environnement. Je vais détailler certaines des options.

  • configurations : Détecte si l’OS est Windows ou Linux et adapte le chemin des outils en fonction.
  • includePath Le chemin d’inclusion automatique des bibliothèques. Ici "${workspaceFolder}/**" signifie “tous les sous répertoires du répertoire de travail
  • compilerPath : Le chemin (absolu si problème) vers le compilateur.
  • cStandard et cppStandard : La version de C et CPP utilisé.
  • intelliSenseMode : Coloration syntaxique et complétion automatique de VsCode
{
    "configurations": [
        {
            "name": "Windows",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                //suite de définition pour Windows
            ],
            "compilerPath": "arm-none-eabi-g++",          
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "gcc-x64"
        },
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "DEVICE_SPI=1",
                "TARGET_STM32F746xG",
              //suite de définition pour linux
                "\"_DEBUG\",",
                "\"UNICODE\",",
                "\"_UNICODE\""
            ],
            "compilerPath": "/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-g++",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "gcc-x64"
        }
    ],
    "version": 4
}

launch.json

Ce fichier contient la configuration du téléversement et de la sonde de Debug

  • cortex-debug : L’appel au plugin cortex-debug pour gérer le téléversement.
  • executable : Le chmein vers l’exécutable
  • serverpath : Le chemin vers l’exécutable de debogage. Nous utilisons Jlink
  • gdbpath : Le chemin vers le debugger gdb

Task.json

Ce fichier contient les directives de compilation.

Nous utilisons mbed pour compiler.

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "name": "mbed",
    "isShellCommand": true,
    "showOutput": "always",
    "problemMatcher": {
        "owner": "cpp",
        "fileLocation": ["relative", "${workspaceRoot}"],
        "pattern": {
            "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
            "file": 1,
            "line": 2,
            "column": 3,
            "severity": 4,
            "message": 5
        }
    },
    "args": ["compile", "--profile=debug", "-t", "GCC_ARM", "-m", "NUCLEO_F746ZG"],
    "linux": {
        "command": "mbed"
    },
    "osx": {
        "command": "mbed"
    },
    "windows": {
        "command": "mbed"
    }
}