7
votes

Est-ce que l'horloge est brisé sur mon matériel?

J'essaie de mesurer les cygnes d'horloge nécessaires pour exécuter un morceau de code sur le TMS32064X + DSP fourni avec le zoom OMAP 3430 MDK. Je regarde le "Guide du programmeur" de la puce DSP et dit que le DSP prend en charge la fonction horloge ().

Ce que je fais est vraiment simple, je viens de faire xxx

puis mettez ensuite les valeurs de "START", "STOP" et "TOTAL" à une mémoire partagée précédemment attribuée avec le processeur ARM. Ensuite, je l'imprime simplement à l'écran du côté bras.

Le problème est, dans mon premier exécuté, j'ai toujours la même valeur "totale", puis dans mes prochaines exécutions, je reçois toujours 0! Les valeurs "Démarrer" et "Stop" vont avec la valeur "totale".

La chose la plus étrange est qu'ils semblent suivre un motif de bits! Je mets la sortie ci-dessous: xxx

apparemment, l'horloge () ne fonctionne pas bien, mais je ne sais pas si cela est dû à quelque chose que je fais mal ou parce que ce type de la chose n'est pas supporté avec le matériel que j'ai. Des idées pourquoi cela pourrait se produire?


11 commentaires

Êtes-vous absolument certain que l'horloge renvoie ces valeurs? Vous pouvez simplement regarder un problème d'accès à la mémoire partagée?


Pour vérifier cela, je modifie simplement l'une des valeurs de retour, dites "Démarrer", à une valeur prédéfinie ou à la valeur de l'adresse de la mémoire partagée "et que je reçois la bonne chose à l'écran.


TI a-t-il des exemples? Je pense que avec certains de leurs autres exemples de codec, ils calculaient également un temps d'exécution écoulé. Je ne me souviens pas s'ils ont utilisé l'horloge () API. Mais il semble fonctionner dans le code d'exemple du décodeur ou du codeur.


Je n'ai pas rencontré aucun exemples de codec qui utilisent également le DSP. Si vous en connaissez un, j'apprécie une référence ou un lien.


Est-il possible d'être un bug avec la boîte à outils utilisée?


C'est possible! Je vais demander à TI à ce sujet.


Est-ce que cet EXEC () a appelé «réel», appel, ou juste notation? Si c'est un EXED (), cela remplacera l'image de votre processus (en supposant la sémantique de POSIX), le temps d'arrêt ne sera jamais écrit.


J'ai édité mon post. Avec EXEC (), je voulais juste impliquer qu'il y a une fonction appelée à l'intérieur de la boucle; La fonction est en fait non pertinente et ne fait que certaines opérations de mathématiques.


Avez-vous essayé GettimeOfday () ?


Oui j'y ai pensé, mais le DSP ne le supporte pas. Je ne peux pas inclure SYS / TIME.H. Mais en tant que travail autour, je mesurez le temps d'exécution du DSP de la CPU avec GetTimeOdday () et cela fonctionne. La seule chose est que je dois soustraire manuellement les frais généraux.


Avez-vous un lien vers le manuel de référence pour le périphérique que vous utilisez?


6 Réponses :


0
votes

Curieusement, pourquoi avez-vous besoin d'un alloué précédemment Mémoire partagée . Pourquoi n'essayez-vous pas avec une variable de pile normale? Y a-t-il quelque chose que je manque?


1 commentaires

Oui, vous manquez du fait que le code affiché est exécuté sur un processeur, le DSP, tandis que le code affiche les résultats s'exécute sur un autre, la CPU du bras principal.



0
votes

Vous devez peut-être initialiser l'horloge d'abord.


2 commentaires

Autant que je sache, l'horloge () prend le point de référence comme appel initial de l'exécutable. Je ne sais pas comment initialiser / réinitialiser sa valeur manuellement. Comment tu fais ça?


Je viens de relire les pages de l'homme, la norme ne donne aucun moyen de faire une telle chose.



0
votes

Comment l'imprimez-vous? Peut-être que le problème est en réalité avec l'affichage du résultat?

sur la plupart des plates-formes Horlock_T est une longue longue longue. Si vous utilisez Printf avec% d, vous pouvez obtenir des résultats variables qui sont ce que vous voyez.


2 commentaires

J'ai imprimé la taille de (clock_t) et c'est 4. Il est défini comme non signé INT.


Pour persister sur cette veine, votre code d'impression est-il prouvé bien? Avez-vous nourri des valeurs par le même type de transfert de mémoire / impression pour vérifier s'ils viennent accrocher correctement?



0
votes

En supposant que la variable de début et de fin est de type 'clock_t', et votre mémoire partagée suppose la même chose à l'interprétation de l'autre extrémité des numéros passée, alors votre problème n'est pas avec l'appel à l'horloge et votre manutention de la différence entre les heures de fin de départ.

Je crois que votre problème est dans la mémoire partagée entre les deux. Pouvez-vous s'il vous plaît poster le code pour montrer comment vous partagez la mémoire entre deux processeurs distincts?


1 commentaires

J'utilise simplement la même méthode TI utilisée via son échantillon DMMCopy. MPU Side Stample: Gitorieux. org / ti-dspbridge / userspace / blobs / maître / sources / ... échantillon DSP: gority.org/tididspbridge/userspace/trees/user/source/... Mais je ne pense pas que le problème est avec la mémoire partagée puisque je peux passer des valeurs codées dur de DSP à la CPU correctement au lieu de l'arrêt de départ et des variables totales.



2
votes

de lire les questions jusqu'à présent, je dirais que l'affiche originale a une sensiblement plus de connaissances de cette affaire que les contributeurs jusqu'à présent, et que la suspicion que l'horloge est cassée (ou non prise en charge et renvoie un non-défini. résultat) sur le DSP semble assez probable.


3 commentaires

J'ai commencé à croire que c'est le cas aussi, il n'est donc pas nécessaire de laisser cette question comme sans réponse. Merci à vous tous.


À quel point vous pouvez jouer à BAL, que vous avez commencé à accepter de croire que vous avez sensiblement plus de connaissances que les contributeurs et sélectionnés comme la réponse celle qui indique l'une. Nice :) Je suis d'accord que l'horloge () est cassée aussi, cependant, sur OMAP.


Il semble que vous n'êtes pas la seule personne ayant des problèmes avec horloge (). Les solutions fournies ici seront peut-être utiles. Stackoverflow.com/Questtions/588307/...



0
votes

Peut-être que vous pourriez utiliser un ensemble en ligne pour accéder directement aux comptoirs de comptoir du processeur.

Le TMS320C64X + a un registre horodatage de 64 bits dans TSCL, TSCH. Le compteur n'est pas activé sur Réinitialiser, Vous devez d'abord écrire dans le registre pour démarrer le compteur (peut-être que c'est le problème avec horloge ?). La lecture du registre n'est pas assez triviale car chaque moitié doit être lue avec une instruction séparée (et vous pouvez obtenir des interruptions ...).


1 commentaires

Je ne savais pas que c'était une vieille question. C'est ce que je ne peux pas faire attention aux horodatages!