2012-05-08 1 views
4

Par le passé, je débuggais sans problème les fichiers exécutables chargés dans la mémoire SRAM interne de mon Cortex M3 (STM32F2). J'ai récemment chargé mon exécutable à Flash (à cause de problèmes de taille).Les points d'arrêt ne fonctionnaient pas lors du démarrage à partir de Flash

Depuis lors, le débogage avec GDB n'a pas fonctionné. Si je comprends bien, lorsque l'exécutable est en Flash, seul le point d'arrêt matériel peut être utilisé (par opposition aux points d'arrêt logiciels), et j'ai six points d'arrêt matériels. Cependant, lors de la configuration matérielle qu'un point d'arrêt GDB donne un message d'erreur:

(gdb) break main 
Breakpoint 1 at 0x800019a: file src/main.c, line 88. 
(gdb) c 
Continuing. 
Note: automatically using hardware breakpoints for read-only addresses. 
(gdb) Warning: 
Cannot insert hardware breakpoint 1. 
Could not insert hardware breakpoints: 
You may have requested too many hardware breakpoints/watchpoints. 

Ce qui pourrait aller mal? Est-ce que mes points d'arrêt matériels sont pris en arrière-plan?

Remarque: J'ai utilisé OpenOCD pour charger l'exécutable via JTAG.

+0

Avez-vous essayé de créer vos points d'arrêt avec 'hbreak'? – ams

+0

@ams: Oui, j'ai essayé. Ne fonctionne pas – Randomblue

+0

Que disent les «points d'arrêt de maintenance info»? – ams

Répondre

3

Donc, il y a essentiellement deux façons (plus une vraiment mauvaise façon) que des points d'arrêt peuvent être mises en œuvre sur un débogueur donné/combinaison de la plate-forme:

  1. Utilisez des capacités matérielles (« matériel de points d'arrêt ») pour provoquer la processeur à piéger quand il frappe une adresse particulière. Ceci est généralement limité à quelques points d'arrêt, s'il est disponible du tout.

  2. Pour chaque point d'arrêt en cours de définition, remplacez l'instruction au point d'arrêt par une instruction "trap" d'une certaine variété (c'est-à-dire une instruction qui entrera dans le débogueur). Lorsque l'un des points d'arrêt est atteint, inversez l'instruction d'origine et effectuez une seule opération une fois pour la faire fonctionner.

  3. Pas à pas dans tout le programme. Celui-ci ne compte pas vraiment, car c'est horriblement lent.

Il semble que votre débogueur n'utilise que la méthode 2 ("points d'arrêt logiciels"). Le gotcha avec cette méthode est qu'il nécessite que le programme soit accessible en écriture - et la mémoire flash n'est pas inscriptible une instruction à la fois, donc cette technique ne fonctionnera pas.

Questions connexes