2010-07-11 29 views
3

J'ai un émulateur USB Keil ULINK2 attaché au connecteur JTAG de ma carte, qui fonctionne bien avec le Cortex- M3 CPU embarqué (série TI/Stellaris/LuminaryMicro LM3S). Il semble que les deux ports JTAG et SWJ-DP partagent les mêmes broches (et donc le connecteur sur votre carte) sur ces processeurs. L'un ne semble pas avoir la capacité ITM (printf), l'autre le fait. Les précédents utilisateurs de firmware ont toujours utilisé stdio sur UART (port série), mais j'ai besoin que le port série soit libéré pour que les messages de débogage n'interfèrent pas avec les autres données envoyées/reçues vers/depuis le port série, donc je besoin pour les messages de suivi d'aller ailleurs. Malheureusement, je n'ai qu'un seul port série sur ce forum. Je pensais que la fonctionnalité ITM (Trace) dans cette CPU signifiait que je pouvais envoyer des messages de débogage printf directement à mon débogueur/IDE (Keil uVision). La documentation de la CPU TI/Stellaris appelle cette fonction 'Port de Debug JTAG Serial Wire (SWJ-DP)', support pour lequel j'ai lu, est définitivement une fonctionnalité implémentée dans l'IDE de Keil uVision. L'ajout d'un message printf à mon code provoque le blocage de mon code lorsque je lance le débogage. Le blocage semble être ici dans les bibliothèques RTL qui sont liés à ma demande, dans la fonction _sys_open, à l'instruction BKPT:Sortie du débogage via printf sur une CPU Cortex-M3, blocage à l'instruction BKPT + confusion sur les ports JTAG et sw

    _sys_open: 
    0x00009D7A B50E  PUSH  {r1-r3,lr} 
    0x00009D7C E9CD0100 STRD  r0,r1,[sp,#0] 
    0x00009D80 F7FFFC0F BL.W  strlen (0x000095A2) 
    0x00009D84 9002  STR  r0,[sp,#0x08] 
    0x00009D86 4669  MOV  r1,sp 
    0x00009D88 2001  MOVS  r0,#0x01 
>>0x00009D8A BEAB  BKPT  0xAB 
    0x00009D8C BD0E  POP  {r1-r3,pc} 

Ce qui précède semble faire partie du code appelé par __rt_lib_init_stdio_1.

Que se passe-t-il? Je ne sais pas ce que fait BKPT. Je suppose qu'il soulève un point d'arrêt logiciel qui devrait ensuite être géré par le débogueur? Le logiciel et le matériel Keil/ARM ULINK2 ne doivent-ils pas déjà être configurés pour cela? Y a-t-il un truc pour faire fonctionner debug printf avec les ports Keil JTAG/sw? Je ne sais pas quelle est la différence entre un port sw et JTAG. sw signifie quoi exactement, je crois qu'il se réfère à l'un des deux modes possibles pour le connecteur physique JTAG sur une carte, où JTAG est un mode classique mais plus limité sans support de trace, et le mode sw ajoute le support de trace sans ajouter de pins au JTAG disposition du connecteur? Mais ce sont des systèmes embarqués, où être cryptique est la norme. Je suis nouveau au développement Cortex-M3, et beaucoup de ces choses sont nouvelles pour moi depuis les vieux jours ARM7TDMI. Mais le Keil uVision imprime ce message: "ITM ne fonctionne qu'avec le port SW, pas avec JTAG". SW est-il un port physique différent que vous devez concevoir sur votre carte? (J'utilise une carte d'application conçue sur mesure, pas une carte de démarrage de développement.)

[recherche sur Google me laisse autour de sur le fait que _sys_open et certains pragma __use_no_semihosting_swi et quelque chose d'autre sont intimement impliqués dans ce casse-tête, des instructions BRKPT en ROM Cela peut être une variante ARM de l'instruction ARM SWI ('software-interruption').]

Répondre

6

Celui-ci a été un échec de ma part pour comprendre que stdio n'est pas implémenté, mais que vous devez fournir votre propre implémentation, généralement effectuée dans un fichier appelé "retarget.c". Le nom de fichier est purement conventionnel, mais il est bien documenté (comme il s'avère) dans la documentation uVision/RTLIB de Keil

3

Je l'ai fait avec la chaîne d'outils IAR EWW ARM, mais le terme semihosting me porte à croire que l'approche de Keil est similaire. Il devrait y avoir une option lors de la spécification de la bibliothèque standard à lier pour utiliser le semi-hébergement. Cela va compiler/lier dans une bibliothèque différente qui redirige printf/putc via le port JTAG vers le débogueur. Regardez les options du projet dans l'EDI Uvision ou dans les scripts make. Dans la ligne de commande de l'éditeur de liens IAR, ceci est "--semihosting" mais est probablement différent pour les outils Keil.

BKPT est l'instruction que les outils insèrent dans la source pour déclencher le débogueur. C'est ainsi que l'EDI vous permet d'ajouter des points d'arrêt au code lorsque le débogueur ne prend pas en charge les points d'arrêt matériels (ou que vous avez déjà utilisé votre complément complet).

+0

Oui. C'est ce que signifie semi-hébergement! Printf-redirigé-à travers JTAG. –

2

Pour faire face à ce problème dans Keil uVision juste aller projeter des options. Dans l'onglet Cible/Génération de code, cochez la case Utiliser MicroLIB.

+0

Vous devez être conscient que l'utilisation de MicroLib affectera également des éléments plus subtils tels que l'implémentation d'opérations en virgule flottante (si votre cœur n'a pas de FPU) ne sera pas conforme à la norme IEEE-754. Regardez ici pour plus d'informations http://www.keil.com/support/man/docs/armlib/armlib_chr1358938938946.htm – Amomum