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. p>
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? P>
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. p>
3 Réponses :
Vous avez deux options.
PC relatif code>. Li>
- Utilisez un fichier de liaison avec une adresse de charge / exécution différente. LI>
ol>
Une copie simple ne fonctionnera que si les routines n'utilisent aucune adresse absolue forte>. C'est peut-être bien s'ils utilisent l'adresse absolue forte> car je suppose que vous allez laisser une copie dans la RAM standard. Cependant, cela peut ne pas bénéficier pleinement du TCM code>. P> avec un script de liaison, vous pouvez spécifier une autre charger code> et exécuter code> emplacements. p> xxx pré> note notamment at> flash code>. p> Voir aussi: fichier de carte de liaison gnu ... et beaucoup plus sur Stackoverflow em >. GNU LD Manuel contient des informations sur lma < / Code> Sections ( Charge forte> Adresse). Votre lma code> serait flash em>, mais le vma code> ( adresse forte> adresse) serait tcm forte >. Le lien manuel ci-dessus montre également comment copier. Le RAM code>, flash code> et tcm_mem code> est défini avec LD Memory Informations, selon les adresses correspondant à votre carte. Tout cela sera documenté dans un fichier carte code>. Assurez-vous de générer un fichier code> (code> et d'examiner les adresses pour vérifier votre script ld code>. P> Le 2e cas nécessite également une copie (au début up ou au moins avant le premier TCM code> utilisation de la fonction). Cependant, le compilateur peut utiliser adresses absolues forte> et ils seront dans la mémoire tcm code>. De plus, toute fonction dans le document code> dram code> peut appeler directement la fonction tcm code> directement. Avec le premier cas, vous devez utiliser les pointeurs de fonction pour appeler le code tcm code>. Si vous souhaitez que vous souhaitiez des variables globales fores> globales à placer dans cette mémoire, vous pouvez utiliser des attributs pour les mettre dans différentes sections et utiliser gnu ld em> pour les placer de manière appropriée. Je pense qu'il y a iTCM code> et DTCM code>? Donc, peut-être que cela ne s'applique pas à vous ou si vous avez besoin de deux sections. P> Le script de liaison est plus générique et fonctionnera mieux si vous mettez une fonctionnalité compliquée dans le TCM code>. Il suffit d'utiliser -fic code>, etc., etc. peut faire fonctionner des choses rapidement, surtout si vous n'avez qu'une seule fonction pure code>. P> p> p>
sur GCC: Placez simplement la fonction dans la section .Data: 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> exemple: p> Vous pouvez obtenir un avertissement de compilateur pouvant être ignoré en toute sécurité: p> Warning: ignoring changed section attributes for .data
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 b> vous devez mettre des données dans la RAM (pas TCRAM selon OP); par exemple SMC.
Ajout d'un attribut NOINLINE code> peut être utile également, pour vous assurer que le code n'est pas inlisé dans une autre fonction que est i> à partir de Flash.
De nos jours (alors-un jours aussi?) Vous pouvez simplement utiliser le macro __ ram_func code>,
__ ramfunc_ext (banque, nom) code> ou
__ ramfunc (banque) code> p>
Non standard C. Soutenu dans le MIAR, pas de GCC.