2017-04-11 4 views
0

La fonction ci-dessous imprime le contenu d'un registre UART. Ceci est la carte du registre.comprendre uart répertorie l'indexation

uart registers

Quelqu'un pourrait-il expliquer pourquoi, la boucle va dans +=4?

Merci

#define UART0_BASE 0x21000 

void print_uart(unsigned int base) { 
int i; 
int val; 
unsigned int adr; 

    for (i=0; i< 0x18; i+=4) { 
    adr = base + i; 
    printf("Uart %s [0x%x] -> 0x%x\n",uart_reg[i>>2],adr,val); 
    } 
} 
+0

Cela semble cassé. Pour quel processeur est-ce? – unwind

+0

Les adresses d'un périphérique externe n'ont pas besoin d'être identiques des deux côtés du "fil". Vous pouvez attacher 'A0..An' de votre UART à' A2..An + 2' de votre CPU/contrôleur de mémoire avec 'A0, A1' étant fixé à la masse. Cela se traduirait par une distance de 4 adresses côté CPU alors qu'elles sont toujours adjacentes côté UART. Comme votre UART a des registres de 16 bits, chaque adresse représente déjà 2 octets. – Gerhardh

Répondre

0

plus susceptibles d'adapter l'adresse de début de chaque registre. Depuis la boucle for s'exécute à 0x18 (24) qui le rend 6 registres. On pourrait croire que les registres ne sont que de 16 bits, mais il y a souvent du rembourrage.

+0

merci, peut-être une question stupide - mais si l'adresse de base est '0x21000' et le registre est de 16 bits - comment l'incrémentation 4 arrivera-t-elle au registre suivant? –

+0

Eh bien, je suppose que chaque registre prend effectivement 32 bits de données. 16 bits de substance et 16 bits de rembourrage. Donc le + = 4 représente 4 octets. Pour passer au registre suivant, vous devez sauter par-dessus le registre actuel. Donc, la base 0x21000 est l'endroit où les données de Recieve sont, 0x21001 est l'octet réservé, 0x21002 est le remplissage, 0x21003 est le remplissage. 0x21004 est le prochain registre Je ne peux pas être sûr à 100% de cela, car je ne sais pas quel processeur vous utilisez, mais si votre code fonctionne c'est probablement le cas – user3660570

+0

Merci, je suppose que vous avez raison. J'utilise un processeur NIOS qui est en 32 bits. à votre santé –