Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Ricerca personalizzata

Istruzione CALL avr

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[1] Istruzione CALL avr

Messaggioda Foto Utentepeppe1992 » 10 feb 2018, 16:51

Salve a tutti, mi sto approcciando allo studio del microcontrollore atmega8535 e ho qualche dubbio sul funzionamento di stack, stack pointer e program counter.

Ho capito che lo stack ci serve a memorizzare temporaneamente l'indirizzo dell'istruzione da eseguire subito dopo il ritorno della chiamata e questa parte di memoria si trova nell'SRAM, quindi è a 16 bit.

Per quanto riguarda lo stack pointer ho capito che è il puntatore all'ultimo elemento inserito nello stack e quindi contiene il suo indirizzo di memoria ed anche questo è a 16 bit.

Il program counter invece può essere a 16 o 22 bit a seconda del dispositivo in questione, e contiene in sequenza gli indirizzi di memoria delle istruzioni da eseguire.

Spero di aver capito bene fino a questo punto.

Tornando all'istruzione CALL nella dicitura "Stack" c'è scritto:
STACK <-- PC+2
SP <- SP-2 (16bit)

e

STACK <-- PC+2
SP <- SP-3 (22bit)

qui sorgono i miei dubbi. La mia interpretazione di questo è (prendendo il caso a 22bit):

Memorizza nello Stack l'indirizzo del PC+2, dove 2 in questo caso indica 2 words quindi 32bit (in modo da memorizzare nello stack l'istruzione successiva, dato che l'op-code è di 32 bit);

Per quanto riguarda SP <-- SP-3 non capisco dove va a puntare facendo "-3", ma so che dovrebbe puntare all'indirizzo dell'ultimo elemento inserito nello stack.



Grazie a tutti in anticipo
Avatar utente
Foto Utentepeppe1992
35 4
 
Messaggi: 33
Iscritto il: 17 mag 2011, 21:54

2
voti

[2] Re: Istruzione CALL avr

Messaggioda Foto UtenteTardoFreak » 10 feb 2018, 17:03

peppe1992 ha scritto:... La mia interpretazione di questo è (prendendo il caso a 22bit):

Memorizza nello Stack l'indirizzo del PC+2, dove 2 in questo caso indica 2 words...

No, 2 indica proprio 2. Se il contenuto del PC vale ad esempio 0x100 PC+2 vale 0x102.
Questo perché deve indicare l'indirizzo di ritorno, cioè il punto da dove riprendere l'esecuzione.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,0k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 15924
Iscritto il: 16 dic 2009, 10:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[3] Re: Istruzione CALL avr

Messaggioda Foto Utentepeppe1992 » 10 feb 2018, 17:30

E perché deve riprendere l'esecuzione due indirizzi dopo e non all'indirizzo immediatamente successivo, e quindi 0x101?
Per quanto riguarda invece lo stack pointer perché si decrementa di 3? Non riesco a farmi in nessun modo uno schemino carta e penna per capire cosa succede
Avatar utente
Foto Utentepeppe1992
35 4
 
Messaggi: 33
Iscritto il: 17 mag 2011, 21:54

3
voti

[4] Re: Istruzione CALL avr

Messaggioda Foto Utentedadduni » 10 feb 2018, 18:07

Il micro è a 8bit quindi per scrivere un indirizzo di 16 bit occupa due celle di memoria, per scrivere un indirizzo a 22 bit ne usa 3( sempre da 8).
Lo stack pointer punta al primo indirizzo libero dello stack quindi da "stack(0)" ossia la zeresima posizione dello stack quando è tutto vuoto e se ci si scrive sopra un indirizzo a 16 bit riempie stack(0) e stack(1) e lo SP si trova a puntare su stack(3) che è la prima posizione libera su cui eventualmente può scrivere.
Quando fai RETURN ed esci dalla call devi tornare al punto di partenza quindi leggi gli ultimi indirizzi che hai scritto nello stack (in questo caso leggi 2 indirizzi), riscostruisci dove stava il PC prima della call e porti indietro lo stack pointer.
Davide
Avatar utente
Foto Utentedadduni
918 1 6 10
Expert EY
Expert EY
 
Messaggi: 662
Iscritto il: 23 mag 2014, 15:26

0
voti

[5] Re: Istruzione CALL avr

Messaggioda Foto Utentepeppe1992 » 10 feb 2018, 21:15

Grazie mille per la risposta, credo di aver capito adesso, domani lo rivedo con calma e in caso scrivo nuovamente. Vorrei capire un'altra cosa. A livello hardware tutte le varie memorie SRAM, EEPROM, MEMORIA FLASH, fanno parte della stessa memoria e sono gestite diversamente oppure sono proprio memorie separate con funzionamento differente dentro lo stesso chip? Perché dal datasheet dell'atmega8535 non sono riuscito a comprendere bene questo dettaglio. A volte rappresenta varie aree di memoria in sequenza e altre volte no.
Avatar utente
Foto Utentepeppe1992
35 4
 
Messaggi: 33
Iscritto il: 17 mag 2011, 21:54

1
voti

[6] Re: Istruzione CALL avr

Messaggioda Foto Utentexyz » 10 feb 2018, 22:00

Gli AVR hanno una architettura Harvard, le memorie dati sono indipendenti dalla memoria che contiene il programma da eseguire:

https://it.wikipedia.org/wiki/Architettura_Harvard

In altre parole le memorie hanno uno spazio di indirizzi di memoria indipendenti tra di loro.
Avatar utente
Foto Utentexyz
4.434 2 4 5
Master EY
Master EY
 
Messaggi: 1145
Iscritto il: 5 dic 2009, 17:37
Località: Italy Turin

0
voti

[7] Re: Istruzione CALL avr

Messaggioda Foto Utentepeppe1992 » 11 feb 2018, 10:21

Scusatemi, ma ancora non sono riuscito a capire perché il program counter viene incrementato di 2 #-o
Avatar utente
Foto Utentepeppe1992
35 4
 
Messaggi: 33
Iscritto il: 17 mag 2011, 21:54

1
voti

[8] Re: Istruzione CALL avr

Messaggioda Foto UtenteEcoTan » 11 feb 2018, 10:26

peppe1992 ha scritto:oppure sono proprio memorie separate

Considera che la memoria flash di programma, e la Eprom non volatile, hanno un limite ai cicli di riscrittura mentre la memoria dati la possiamo "tormentare" all'infinito, non mi pare che nessun programmatore si sia mai posto il problema di sovrascrivere una variabile in loop.
Avatar utente
Foto UtenteEcoTan
4.461 4 9 13
Expert EY
Expert EY
 
Messaggi: 2416
Iscritto il: 29 gen 2014, 7:54

1
voti

[9] Re: Istruzione CALL avr

Messaggioda Foto Utentedadduni » 11 feb 2018, 13:54

Scusatemi, ma ancora non sono riuscito a capire perché il program counter viene incrementato di 2

Il program counter è largo 16bit (può essere anche diversamente ma la sostanza non cambia).
I registri di memoria sono ad 8 bit. Ti servono quindi due registri di memoria per registrare tutto il program counter, una metà da una parte e una metà dall'altra parte. Poi ci penserà un apposito pezzo del processore a mettere insieme le due metà.
Questo pezzo si chiama Address Logic e anche lui ha due registri perché, come già detto, i registri sono larghi 8 ma devono contenere un indirizo lungo 16.
A breve faccio uno schema che dovrebbe chiarire un po' la faccenda
Avatar utente
Foto Utentedadduni
918 1 6 10
Expert EY
Expert EY
 
Messaggi: 662
Iscritto il: 23 mag 2014, 15:26

1
voti

[10] Re: Istruzione CALL avr

Messaggioda Foto Utentedadduni » 11 feb 2018, 14:03



ti ho fatto una struttura del tutto generale per farti capire il concetto, il tuo processore AVR è leggermente diverso da così.
Quanti registri hai nella tabella? 2^{16}
Quanto è largo ogni registro? 8bit

quindi per puntare ad un preciso indirizzo di memoria ti servono 16 bit (ossia 4 esadecimali) e in quell indirizzo sono contenuti 8 bit(due esadecimali).

Quando scrivi sullo stack stai semplcemente mettendo in memoria un numero a 16bit (ossia un indirizzo) ma, essendo i registri piccoli, ne devi usare 2. Dal momento che lo stack pointer punta al primo indirizzo libero dello stack, quando scrivi un indirizzo occupi due celle e lui deve salire di due.
Se qualcosa non è chiaro chiedi :ok:
Avatar utente
Foto Utentedadduni
918 1 6 10
Expert EY
Expert EY
 
Messaggi: 662
Iscritto il: 23 mag 2014, 15:26

Prossimo

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti