2009-11-25 4 views
5

j'ai une carte embarquée avec un 32 micro-contrôleur, et un système d'exploitation construit sur mesure,grande vitesse traçage

  • Malheureusement, à partir de maintenant, la connexion au PC est uniquement par port série ,
  • La mémoire interne est limitée à 512 Ko.
  • Il y a au-moins 10 tâches dans le système

Question,

  • Je veux capturer la séquence dans qui commutateur de tâche arrive,
  • Et quand je tente d'écrire dans la RAM, il déborde ~~
  • Et quand je tente de l'envoyer par le port série , le comportement du système modifications (en tant que port série est lent)

Il n'existe aucun stockage persistant comme NAND FLASH ou quelque chose.

  • Pouvez-vous penser à une idée?

S'il n'y a aucun moyen avec le port série,

  • Pouvez-vous les gars recommander une autre interface ou que le port série.

Répondre

5

Probablement que vous voulez déterminer pourquoi votre RAM déborde lors de la connexion, vous n'avez pas besoin de beaucoup de journalisation si vous vous connectez seulement ce que vous devez voir. Vous pouvez vous connecter à un tampon circulaire pour éviter le débordement. Avec la journalisation Ram, vous pouvez probablement courir à la vitesse réelle. La connexion à un lien de communication ajoutait une latence, des interruptions et des commutations de tâches au système.

Ne pas tout enregistrer dès le début. Connectez-vous juste assez pour comprendre quand votre problème se produit. Une fois que vous savez quand votre problème se produit, notez plus de détails dès que la section du problème est saisie.

Si vous voulez vraiment résoudre le problème en un rien de temps, procurez-vous un pod Trace Green Hills. Votre matériel doit être conçu pour permettre la connexion du Pod et il est terriblement cher. Cependant les résultats sont incroyables ...

1

Commencez par calculer combien de commutateurs de tâches vous aurez et comparez-les à la vitesse de votre série. Peut-être que ce n'est tout simplement pas possible de pousser cette quantité de données? Tenir compte de

  • USB - jusqu'à 480Mb/s
  • RS485 - devrait vous donner de 100Kb/s à 35 Mb/s
  • I2C - donne environ 100 Ko/s

Si série est assez, peut-être aller avec cache? D'abord écrire en mémoire et est une tâche séparée obtenir des données de la mémoire dans les blocs envoyer à la série. Recherchez des choses comme circular buffering pour éviter le verrouillage.

2

Je ne sais pas quelle plate-forme que vous utilisez, mais ...

Les ARM: s ont un bloc appelé ETM, qui résout votre problème. Et avec un débogueur hardcore de Lauterbach vous pouvez utiliser ce bloc.

L'inconvénient est que le coût est élevé, à peu près la même que celle d'une petite nouvelle voiture :)

Et je ne sais pas si votre matériel a un bloc ETM ...

1

Avez-vous besoin comportement en temps réel lors de l'exécution des traces? Je veux dire, est-ce une option pour se connecter à la RAM jusqu'à ce que le tampon soit (presque) plein, puis entrez une section critique empêchant l'application de commutation de tâches et d'interruption de service et le dumping sur la ligne série. Cela bloque le fonctionnement de l'application pendant un certain temps, mais selon le test que vous exécutez, il peut être acceptable. Tout suivi en temps réel sur un port série, USB, ... influencera le comportement de l'application, il n'est donc pas certain que ce que vous mesurez soit pertinent. Une autre chose que vous pouvez faire (si ce n'est pas déjà fait) est de rendre la journalisation aussi petite que possible, par exemple: 1 octet par tâche avec le plus important grignotage l'ID de tâche de l'ancienne tâche et le moins significatif grignoter l'ID de tâche de la nouvelle tâche. De cette façon, vous devriez être en mesure de couvrir un grand nombre de commutateurs de tâches dans vos 512 Ko de mémoire.

5

Si vous pouvez utiliser un port de sortie sur les microcontrôleurs sans trop déranger les autres matériels, vous pouvez émettre le numéro de tâche en cours et le capturer avec un analyseur logique.

+0

Personnellement, je pense que l'utilisation d'un analyseur logique pour déboguer votre logiciel est une perte de temps, mais je l'ai fait moi-même à quelques reprises ... en cas d'épuisement des options. – Gerhard

+1

J'aime qu'il soit immédiat et perturbe très peu le timing. Ce n'est pas la méthode de choix pour les erreurs logiques complexes, mais pour maîtriser les problèmes de synchronisation, c'est génial. – starblue

3

Légèrement plus léger que l'ARM ETM mis en évidence par Johan, le MIPI System Trace Protocol a été conçu pour ce type d'activité de trace. Il est conçu pour la traçabilité d'instrumentation, et les implémentations typiques offrent environ 500 Mbit/s de bande passante de traçage sur un port à quatre bits.

Cependant, il est peu probable que votre conseil ait le support pour cela. :-(En outre, vous avez besoin d'un récepteur de trace, ce qui peut à nouveau coûter le prix d'une petite voiture (Lauterbach ont un).

3
  • Et quand je tente d'écrire dans la RAM, il Débordements ~~

Qu'est-ce que vous connectez et la taille d'un tampon ne vous permettent? Sans savoir comment vous mis cela, il est difficile de conseiller, mais il y a probablement beaucoup vous pouvez faire pour optimiser l'exploitation forestière en mémoire.

Si, à chaque changement de contexte, vous consignez l'ID de la tâche et le mot de passe e-stamp (disons 3 octets par événement), vous devriez avoir 341 commutateurs de contexte par Ko. Dans de nombreux systèmes, ce serait une période importante, et souvenez-vous que c'est pour seulement 1K de tampon. Si vous consignez également des interruptions, cela peut être plus coûteux, tout comme la journalisation de tous les appels système plutôt que simplement des changements de contexte. Peut-être que vous pourriez implémenter un filtre dans la journalisation, de sorte qu'il n'a enregistré que des tâches ou des événements d'intérêt. Vous pouvez également implémenter des déclencheurs d'événement de sorte que les données consignées soient automatiquement sauvegardées sur votre port série lorsqu'un tel événement se produit (et lorsque l'événement concerné s'est produit, l'acte de transmission n'est donc pas intrusif pour votre enquête). Vous devez également implémenter le tampon en tant que tampon circulaire de sorte que les données les plus anciennes soient supprimées au lieu de déborder afin de libérer de l'espace pour le nouveau, de sorte qu'à l'apparition d'un événement déclencheur, toutes les informations sur l'événement.

2

Avez-vous accès à un gpio ou à des points de test?En fonction du nombre de tâches réellement échangées, vous pouvez définir un gpio pour chaque touche de tâche et observer avec un oscilloscope ou un analyseur logique. Il suffira de comprendre la commutation de base et la performance des tâches à problèmes, et il sera moins cher qu'un débogueur (au moins les pièces coûtent, et le travail si vous avez accès et savez comment programmer le gpio) Cela peut être assez pour résoudre le problème.

+0

+1 Une bonne idée pour une plateforme spécifique. Mais pouvez-vous me donner une solution générique que nous pouvons généraliser à travers les plates-formes matérielles. – Alphaneo

+0

@Alphaneo - Convenu que le GPIO est quelque peu spécifique à une plate-forme particulière. Cependant, beaucoup sinon la plupart des micro-contrôleurs/microprocesseurs intégrés seront GPIO. Vous pouvez résumer avec une interface GPIO générique et isoler l'accès hw spécifique à un fichier par plate-forme. – simon

2

lorsque je tente de l'envoyer si le port série, les changements de comportement du système (comme port série est lent)

Cela fait sonner comme si vous faites le blocage des écritures au port série (mes excuses si ma supposition est fausse).

Le port série est peut-être lent, mais si vous utilisez TX à base d'interruptions, il devrait avoir un impact mineur sur votre système. C'est-à-dire, écrivez vos données dans un tampon circulaire, puis disposez d'une routine d'interruption TX série pour saisir les octets du tampon et les transmettre en arrière-plan. Avec 57 600 bits/s, 8-N-1, vous pouviez transmettre jusqu'à 5 760 octets par seconde à 57 600 bits/s. Si votre sélecteur de tâches génère un horodatage de 2 octets plus un ID de tâche de 1 octet, vous pouvez suivre jusqu'à 1 900 commutations de tâches par seconde. Mais vous pouvez vouloir l'encadrer, par ex. en utilisant COBS, ce qui signifierait 5 octets par enregistrement, de sorte que vous pouvez suivre jusqu'à 1 100 commutateurs de tâches par seconde.

+0

Merci pour la réponse. J'ai l'impression que nous enverrons seulement des données à travers le port sans faire d'autre travail? Est-ce faux?. BTW, les commutateurs de tâches sont beaucoup, beaucoup plus rapide et de l'ordre de Micro-secondes :-( – Alphaneo

+0

Désolé, je ne comprends pas bien votre question –

+0

Voulez-vous dire que vous avez quelque chose comme 100 000 commutateurs de tâches par seconde? –