Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Curioso allineamento della memoria in C

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto UtenteMassimoB, Foto Utentefairyvilje

0
voti

[11] Re: Curioso allineamento della memoria in C

Messaggioda Foto UtenteIlGuru » 17 dic 2018, 18:35

Alle volte mi chiedo sei i processori si meritino quello che gli facciamo fare
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
3.920 1 9 13
Master
Master
 
Messaggi: 1240
Iscritto il: 31 lug 2015, 23:32

0
voti

[12] Re: Curioso allineamento della memoria in C

Messaggioda Foto Utenteboiler » 17 dic 2018, 18:41

Altre volte mi chiedo io se mi merito certi sistemi pleistocenici.

Boiler
Avatar utente
Foto Utenteboiler
14,4k 4 7 13
G.Master EY
G.Master EY
 
Messaggi: 2443
Iscritto il: 9 nov 2011, 12:27

0
voti

[13] Re: Curioso allineamento della memoria in C

Messaggioda Foto Utentexyz » 17 dic 2018, 23:21

boiler ha scritto:P.S.: ancora prima di spedire... trovato il problema... un cast sbagliato

Ok quindi un errore software :ok:

Stavo per scrivere una patrilocalità degli ARM che può essere utile saperlo. Gli ARM possono essere sia little-endian che big-endian, di solito sono configurati in little-endian (il mio allineamento preferito ). Per lo switch esiste una istruzione assembler SETEND:

https://developer.arm.com/products/soft ... ons/setend

Una verifica iniziale se LE o BE permette di evitare grattacapi successi, non in questo caso.
Avatar utente
Foto Utentexyz
5.335 2 4 5
Master EY
Master EY
 
Messaggi: 1405
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[14] Re: Curioso allineamento della memoria in C

Messaggioda Foto Utenteboiler » 17 dic 2018, 23:51

xyz ha scritto:Ok quindi un errore software :ok:

Non ne sono ancora così sicuro... Ho visto un comportamento molto strano prima di andarmene a casa.

Ho una funzione wrapper attorno alla roba di basso livello che lavora direttamente sui registri della periferica hardware.
A questa funzione passo un parametro come float. Pass by value, quindi niente pointers, niente roba che può indurre in errore.

Se passo un valore (diciamo 3.14) alla funzione, mi ritrovo in memoria qualcosa di inspiegabile.
Se invece metto hardcoded all'interno della funzione il valore di 3.14 e la chiamo con un parametro qualsiasi (che viene ignorato), allora mi ritrovo in memoria i bytes corrispondenti a 3.14.

Ancora piú assurdo: prima di scrivere cancello la memoria, quindi contiene 0xFF ovunque.
Chiamo la funzione di cui sopra passando il parametro due volte di fila.
La prima volta mi ritrovo 0x00 e la seconda volta l'insalata di bit nella memoria (parlo di due indirizzi diversi).

Inizio a sentire puzza di problema di timing.

Gli ARM possono essere sia little-endian che big-endian

Lo so :ok:
Ma è indifferente per me, a patto che questa impostazione rimanga costante.

Grazie per l'intervento
Boiler
Avatar utente
Foto Utenteboiler
14,4k 4 7 13
G.Master EY
G.Master EY
 
Messaggi: 2443
Iscritto il: 9 nov 2011, 12:27

0
voti

[15] Re: Curioso allineamento della memoria in C

Messaggioda Foto Utenteluxinterior » 18 dic 2018, 10:22

Sembrerebbe uno stack overflow.
Oppure un interrupt che tocca la variabile mentre sotto la leggi 8 bit alla volta,
Avatar utente
Foto Utenteluxinterior
2.199 2 4 8
Expert EY
Expert EY
 
Messaggi: 1211
Iscritto il: 6 gen 2016, 17:48

0
voti

[16] Re: Curioso allineamento della memoria in C

Messaggioda Foto Utenteboiler » 18 dic 2018, 11:29

Nessun interrupt e non vedo ragioni per sospettare uno stack overflow.

Ho isolato il problema, ma non ho idea di cosa lo causi:
Codice: Seleziona tutto
// var 1 (tempVariable is uint32_t)
//tempVariable = (uint32_t)(CalData.Zero - CalData.ZeroOffset);
//flashWrite(0x00, tempVariable);

// var 2
//flashWrite(0x00, (uint32_t)(CalData.Zero - CalData.ZeroOffset));

// var 3
flashWrite(0x00, 20513);


Qui riscrivo i risultati nell'EEPROM emulata all'interno della memoria Flash del micro.

Se uso la variante 3 (quella che risulta non commentata qui sopra), ottengo quello che mi aspetto di ottenere: nella cella della memoria (larga in questo caso 32 bit) leggo 0x00005021, che corrisponde a 20513.

Se uso la variante 1 o la variante 2 ottengo 0xFFFF5021. È come se venisse scritta solo metà del word.

Chi capisce cosa succede è bravo! ;-)

Boiler
Avatar utente
Foto Utenteboiler
14,4k 4 7 13
G.Master EY
G.Master EY
 
Messaggi: 2443
Iscritto il: 9 nov 2011, 12:27

0
voti

[17] Re: Curioso allineamento della memoria in C

Messaggioda Foto Utenteluxinterior » 18 dic 2018, 11:45

Sempre andando a caso con le ipotesi se il micro fosse un ST

The Parallelism size is configured through the PSIZE field in the FLASH_CR register. It
represents the number of bytes to be programmed each time a write operation occurs to the
Flash memory. PSIZE is limited by the supply voltage and by whether the external V PP
supply is used or not. It must therefore be correctly configured in the FLASH_CR register
before any programming/erasing operation.
Avatar utente
Foto Utenteluxinterior
2.199 2 4 8
Expert EY
Expert EY
 
Messaggi: 1211
Iscritto il: 6 gen 2016, 17:48

Precedente

Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti