IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Embarqué Discussion :

Réception et exécution de code en RAM


Sujet :

Embarqué

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2016
    Messages : 3
    Par défaut Réception et exécution de code en RAM
    Bonjour à tous,

    Je suis étudiant et je travaille actuellement sur un projet dont une des fonctionnalités est de recevoir du code exécutable via une UART en RAM et être capable de l'exécuter.

    J'ai pas mal recherché sur les forums sans trouver de réponses convenables, je ne sais pas si c'est possible également.

    Je sais qu'il est possible d'écrire des fonctions de façon à ce qu'elle s'exécutent en RAM mais les fonctions sont d'abord placées en ROM. Ma question est de savoir si il est possible d'écrire du code exécutable de façon à ce qu'il soit "portable" et de le télécharger sur ma RAM via une UART ?

    J'ai lu des choses intéressantes sur l'option -fpic de gcc sans vraiment trop comprendre comment je pourrais l'utiliser dans mon projet.

    Est que quelqu'un aurait une suggestion, des idées de pistes ou bien des liens intéressants ?

    Merci par avance

  2. #2
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 252
    Par défaut
    Salut,
    Le document AN4296 de chez ST montre comment placer du code dans une partie de la RAM. Visiblement ça ne concerne pas tous les micro de la gamme STM32.

    Je me demande s'il suffit pas simplement d'installer un bootloader UART standard et lui envoyer un programme que tu aura compilé avec les astuces qui sont dans le document AN4296.

    A+

  3. #3
    Membre expérimenté Avatar de cedd70
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Mars 2012
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 154
    Par défaut
    Salut,

    Tu dois pouvoirs charger ta RAM, regarde du coté de la configuration de la DMA. En revanche pour exécuter c'est pas faisable.

  4. #4
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 252
    Par défaut
    En complément de la remarque de cedd70 sur le DMA qui te permettra de réaliser des tâches sans solliciter le processeur.

    Ce que tu souhaites faire est possible.
    - Voir l'AN4296 : http://www.st.com/content/ccc/resour...DM00083249.pdf
    - Uniquement sur des micros intégrants une RAM CCM (core coupled memory) comme le STM32F303 : http://www.st.com/content/ccc/resour...DM00092070.pdf

    C'est un micro de compète ! Je crois que je vais bientôt essayer du ST.

    De ce que j'ai compris, lorsque tu utilises la RAM CCM (pour le programme) avec la RAM classique (pour les données) tu te retrouves avec une mémoire données et une mémoire programme sur des bus séparés mais ultra rapides car tous les deux des RAM. L'utilisation de cette configuration est réservé à des choses très particulières comme du calcul intensif ou traitement du signal. J'ai l'impression que toi, tu souhaites y mettre un programme quelconque et d'une utilisation générale mais sache que tu seras limité en taille car la RAM CCM ne fait que 4k ici contre 64k pour la mémoire Flash classique.

    Sur le dernier dessin, en rouge et en orange, c'est le chemin qu'emprunte le système bootloader classique. Il faut aussi lire la doc pour comprendre comment régler la broche BOOT0 et la bit BOOT1 pour que le compteur programme aille où il faut au démarrage.

    Nom : Capture30.png
Affichages : 1221
Taille : 126,1 Ko

    Nom : Capture31.png
Affichages : 1159
Taille : 101,2 Ko

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2016
    Messages : 3
    Par défaut
    Je vous remercie de vos réponses, effectivement le micro que j'utilise (STM32F746ZG) semble avoir ce type de mémoire (TCM RAM), le problème de ça c'est que si jamais je dois utiliser un micro sans ce type de mémoire je ne peux pas charger et exécuter du code RAM (si j'ai bien compris) et ça m'embête un peu puisque le programme que j'écris dépendra de mon micro.

    Ce que je ne comprend pas c'est que j'arrive à déclarer une section de ma RAM dans le fichier de link et écrire des fonctions pour qu'elles s'exécutent en RAM dans cette section(le code des fonctions réside lui dans la ROM) avec des directives du style ; "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __attributes__ ( ( long_call, section(".ma_section") ) )
    ". J'ai bien observé que les fonctions que je déclare s'exécutent en RAM et lorsque je fais un reset du micro, les fonctions s'exécutent toujours en RAM (donc le code est bien mémorisé quelque part en ROM).

    Pour essayer de résoudre mon problème (charger un code exécutable directement en RAM puis pouvoir l'exécuter) j'ai d'abord crée un programme simple (hello world par exemple) que je désassemble avec "objdump" de façon à obtenir le code assembleur pour ma cible.

    Je récupère ensuite ce code que j'envoie sur mon micro en faisant attention à l'"endianess" et au format de mes données. Et je viens écrire ce code directement en RAM. Jusque la je n'ai pas de problème.

    Le problème arrive lorsque je souhaite exécuter mon code, je déclare un pointeur de fonction (
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void(*ma_fonction)(void) = (void *) 0x20005000;
    ) sur l'adresse de mon code située en RAM puis je saute dessus (). Lorsque je debug mon pc se retrouve à l'adresse de la première instruction de ma fonction mais l'exécution crashe.

    Je n'ai pas compilé mon programme (chargé via l'uart) avec l'option -fpic et je me dis que je devrais continuer à chercher dans ce sens. De plus, je devrais être capable d'exécuter du code depuis cette partie de la RAM puisque j'y arrive avec des fonctions mémorisées en ROM.

    Est ce que vous avez un avis sur la question ?

  6. #6
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 252
    Par défaut
    Citation Envoyé par tunroc Voir le message
    le problème de ça c'est que si jamais je dois utiliser un micro sans ce type de mémoire je ne peux pas charger et exécuter du code RAM (si j'ai bien compris) et ça m'embête un peu puisque le programme que j'écris dépendra de mon micro.
    En effet si le micro n'a pas ce type de mémoire, autrement dit la majorité des micros, alors ça ne fonctionne pas. Dans ce cas il te faut un simple bootloader UART qui te permettra de mettre à jour un programme dans la mémoire Flash (c'est le grand classique)

    De toi à moi, je ne comprends pas pourquoi tu veux charger un programme en RAM pour l'exécuter ? C'est vraiment très très très particulier comme cas de figure. On fait ça lorsqu'on veut rivaliser avec un DSP ou s'approcher un peu des perfs d'un FPGA en terme de rapidité de calcul.

    Les seuls fois où j'ai été amené à faire un tel truc c'était il y a 17 ans, à l'école sur le légendaire et mythique 68HC11.... (c'était déjà un dinosaure à l'époque ) mais la raison était très simple, ce micro n'avait pas de Flash mais une ROM programmable une seule fois (emmerdant pour faire des essais) ! Donc dans la ROM j'ai programmé un bootloader et son rôle était de prendre les données (un programme) qui arrivaient dans l'UART et les mettre dans la RAM (utilisation illimitée). A chaque démarrage du micro, il attendait qu'on lui charge un programme. Ça fonctionnait aussi parce que ce micro avait une architecture Von Neumann (en terme de bus interne d'adresses et de données la ROM était à la suite de la RAM) et le compteur programme pouvait aller en RAM. bref....

    Mais aujourd'hui tout le monde charge son programme en Flash, c'est reprogrammable et c'est garantie pour un très grand nombre de cycle (10 000 fois) ça veut dire que tu peux reprgrammer la flash de ton micro avec un nouveau programme via l'UART à raison de 1 fois par jour pendant 27 ans avant que le micro commence à souffrir.


    Si vraiment c'est ce que tu souhaites faire, mais je suis curieux de connaître la vraie raison, alors as tu essayé simplement ce qui est écrit au chapitre 4.2 du document AN4296 (le lien est dans mon précédent message) ?

Discussions similaires

  1. Réponses: 44
    Dernier message: 02/08/2006, 16h12
  2. Erreur 3141 dans exécution de code
    Par zoom61 dans le forum Access
    Réponses: 13
    Dernier message: 23/03/2006, 17h31
  3. [RosASM] Tracer l'exécution du code
    Par aumeunier dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 14/03/2006, 18h26
  4. Réponses: 3
    Dernier message: 20/04/2005, 12h30
  5. Réponses: 7
    Dernier message: 03/02/2005, 17h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo