Zeiger sind Zeiger. Das sind sie. Sie werden überhaupt nicht anders behandelt (wie könnten Sie sie anders behandeln?)
Die Hauptunterschiede zwischen X86 und AVR sind:
- AVR ist 8 Bit, X86 ist 32 Bit (oder 64 Bit für x86_64), daher haben Zeiger eine andere Größe.
- Der AVR ist eine modifizierte Harvard-Architektur, daher gibt es mehr als einen Adressraum. Sie müssen also sicherstellen, dass Sie auf den richtigen Adressraum verweisen.
Außerdem macht Ihr Code keinen Sinn:
char *dir = (void *)0x17;
Eine Leere * einem Zeichen * zuweisen?
error: invalid conversion from ‘void*’ to ‘char*’
Ich bin momentan nicht für die Kompilierung des ATTiny13 eingerichtet, daher gelten diese Zahlen alle für den ATMega328p:
Der Zugriff auf DDRB und PORTB führt zu dieser Assembly:
12c: 80 e1 ldi r24, 0x10 ; 16
12e: 84 b9 out 0x04, r24 ; 4
130: 85 b9 out 0x05, r24 ; 5
Der Zugriff auf einen Zeiger auf einen Speicherort führt zu dieser Assembly:
12c: 80 e1 ldi r24, 0x10 ; 16
12e: 80 93 17 00 sts 0x0017, r24
132: 80 93 18 00 sts 0x0018, r24
Wie Sie sehen können, sind DDRB und PORTB keine normalen Variablen. DDRB ist definiert als:
#define DDRB _SFR_IO8(0x04)
und PORTB als:
#define PORTB _SFR_IO8(0x05)
_SFR_IO8 () ist ein Makro:
#define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + __SFR_OFFSET)
und _MMIO_BYTE ist:
#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
__SFR_OFFSET kann je nach Chip entweder 0 oder 0x20 sein (normalerweise 0x20).
Das muss also bedeuten, dass die Adressen von DDRB und PORTB größer als 0x20 sein müssen.
Mit Blick auf den 328P-Chip ist DDRB 0x04 und PORTB 0x05. Zugriff als 0x24 und 0x25 mit den richtigen Datentypen also:
volatile uint8_t *dir = (volatile uint8_t *)0x24;
volatile uint8_t *port = (volatile uint8_t *)0x25;
*dir = 0x10;
*port = 0x10;
Ergebnisse in dieser Baugruppe:
12c: 80 e1 ldi r24, 0x10 ; 16
12e: 84 b9 out 0x04, r24 ; 4
130: 85 b9 out 0x05, r24 ; 5
Ähnlich aussehend? Der Compiler hat den 0x20-Offset erkannt, erkannt, dass es sich um SFRs handelt, und in den richtigen out
Anweisungen ohne den 0x20-Offset kompiliert .
Der Zugriff auf Ihre Portadressen + 0x20 funktioniert möglicherweise für den ATTiny13.
Wenn man sich nur den ATTiny25 ansieht, DDRB = 0x10
ergibt sich Folgendes :
out 0x17, r24
und der Zugriff auf einen Zeiger an der Adresse 0x37 führt zu:
out 0x17, r24
Das sieht also so aus, als wäre es wahrscheinlich (fügen Sie Ihrer Zeigeradresse 0x20 hinzu).