Domanda

Ho un progetto integrato con uno STM32F103 (ARM Cortex M3), si sta facendo un errore difficile a volte entrare in modalità di rilascio. Come parte di recupero, vorrei recuperare il valore PC da prima del guasto duro e conservarlo per dopo il debug nella regione sostenuta batteria.

come faccio a determinare il valore del contatore di programma in corrispondenza del punto del guasto duro? Ovviamente, il PC è ora impostato per la sua posizione all'interno del interrupt hardfault.

Dove devo cercare? E 'lì un indirizzo per il normale banco di registri modalità?

Grazie!

È stato utile?

Soluzione

Cortex-M3 utilizza un modello del tutto diverso della gestione delle eccezioni dal "classico" ARM, per esempio non ha "abort modalità" di cui parla in altri post. Io suggerisco di leggere questo app nota . Ad esempio, per l'Hard Fault:

  

Il valore di SCB-> BFAR indica l'indirizzo di memoria che ha causato un errore di bus   ed è valida se il BFARVALID bit nel registro SCB-> CFSR è impostato. Il   valore della SCB-> MMFAR indica l'indirizzo di memoria che ha causato una Memory   Fault Management ed è valido se il MMFARVALID bit nel SCB-> CFSR   registro è impostato.

Per determinare il valore del PC al momento d'eccezione è necessario esaminare la pila; il processore spinge R0-R3, R12, PC e LR prima esecuzione del gestore. La pila utilizzata può essere sia principale (se il bit 2 della LR è 0) o di processo (altrimenti). Vedi pagina 13 della nota app per i dettagli.

Altri suggerimenti

Si dovrebbe esaminare la ARM Architettura di riferimento manuale nel sezione eccezioni. È necessario registrarsi per farlo.

In genere un indirizzo di rilevante sarà messo nel registro di collegamento LR (R14), ma il preciso significato varia a seconda l'eccezione, e ci sono diversi offset.

W.r.t. l'accesso al sistema bancario per l'utente / registro modalità, penso che è necessario per cambiare la modalità per accedervi.

Quando si verifica un'eccezione, il cambiamento di stato del processore dallo stato attuale allo stato abort . Nello stato di interruzione spostamenti trasformatore ad utilizzare un nuovo insieme di registri rispettivamente per sp e lr (sp_abt e sp_lr. Per un dato abortiscono, l'istruzione all'origine di errore può essere trovato in lr_abt + 8 per un prefetto circa in lr_abt + 4 (ex il manuale di riferimento ARMv7 Architecure)

Ho una FAQ su questo argomento. La pagina collegata al dal FAQ comprende colpa codice del gestore che otterrà il contatore di programma dallo stack per voi.

Ho trovato una causa comune per questi problemi sono quelli 'per loop' ritardi. Quando si utilizza -O3 semplicemente vengono ottimizzati via se non siete fa riferimento alle variabili volatili. Personalmente, preferisco l'approccio SysTick.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top