Quale programmazione a basso livello del Raspberry Pi in C dice in realtà è:
So the BCM2708_PERI_BASE macro contains the physical adress value at which the peripheral registers start. This is the adress we will need to use in our program. The virtual address value is 0x7E000000, and it are these virtual adresses that will be found in the datasheet.
There are a lot of different peripherals available on the BCM2835 (Timers, USB, GPIO, I2C, ...), and they will be defined by an offset to this virtual adress! For example, if we are interested in the GPIO peripheral (like in the example code above), we can find in the manual at page 90 that the virtual address is 0x7E200000. This means that the offset to the physical adress will be 0x200000 which explains the GPIO_BASE.
Questo non dice
0x2000 0000 + 0x2000 0000 = 0x7E20 0000
Dice
0x7E00 0000 + 0x0020 0000 = 0x7E20 0000
Dicono solo male, perché esprime
0x00200000
come
0x200000
Qual è lo stesso numero, ma è davvero difficile da vedere perché agli umani non piace contare gli zeri non raggruppati. Sei vittima di un HEX presentato male.
Ho passato un sacco di tempo a trafficare. Ho inviato di nuovo le specifiche per essere riscritto su problemi come questo. Anche quando lavori a un livello basso è importante tenere a mente gli umani.
È per questo che vorrei davvero che tu l'avessi detto in questo modo:
0x7E00 0000 +
0x0020 0000
===========
0x7E20 0000
Perché questa roba è importante per avere ragione. In certi negozi lo spazio bianco può letteralmente salvare vite. Non renderlo più difficile di quello che deve essere.
Per quanto riguarda la macro, tieni presente come funziona la mappatura virtuale. In un contesto esiste l'offset, in un altro no. Almeno sembra che non sia così. È lo stesso con l'indicizzazione degli array. someArray[0]
esiste dove mai someArray
esiste. Quindi someArray [2] non esiste a 2. È dove mai + 2. L'indirizzo virtuale ha un dove mai indirizzo di 0x7E00 0000
.
Guarda dove hai trovato questa macro
#define BCM2708_PERI_BASE 0x20000000
#define GPIO_BASE (BCM2708_PERI_BASE + 0x200000)
Noterai che il numero 0x7E00 0000
non appare nella macro o persino in nessuno dei codici di questo articolo. Questo perché ottieni quell'offset gratis. Questi programmi stanno affrontando oltre questo offset. Proprio come quando dico someArray[2]
non devo sapere dove esiste someArray
.
Quindi mi aspetto che alla fine della giornata il GPIO_BASE
punti qui:
0x7E00 0000 +
0x2000 0000 +
0x0020 0000
===========
0x9E20 0000
E che il suo valore all'interno del programma dovrebbe essere:
0x2000 0000 +
0x0020 0000
===========
0x2020 0000
Poiché ottieni 0x7E00 0000
dalla mappatura virtuale della memoria del programma non ti serve nel programma. Questa è una delle cose belle dell'essere virtuali.