8
votes

Comment exécuter le code de RAM sur l'architecture du bras

Je programmment un bras Cortex-R4 et j'ai quelques fichiers binaires que je voudrais les exécuter de TCRAM, juste pour voir si l'augmentation de la performance est suffisamment bonne.

Je sais que je devrais écrire une fonction pour copier les fichiers binaires à la RAM (qui peut être accompli avec le script de liaison et connaître la taille des fichiers binaires). Mais comment vont-ils courir?

Imaginez ceci: le premier binaire a Func1 (), Func2 (), Func3 () et Func4 (). Je copierais tout le module en TCRAM et comment puis-je appeler une fonction là-bas? Je devrais utiliser un pointeur de fonction sur cette fonction spécifique? Et que si Func4 (), appelle Func2 () et Func3 ()? Si je ne me trompe pas, ils dirigeraient la pièce de code situé dans le flash. Est-ce que cela signifie que je devrais avoir à écrire ces funcs? Utilisez entièrement des pointeurs de fonction? On m'a dit que juste le script de liaison suffit à faire tout cela et je n'ai besoin de rien, mais je ne comprends toujours pas comment cela fonctionne.

arm

0 commentaires

3 Réponses :


6
votes

Vous avez deux options.

  1. copiez-les comme vous le suggérez, compilez avec PC relatif .
  2. Utilisez un fichier de liaison avec une adresse de charge / exécution différente.

    Une copie simple ne fonctionnera que si les routines n'utilisent aucune adresse absolue . C'est peut-être bien s'ils utilisent l'adresse absolue car je suppose que vous allez laisser une copie dans la RAM standard. Cependant, cela peut ne pas bénéficier pleinement du TCM .

    avec un script de liaison, vous pouvez spécifier une autre charger et exécuter emplacements. xxx

    note notamment at> flash .

    Voir aussi: fichier de carte de liaison gnu ... et beaucoup plus sur Stackoverflow . GNU LD Manuel contient des informations sur lma < / Code> Sections ( Charge Adresse). Votre lma serait flash , mais le vma ( adresse adresse) serait tcm . Le lien manuel ci-dessus montre également comment copier. Le RAM , flash et tcm_mem est défini avec LD Memory Informations, selon les adresses correspondant à votre carte. Tout cela sera documenté dans un fichier carte . Assurez-vous de générer un fichier (code> et d'examiner les adresses pour vérifier votre script ld .

    Le 2e cas nécessite également une copie (au début up ou au moins avant le premier TCM utilisation de la fonction). Cependant, le compilateur peut utiliser adresses absolues et ils seront dans la mémoire tcm . De plus, toute fonction dans le document dram peut appeler directement la fonction tcm directement. Avec le premier cas, vous devez utiliser les pointeurs de fonction pour appeler le code tcm . Si vous souhaitez que vous souhaitiez des variables globales globales à placer dans cette mémoire, vous pouvez utiliser des attributs pour les mettre dans différentes sections et utiliser gnu ld pour les placer de manière appropriée. Je pense qu'il y a iTCM et DTCM ? Donc, peut-être que cela ne s'applique pas à vous ou si vous avez besoin de deux sections.

    Le script de liaison est plus générique et fonctionnera mieux si vous mettez une fonctionnalité compliquée dans le TCM . Il suffit d'utiliser -fic , etc., etc. peut faire fonctionner des choses rapidement, surtout si vous n'avez qu'une seule fonction pure .


0 commentaires

11
votes

sur GCC: Placez simplement la fonction dans la section .Data: xxx pré>

Il sera copié avec le reste de vos variables initiales par le code de démarrage (pas besoin de gâcher avec le SCIPT LINKER). Vous avez peut-être également besoin d'une option "long_call" également si la fonction finit par "loin" du reste du code après avoir été placée dans la RAM. p> xxx pré>

exemple: p> xxx pré>

Vous pouvez obtenir un avertissement de compilateur pouvant être ignoré en toute sécurité: p>

Warning: ignoring changed section attributes for .data


2 commentaires

Ceci est utile, mais je ne pense pas que cela mettra la fonction dans le TCRAM comme invité à l'OP. Cela mettra la fonction dans la RAM de manière assez simple, mais il ne sera pas très efficace et en fonction de la taille de routine, il peut en réalité être plus lent que l'exécution de Flash (en raison des frais généraux d'appel). Donc, cela ne serait utile que selon pourquoi vous devez mettre des données dans la RAM (pas TCRAM selon OP); par exemple SMC.


Ajout d'un attribut NOINLINE peut être utile également, pour vous assurer que le code n'est pas inlisé dans une autre fonction que est à partir de Flash.



3
votes

De nos jours (alors-un jours aussi?) Vous pouvez simplement utiliser le macro __ ram_func , __ ramfunc_ext (banque, nom) ou __ ramfunc (banque)


1 commentaires

Non standard C. Soutenu dans le MIAR, pas de GCC.