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 ; "
__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 (
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 ?
Partager