Ho un problema con un hardfault che appare in momenti apparentemente casuali in cui un puntatore punta a un indirizzo A5 o FF (il mio spazio di memoria consentito è lontano sotto a 80000000 e oltre). Sembra essere sempre lo stesso puntatore con questi due valori.Il puntatore ha assegnato in modo casuale valori misteriosi (A5A5A5A5 e FFFFFFFF) su uno stm32 utilizzando freeRTOS causando un errore.
sto usando un sistema embedded in esecuzione un processore STM32F205RE che comunica con un/bluetooth/chip GPS fm chiamato cg2900 dove si verifica questo errore.
Utilizzando un debugger, è possibile notare che il puntatore punta rispettivamente all'indirizzo A5 e FF durante alcuni test. Tuttavia sembra accadere a volte casuali, a volte riesco a eseguire il test per un'ora senza un fallimento mentre altre volte si blocca 20 secondi.
Io corro FreeRTOS come scheduler per passare da compiti diversi (uno per radio, una per bluetooth, una per altra manutenzione periodica) che potrebbe interferire in qualche modo.
Quale può essere la causa di questo? Poiché è in esecuzione hardware personalizzato, non è possibile escludere che si tratti di un problema hardware (potenzialmente). Qualche suggerimento (nessun gioco di parole) su come affrontare il debug del problema?
EDIT:
Dopo ulteriori indagini, sembra che sia molto casuale in cui si blocca, non solo tale puntatore specifica. Ho usato un gestore hardfault per ottenere i seguenti valori di questi registri (tutti i valori in esadecimale):
semi-lungo periodo prima di schianto (minuti):
R0 = 1
R1 = fffffffd
R2 = 20000400
R3 = 20007f7c
R12 = 7
LR [R14] = 200000c8 subroutine call return address
PC [R15] = 1010101 program counter
PSR = 8013d0f
BFAR = e000ed38
CFSR = 10000
HFSR = 40000000
DFSR = 0
AFSR = 0
SCB_SHCSR = 0
brevissimo termine prima di crash (secondi):
R0 = 40026088
R1 = fffffff1
R2 = cb3
R3 = 1
R12 = 34d
LR [R14] = 40026088 subroutine call return address
PC [R15] = a5a5a5a5 program counter
PSR = fffffffd
BFAR = e000ed38
CFSR = 100
HFSR = 40000000
DFSR = 0
AFSR = 0
SCB_SHCSR = 0
un altro corto (secondi):
R0 = 0
R1 = fffffffd
R2 = 20000400
R3 = 20007f7c
R12 = 7
LR [R14] = 200000c8 subroutine call return address
PC [R15] = 1010101 program counter
PSR = 8013d0f
BFAR = e000ed38
CFSR = 1
HFSR = 40000000
DFSR = 0
AFSR = 0
SCB_SHCSR = 0
Dopo un lunghissimo periodo (1 ora +):
R0 = e80000d0
R1 = fffffffd
R2 = 20000400
R3 = 2000877c
R12 = 7
LR [R14] = 200000c8 subroutine call return address
PC [R15] = 1010101 program counter
PSR = 8013d0f
BFAR = 200400d4
CFSR = 8200
HFSR = 40000000
DFSR = 0
AFSR = 0
SCB_SHCSR = 0
sembra bloccarsi nello stesso punto la maggior parte del tempo. Ho regolato la memoria in base ai suggerimenti precedenti, ma ho ancora lo stesso problema.
Grazie per il vostro tempo!
Cordiali saluti
Questi sembrano byte magici failsafe. Sei sicuro di non avere un puntatore ciondolante, un NULL non qualificato o un array locale restituito da qualche parte? –
@ H2CO3 Sì, sembrano davvero dei byte magici. Il puntatore è alla base di un array (ambito globale) e ho già una condizione che controlla che non scriva al di fuori di esso. Il puntatore stesso non viene mai assegnato una volta che è stato inizializzato alla base dell'array. – ChewToy
se potessi aggiungere del codice reale, sarebbe di grande aiuto. –