le mie informazioni di contatto
Posta[email protected]
2024-07-08
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Recentemente, ho scoperto che dopo aver unito alcuni codici su altre piattaforme in STM32, si è verificato un problema di crash, quindi volevo risolvere in generale i principi della risoluzione dei problemi di crash su STM32.
Quanto sopra è un'informazione di stampa di un arresto anomalo. Dopo un'indagine, è stato riscontrato che la profondità dello stack del timer di FreeRTOS era impostata su un valore troppo piccolo. C'erano troppi contenuti in esecuzione nella funzione di esecuzione del timer e la memoria richiesta da ciascuna variabile locale lo era non è stato rilasciato in tempo e alla fine si è verificato un incidente.
Parliamo del timer in FreeRTOS. In realtà può essere inteso come un'attività, che equivale a creare un thread per tenere il tempo, quindi eseguire il polling e interrogare l'elenco dei timer corrente per scoprire quale tempo di esecuzione del timer è scaduto Esso.
Pertanto è necessario configurare anche la dimensione della memoria utilizzata dal timer.
R0~R12 sono registri per uso generale
R13 è lo stack pointer e fisicamente ci sono due stack pointer:Il puntatore dello stack principale (MSP) è il puntatore dello stack predefinito, che verrà selezionato per l'uso dopo il ripristino e quando il processore è in modalità di elaborazione. L'altro puntatore dello stack è il puntatore dello stack del processo (PSP), che può essere utilizzato solo nel thread; modalità (quando è presente un RTOS))
R14 è il registro di collegamento (LR), utilizzato per salvare l'indirizzo di ritorno quando viene chiamata una funzione o una subroutine. Al termine della funzione o della subroutine, il controllo del programma può tornare al programma chiamante caricando il valore di LR nel contatore del programma (PC) e continuare l'esecuzione. Durante la gestione delle eccezioni, LR verrà automaticamente aggiornato a uno speciale EXC_RETURN (ritorno eccezione ) valore.
Ad esempio, a chiama b. A questo punto, l'indirizzo della sottofunzione b viene inserito nel puntatore pc e l'indirizzo di a viene inserito in LR. Dopo che b viene eseguito, l'indirizzo di a viene inserito nel puntatore PC dalla LR per l'esecuzione.
Un crash in arm è in realtà un'interruzione anomala. Quando arriva l'interruzione, il processore salverà lo stato corrente dell'attività nello stack.
telaio dello stack
Stack Frame si riferisce ad un'area di memoria utilizzata per memorizzare parametri di funzione, variabili locali, indirizzi di ritorno e altre informazioni durante una chiamata di funzione.
Quando viene chiamata una funzione, STM32 le assegnerà uno stack frame. La dimensione dello stack frame dipende da fattori quali il numero di parametri, il numero di variabili locali e le impostazioni di ottimizzazione del compilatore.
Combinando le informazioni di cui sopra, possiamo sapere che se vogliamo sapere quale funzione si è bloccata quando la funzione si è bloccata, dobbiamo trovare lo stack frame che è stato inserito nello stack quando è stata attivata l'interruzione dell'eccezione e questo stack frame è nell'R13 (Punto stack) puntatore dello stack Memorizzato.
Troviamo un modo per ottenere il contenuto puntato dal puntatore del registro R13 nella funzione di gestione degli arresti anomali HardFault_Handler(), e quindi stamparlo.
Il microcontrollore STM32 utilizza il core ARM Cortex-M, che ha due puntatori di stack, uno è il puntatore dello stack principale (MSP) e l'altro è il puntatore dello stack di processo (PSP).
MSP (puntatore dello stack principale): Il puntatore dello stack principale viene utilizzato principalmente per il kernel del sistema operativo o per la routine del servizio di interruzione.
PSP (puntatore dello stack di processo): Il puntatore dello stack di processo viene utilizzato principalmente dalle applicazioni utente.
Quando il core Cortex-M ritorna in modalità Thread, può tornare al puntatore dello stack principale MSP o al puntatore dello stack di processo PSP in base all'impostazione del registro CONTROL.
PSP memorizza il contesto relativo all'applicazione utente in esecuzione. In particolare includere quanto segue:
一些或全部的通用寄存器的值,这些寄存器在用户程序运行时会使用。
Program Counter(PC):指向下一条将要执行的指令。
Processor Status Register(PSR)的值:包含标志位状态。
Puntatore dello stack: salva la posizione dello stack frame precedente.
Di solito, quando si cambia attività (o si cambia contesto), queste informazioni verranno salvate nello stack. Quando viene avviata una nuova attività, le sue informazioni sul contesto verranno ripristinate dallo stack.
Va notato che il contenuto specifico salvato varierà in base alla specifica strategia di pianificazione e alla progettazione del sistema operativo.
Determinare il valore del puntatore LR/PC
Per prima cosa dobbiamo determinare se viene utilizzato RTOS. In tal caso, le informazioni sull'arresto anomalo dovrebbero essere archiviate nella PSP.
Dobbiamo prima leggere queste informazioni e poi, dopo aver conosciuto i valori di LR e PC, possiamo trovare il punto di incidente tramite Debug in keil5 o trovare il punto di incidente corrispondente tramite il file di mappa generato durante il processo di compilazione.
Fare clic con il tasto destro nella finestra Disassembly: