Vorrei acquisire, decodificare e visualizzare le informazioni di traccia ITM per un MCU Cortex-M4 (nel mio caso, un SAM4S Atmel). In particolare, voglio catturare le eccezioni e i dati di traccia utente relativi ad altri segnali sulla mia scheda (ad esempio, mostra tutti i segnali e le informazioni di tracciamento sulla stessa timeline).Come posso acquisire e visualizzare le informazioni di traccia ITM su un MCU Cortex-M4?
risposta
questo può essere fatto utilizzando la seguente procedura:
- Luogo debugger in modalità SWD. Se si utilizza J-Link Segger su Linux, questo può essere fatto con
JLinkGDBServer -if swd
- Aggiungere codice alla MCU per abilitare la traccia. Imposta la velocità in bit su un valore adatto alle tue esigenze (ho usato 8 MHz). Esempio di codice Ada è sotto.
- Utilizzare l'analizzatore logico per acquisire i dati di traccia sulla linea TRACESWO dal processore SAM4S. Ho usato una Saleae Logic Pro 16 con frequenza di campionamento di 100 MHz.
Converti i dati in un formato utilizzabile da sigrok. Utilizzando le Saleae per acquisire i dati, questo comprende i seguenti passaggi:
- Acquisisci utilizzando solo i primi 8 canali (quindi viene esportato un byte per campione).
- Esportare i dati come binari su
trace.bin
, scrivendo un byte per ogni campione. convertirli in un file utilizzando trace.sr:
sigrok-cli -i trace.bin -I binary:samplerate=100000000,numchannels=4 -o trace.sr
- Aprire il file
trace.sr
in PulseView. - Aggiungi decodificatore UART al canale TRACESWO, bit rate 8000000.
- Decodificatore ARM-ITM stack.
Vedere http://www.sigrok.org/blog/new-protocol-decoders-arm-tpiu-itm-etmv3 per ulteriori informazioni.
codiceEsempio Ada per SAM4S Trace:
sam4s-trace.ads:
with Interfaces;
package SAM4S.Trace is
pragma Preelaborate;
type Channel_Type is new Integer range 0 .. 31;
type Value_Type is new Interfaces.Unsigned_32;
procedure Initialize;
procedure Put (Channel : Channel_Type;
Value : Value_Type);
procedure Put (Channel : Channel_Type;
Message : String);
end SAM4S.Trace;
sam4s-trace.adb:
with System;
with System.Storage_Elements; use System.Storage_Elements;
package body SAM4S.Trace is
procedure Initialize is
ITM_LAR : Interfaces.Unsigned_32
with Address => System'To_Address (16#E000_0FB0#), Volatile;
ITM_TCR : Interfaces.Unsigned_32
with Address => System'To_Address (16#E000_0E80#), Volatile;
ITM_TER : Interfaces.Unsigned_32
with Address => System'To_Address (16#E000_0E00#), Volatile;
ITM_TPR : Interfaces.Unsigned_32
with Address => System'To_Address (16#E000_0E40#), Volatile;
DEMR : Interfaces.Unsigned_32
with Address => System'To_Address (16#E000_EDFC#), Volatile;
TPIU_SPP : Interfaces.Unsigned_32
with Address => System'To_Address (16#E004_00F0#), Volatile;
TPIU_FFCR : Interfaces.Unsigned_32
with Address => System'To_Address (16#E004_0304#), Volatile;
TPIU_ACPR : Interfaces.Unsigned_32
with Address => System'To_Address (16#E004_0010#), Volatile;
DWT_CTRL : Interfaces.Unsigned_32
with Address => System'To_Address (16#E000_1000#), Volatile;
use Interfaces;
begin
-- Enable write access via the Lock Access Register.
ITM_LAR := 16#C5AC_CE55#;
-- Enable the ITM, enable SWO mode behavior, enable synchronization
-- packets, enable DWT event submission, enable timestamps.
ITM_TCR := 16#0001_001F#;
-- Enable access in user mode to all 32 channels.
ITM_TPR := 16#0000_0000#;
-- Enable all 32 trace channels.
ITM_TER := 16#FFFF_FFFF#;
-- Set TRCENA bit to 1 in Debug Exception and Monitor Register.
DEMR := DEMR or 16#0100_0000#;
-- Select NRZ serial wire output.
TPIU_SPP := 16#0000_0002#;
-- Deactivate formatter.
TPIU_FFCR := 16#0000_0100#;
-- Set prescalar (/10).
-- TPIU_ACPR := 16#0000_0009#;
-- Set prescalar (/15).
TPIU_ACPR := 14;
-- Enable exception trace and exception overhead.
DWT_CTRL := DWT_CTRL or 16#0005_0000#;
end Initialize;
procedure Put (Channel : Channel_Type;
Value : Value_Type) is
Port_Reg : Value_Type with Address => System'To_Address (16#E000_0000#) +
4 * Channel_Type'Pos (Channel), Volatile;
begin
-- Port register lsb is set when the the FIFO can accept at least one
-- word.
while Port_Reg = 0 loop
null;
end loop;
Port_Reg := Value;
end Put;
procedure Put (Channel : Channel_Type;
Message : String) is
Port_Reg : Value_Type with Address => System'To_Address (16#E000_0000#) +
4 * Channel_Type'Pos (Channel), Volatile;
begin
-- Port register lsb is set when the the FIFO can accept at least one
-- word.
for Index in Message'Range loop
while Port_Reg = 0 loop
null;
end loop;
Port_Reg := Value_Type (Character'Pos (Message (Index)));
end loop;
end Put;
end SAM4S.Trace;
Come si contrassegnati con "analizzatore logico" , questo potrebbe essere off-topic, ma ho trovato il seguente estremamente utile. Con Keil uVision (e probabilmente anche con altri IDE) è possibile reindirizzare i dati ITM su file utilizzando un file .ini personalizzato.
Abilitare SWJ nel debugger, utilizzare la porta SW. Abilita traccia, abilita le porte di stimolo che si desidera utilizzare.
scrivere un file .ini con un contenuto simile a questo:
ITMLOG 0 > "debug.log"
ITMLOG 1 > "testlog.xml"
Questo wil reindirizzare canale ITM 0 in un file denominato "debug.log", e il canale 1 su "testlog.xml" (sintassi dei file da here).
Per utilizzare i canali facilmente con fprinf in te c-codice che utilizzo seguente configurazione:
struct __FILE { int channel; };
#include <stdio.h>
#define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n)))
#define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n)))
#define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n)))
#define DEMCR (*((volatile unsigned long *)(0xE000EDFC)))
#define TRCENA 0x01000000
int fputc(int ch, FILE *f) {
if (DEMCR & TRCENA) {
while (ITM_Port32(f->channel) == 0);
ITM_Port8(f->channel) = ch;
}
return(ch);
}
e il loro utilizzo nell'ambito del progetto:
FILE debug_stream = { .channel = 0 };
FILE test_stream = { .channel = 1 };
int main(void) {
fprinf(&debug_stream, "this is a debug message, it will be rerouted to debug.log");
fprinf(&test_stream, "this is a test message, it will be placed in testlog.xml");
}
Riferimento: link
- 1. Come posso visualizzare i log di traccia .NET in TeamCity?
- 2. Come visualizzare le informazioni su un HWND all'interno di Visual Studio durante il debug?
- 3. Come visualizzare la traccia dello stack su un'eccezione rilevata?
- 4. Come posso acquisire eventi di tastiera e utilizzare un monitor come display di testo su Linux?
- 5. Come visualizzare le informazioni all'interno di modal dall'URL?
- 6. Tentativo di visualizzare le informazioni sulla versione del pacchetto in un messaggio "Informazioni"
- 7. cURL: come visualizzare le informazioni di avanzamento durante il caricamento?
- 8. Come posso visualizzare le informazioni del mio database di app Android?
- 9. Come visualizzare una traccia su un livello con lat e long
- 10. Come visualizzare le informazioni del fornitore del mio NIC?
- 11. Come posso visualizzare la descrizione comando o le informazioni sull'oggetto al passaggio del mouse?
- 12. Come posso recuperare le informazioni del monitor?
- 13. Come visualizzare le informazioni del file PFX in modo visivo?
- 14. Come acquisire parte dello schermo e salvarlo su un BMP?
- 15. Come posso visualizzare un modulo su un monitor secondario?
- 16. Come faccio a visualizzare la casella Informazioni su C#?
- 17. C'è un modo in PHP per acquisire TUTTE le informazioni trasmesse usando il metodo POST
- 18. Posso, come un essere umano, visualizzare le viste di rendering di RSpec, e se, quindi come?
- 19. Come posso visualizzare graficamente le schede macvim?
- 20. Come posso acquisire l'output di un comando vim in un registro, senza le nuove righe?
- 21. Componente per visualizzare le informazioni del registro in Delphi
- 22. Come visualizzare le informazioni di data e ora localizzate per gli utenti Web con ASP.NET
- 23. Posso ottenere le informazioni su tabella, colonna e tipo da un modello?
- 24. Come posso acquisire l'output stdout di un processo figlio?
- 25. Come posso visualizzare un NSError?
- 26. Informazioni su Oracle Apex_Application.G_Fnn e come utilizzarlo
- 27. Come posso acquisire i pacchetti di rete per PID?
- 28. Attraversare l'albero DOM per visualizzare le informazioni sul parentNode
- 29. Come acquisire l'immagine senza visualizzare l'anteprima in iOS
- 30. Come posso tenere traccia di tutte le collisioni di Box2D in modo pulito e gestibile?