Comment faire pour exécuter du code à partir de la RAM sur l'architecture ARM
Je suis à la programmation d'un ARM Cortex-R4 et j'ai quelques fichiers binaires que je tiens à les exécuter à partir de TCRAM, juste pour voir si l'augmentation de la performance est assez bonne.
Je sais que j'aurais du écrire une fonction pour copier les binaires de la RAM (ce qui peut être accompli avec le linker script, et la connaissance de la taille des fichiers binaires). Mais comment pourraient-ils fonctionner?
Imaginez ceci: La première binaire a func1(), func2(), func3() et func4(). J'avais copier le module entier à TCRAM et comment pourrais-je appeler une fonction, il? J'aurais du utiliser un pointeur de fonction à fonction spécifique? Et si func4(), les appels func2() et func3()? Si je ne me trompe pas, ils avaient point pour le morceau de code situé dans le flash. Est-ce que j'aurais à re écrire ces funcs? Utilisez des pointeurs de fonction? J'ai été dit que seulement le linker script est assez pour faire tout cela et je n'ai pas besoin de vous soucier de quoi que ce soit, mais je ne comprends toujours pas comment il fonctionne.
Vous devez vous connecter pour publier un commentaire.
Vous avez deux options.
pc relative
.Une simple copie ne fonctionnera que si les routines ne pas utiliser de adresses absolues. Il peut-être très bien si ils utilisent le adresse absolue que je suppose que vous allez laisser une copie en RAM standard. Toutefois, cela peut ne pas obtenir le plein bénéfice de la
TCM
.Avec un linker script, vous pouvez spécifier un autre
LOAD
etRUN
endroits.Remarque surtout
AT>FLASH
.Voir aussi: éditeur de liens gnu fichier de la carte... et beaucoup plus sur stackoverflow. Le Gnu Ld manuel a des informations sur
LMA
sections (CHARGE adresse). VotreLMA
serait flash, mais leVMA
(EXÉCUTER adresse) serait TCM. Le manuel lien ci-dessus montre également comment copier. LeRAM
,FLASH
, etTCM_MEM
sont définis avec ld De MÉMOIRE de l'information, selon les adresses sont à votre conseil d'administration. Tout cela sera consigné dans unMAP
fichier. Assurez-vous de générer unMAP
de fichiers et d'examiner les adresses de vérifier votreld
script.Le 2ème cas nécessite également une copie (au démarrage ou au moins avant la première
TCM
fonction de l'utilisation). Cependant, le compilateur peut utiliser adresses absolues et ils seront à laTCM
de la mémoire. Aussi toute fonction au sein de la principaleDRAM
pouvez appeler laTCM
fonction directement. Avec le premier cas, vous devez utiliser des pointeurs de fonction à appeler laTCM
code. Si vous souhaitez mondiale variables pour être placé dans cette mémoire, vous pouvez utiliser des attributs pour les mettre dans les différentes sections et l'utilisation gnu ld de les placer convenablement. Je pense qu'il estITCM
etDTCM
? Alors peut-être que cela ne s'applique pas pour vous, ou vous avez besoin de deux sections.Le linker script est plus générique et fonctionnera mieux si vous mettez compliqué de fonctionnalité dans le
TCM
. Juste à l'aide de-fpic
, etc et la copie peut obtenir des choses à travailler rapidement, surtout si vous avez un seulpure
fonction.Sur GCC: il suffit de mettre la fonction dans les .les données de la section:
Il sera copié avec le reste de votre initialzed variables par le code de démarrage (pas besoin de jouer avec l'éditeur de liens scipt). Vous avez peut être besoin d'une "long_call" option ainsi si la fonction se termine "loin" du reste du code après avoir été placé dans la mémoire RAM.
Exemple:
Vous pouvez obtenir un message d'avertissement du compilateur qui peut être ignoré en toute sécurité:
De nos jours (ensuite-a-jours ainsi?) vous pouvez utiliser la macro
__RAM_FUNC
,__RAMFUNC_EXT(bank, name)
ou__RAMFUNC(bank)