Accedere all'ETM di una Nucleo F 401RE tramite codice

Inserire qui richieste sull'uso del forum.
Antennato81
Messaggi: 23
Iscritto il: gio 22 mar 2018, 18:15

Re: Accedere all'ETM di una Nucleo F 401RE tramite codice

Messaggio da Antennato81 »

Ciao!
guarda mi son spiegato in maniera cervellotica io, Mea culpa, :D ... Devi sostituire alla Putchar la funzione che utilizzi tu per mandare fuori un carattere sulla seriale del micro, ed ogni volta che la chiami gli passi un carattere ;) .
That's All!

;-)
lorenrus
Messaggi: 15
Iscritto il: mar 18 set 2018, 19:54

Re: Accedere all'ETM di una Nucleo F 401RE tramite codice

Messaggio da lorenrus »

Antennato81 ha scritto: mar 25 set 2018, 9:32 Ciao!
guarda mi son spiegato in maniera cervellotica io, Mea culpa, :D ... Devi sostituire alla Putchar la funzione che utilizzi tu per mandare fuori un carattere sulla seriale del micro, ed ogni volta che la chiami gli passi un carattere ;) .
That's All!

;-)

Io in realtà avevo scritto questo:

unsigned int *pointer = (unsigned int *) 0x0042000 // Faccio puntare pointer all'indirizzo di memoria seguente

poi dichiaro:

unsigned int var ;

var = *pointer; // Quindi associo a var il contenuto di quello a cui punta pointer

ed infine volevo fare:

printf("var"); // Per farmi restituire i 32 bit contenuti dall'indirizzo di memoria puntato da pointer

Grazie
Antennato81
Messaggi: 23
Iscritto il: gio 22 mar 2018, 18:15

Re: Accedere all'ETM di una Nucleo F 401RE tramite codice

Messaggio da Antennato81 »

Ciao,
guarda per scrivere il contenuto puntato dovresti usare questo formalismo che ti riproto in un esempio:

unsigned long a = 1;
unsigned long *t = &a;

printf("%lu\n", *t);

Cosi' stampi il valore puntato di a.
Antennato81
lorenrus
Messaggi: 15
Iscritto il: mar 18 set 2018, 19:54

Re: Accedere all'ETM di una Nucleo F 401RE tramite codice

Messaggio da lorenrus »

Antennato81 ha scritto: mar 25 set 2018, 10:04 Ciao,
guarda per scrivere il contenuto puntato dovresti usare questo formalismo che ti riproto in un esempio:

unsigned long a = 1;
unsigned long *t = &a;

printf("%lu\n", *t);

Cosi' stampi il valore puntato di a.
Antennato81
Si va bene ma così facendo non posso scegliere io a quale indirizzo di memoria della ETM puntare.

Poichè cosi, correggimi se sbaglio, la variabile 'a' verrà allocata in una locazione di memoria in cui verrà salvato il valore di uno.
Con la seconda riga invece assegni a 't' l'indirizzo di a.

Invece io ho già l'indirizzo e devo vedere il contenuto di questo indirizzo.

Quindi ho fatto in quel modo poichè ho bisogno di vedere come sono settati inizialmente i bit di alcuni registri dell'ETM e poi successivamente cambiarli in modo da poter attivare l'ETM.

Grazie
Antennato81
Messaggi: 23
Iscritto il: gio 22 mar 2018, 18:15

Re: Accedere all'ETM di una Nucleo F 401RE tramite codice

Messaggio da Antennato81 »

Guarda se hai un indirizzo specifico puoi inizializzare direttamente la variabile puntatore con un indirizzo di tuo interesse:

ne precedente esempio potresti fare

unsigned long *t = (unsigned long *)0xE0042000;

printf("%lu\n", &t);

questo solo per leggere l'indirizzo ...

per scriverci dentro le cose cambiano un attimo ...

Dimmi se era questo che volevi sapere altrimenti cerco di puntate dritto a quello che ti serve.
lorenrus
Messaggi: 15
Iscritto il: mar 18 set 2018, 19:54

Re: Accedere all'ETM di una Nucleo F 401RE tramite codice

Messaggio da lorenrus »

Antennato81 ha scritto: mar 25 set 2018, 14:02 Guarda se hai un indirizzo specifico puoi inizializzare direttamente la variabile puntatore con un indirizzo di tuo interesse:

ne precedente esempio potresti fare

unsigned long *t = (unsigned long *)0xE0042000;

printf("%lu\n", &t);

questo solo per leggere l'indirizzo ...

per scriverci dentro le cose cambiano un attimo ...

Dimmi se era questo che volevi sapere altrimenti cerco di puntate dritto a quello che ti serve.
Si esatto che poi è la stessa cosa che ho scritto io prima nel messaggio precedente, con alcune differenze però:

- io ho utilizzato unsigned int perchè il tipo int alloca 4byte ed i miei registri sono a 32 bit
- avevo allocato una variabile in più di nome var a cui assegnavo l'indirizzo contenuto in pointer
- la mia printf è printf("var");

Perchè tu ci metti &t nella printf , non basta metterci solo t dato che ti lo stai facendo già puntare all'indirizzo che ti serve ?

Grazie
Antennato81
Messaggi: 23
Iscritto il: gio 22 mar 2018, 18:15

Re: Accedere all'ETM di una Nucleo F 401RE tramite codice

Messaggio da Antennato81 »

Ciao,
la & "e commerciale" serve per dire che tu vuoi vedere l'inidirzzo, se la togli vedi il contenuto. Scegli tu cosa guardare. Per il long o l'int ti cambia poco e niente:

unsigned long 32 4 (word-aligned) 0 to 4,294,967,295 = 0xFFFFFFFF

unsigned int 32 4 (word-aligned) 0 to 4,294,967,295 = 0xFFFFFFFF

Lo puoi vedere tu stesso da questo link:

http://www.keil.com/support/man/docs/ar ... 009502.htm

Bye
lorenrus
Messaggi: 15
Iscritto il: mar 18 set 2018, 19:54

Re: Accedere all'ETM di una Nucleo F 401RE tramite codice

Messaggio da lorenrus »

Antennato81 ha scritto: mar 25 set 2018, 15:00 Ciao,
la & "e commerciale" serve per dire che tu vuoi vedere l'inidirzzo, se la togli vedi il contenuto. Scegli tu cosa guardare. Per il long o l'int ti cambia poco e niente:

unsigned long 32 4 (word-aligned) 0 to 4,294,967,295 = 0xFFFFFFFF

unsigned int 32 4 (word-aligned) 0 to 4,294,967,295 = 0xFFFFFFFF

Lo puoi vedere tu stesso da questo link:

http://www.keil.com/support/man/docs/ar ... 009502.htm

Bye

Ok perfetto. Ti ringrazio molto per la tua disponibilità.
Detto ciò quindi, per usare la printf nella funzione putchar del link che mi hai inviato precedentemente, cosa devo metterci dentro ?

Grazie
Antennato81
Messaggi: 23
Iscritto il: gio 22 mar 2018, 18:15

Re: Accedere all'ETM di una Nucleo F 401RE tramite codice

Messaggio da Antennato81 »

Allora la tua funzione da modificare e':

static inline void _out_char(char character, void* buffer, size_t idx, size_t maxlen)
{
(void)buffer; (void)idx; (void)maxlen;
if (character) {
_putchar(character);
}
}

al posto della Putchar dovresti mettere la chiamata del HAL che usi per scrivere sulla seriale, ad esempio se utilizzi le API fornite da ST dovresti modificarla con:

USART_SendData(USART1, character);

quindi la tua funzione diventera':

static inline void _out_char(char character, void* buffer, size_t idx, size_t maxlen)
{
(void)buffer; (void)idx; (void)maxlen;
if (character) {
USART_SendData(USART1, character);
}
}

Ovviamente io ho usato USART1 e soprattutto io ho questa chiata ma le cose cambiano da versione di API a micro, l'ST si e' divertita motlo a cambiare le carte in tavola ...
Ovviamente se la seriale funziona o no fai prima delle prove, altrimenti nn fai altro che aggiungere layer di ipotetici problemi.

Antennato81
lorenrus
Messaggi: 15
Iscritto il: mar 18 set 2018, 19:54

Re: Accedere all'ETM di una Nucleo F 401RE tramite codice

Messaggio da lorenrus »

Antennato81 ha scritto: mar 25 set 2018, 15:59 Allora la tua funzione da modificare e':

static inline void _out_char(char character, void* buffer, size_t idx, size_t maxlen)
{
(void)buffer; (void)idx; (void)maxlen;
if (character) {
_putchar(character);
}
}

al posto della Putchar dovresti mettere la chiamata del HAL che usi per scrivere sulla seriale, ad esempio se utilizzi le API fornite da ST dovresti modificarla con:

USART_SendData(USART1, character);

quindi la tua funzione diventera':

static inline void _out_char(char character, void* buffer, size_t idx, size_t maxlen)
{
(void)buffer; (void)idx; (void)maxlen;
if (character) {
USART_SendData(USART1, character);
}
}

Ovviamente io ho usato USART1 e soprattutto io ho questa chiata ma le cose cambiano da versione di API a micro, l'ST si e' divertita motlo a cambiare le carte in tavola ...
Ovviamente se la seriale funziona o no fai prima delle prove, altrimenti nn fai altro che aggiungere layer di ipotetici problemi.

Antennato81
Ok perfetto ho capito, quindi io poi nel mio main posso richiamare direttamente printf(....), giusto ?

Grazie ancora per la tua disponibilità
Rispondi