Herakles
Profifragensteller
Moin!
Heute kann ich im "Programmieren" Unterforum mit einem kleinen Exkurs in die Welt der Mikroprozessoren aufwarten. Ich hoffe, ich bin damit bei bsdforen.de dennoch richtig
Ich habe ein Problem mit AVRStudio5, bzw. mit einem AVR32UC3A0512-Chip, der auf ein dafür vorgesehenes Development-Kit gebaut ist(EVK1100). Hier mal ein Link dazu: atmel.com
In meinem Programm gibt es ein struct, das mehrere uint8_t - Variablen enthält(für meine Fehlerbeschreibung hier ist es ein Pointer namens "struct rs232_telegramm *testvar"). Dieser Pointer wird zuerst angelegt, dann Speicher alloziert und dann auf "0" gesetzt.
Dann setze ich den ersten Wert des structs auf "7"(einfach aus Testzwecken, ich könnte die Variable auch auf "0xFF" setzen...), gebe danach auf meine debug-Schnittstelle(USART0) irgendeine Zahl aus(in diesem Fall 0x66, damit ich sehe, dass Daten grundsätzlich fließen und alles funktioniert), um anschließend den Wert meiner soeben gesetzten Variablen auszugeben.
Hier zunächst mal der Code:
Beim zweiten Ausgeben der Daten auf USART0 wird die Zahl "7" ausgegeben. Da das aber nun mit dem Zugriff auf die erste Variable im struct geschieht und nicht mit dem struct selbst, ändere ich den Code ein wenig ab und zwar ersetze ich die Zeile mit "zahl = (int)testvar->lnr;" durch die Zeile darunter.
Kompiliere ich das nun und führe es aus, dann bekomme ich als output vom zweiten USART0-Aufruf den Inhalt "0", also so, wie im memset angegeben. Ein Zugriff auf die erste Variable im struct bleibt mir verwehrt.
Ich habe das Ganze testweise auf meinem Firmenrechner in Linux nachprogrammiert und dort ist alles wie erwartet: Ein Zugriff auf die Speicheradresse des structs selbst liefert den Wert der ersten Variabel "lnr" zurück und die Adressen des structs und der ersten Variablen sind identisch.
Woran mag es liegen, dass der AVR(oder AVRStudio5 oder was auch immer) den Zugriff an dieser Stelle "verdreht"?
Ich bin nach 4 Stunden suchen ratlos und hoffe auf einen hilfreichen Tipp!
Beste Grüße
Herakles
Heute kann ich im "Programmieren" Unterforum mit einem kleinen Exkurs in die Welt der Mikroprozessoren aufwarten. Ich hoffe, ich bin damit bei bsdforen.de dennoch richtig
Ich habe ein Problem mit AVRStudio5, bzw. mit einem AVR32UC3A0512-Chip, der auf ein dafür vorgesehenes Development-Kit gebaut ist(EVK1100). Hier mal ein Link dazu: atmel.com
In meinem Programm gibt es ein struct, das mehrere uint8_t - Variablen enthält(für meine Fehlerbeschreibung hier ist es ein Pointer namens "struct rs232_telegramm *testvar"). Dieser Pointer wird zuerst angelegt, dann Speicher alloziert und dann auf "0" gesetzt.
Dann setze ich den ersten Wert des structs auf "7"(einfach aus Testzwecken, ich könnte die Variable auch auf "0xFF" setzen...), gebe danach auf meine debug-Schnittstelle(USART0) irgendeine Zahl aus(in diesem Fall 0x66, damit ich sehe, dass Daten grundsätzlich fließen und alles funktioniert), um anschließend den Wert meiner soeben gesetzten Variablen auszugeben.
Hier zunächst mal der Code:
Code:
struct rs232_telegramm {
uint8_t lnr;
uint8_t ack;
uint8_t req;
uint8_t typ;
uint8_t idx;
uint8_t pkt;
uint16_t len;
uint8_t daten[512];
uint16_t crc;
} __attribute__((packed));
int main(void) {
struct rs232_telegramm *testvar;
int zahl;
testvar = (struct rs232_telegramm*)malloc(sizeof(struct rs232_telegramm));
memset( testvar, 0, sizeof(struct rs232_telegramm));
testvar->lnr = 7;
usart_putchar( USART0, 0x66 );
zahl = (int)testvar->lnr;
/*zahl = *(int*)testvar; <---------------------------> mit dieser zeile funktioniert es nicht!!!! */
usart_putchar( USART0, zahl );
}
Beim zweiten Ausgeben der Daten auf USART0 wird die Zahl "7" ausgegeben. Da das aber nun mit dem Zugriff auf die erste Variable im struct geschieht und nicht mit dem struct selbst, ändere ich den Code ein wenig ab und zwar ersetze ich die Zeile mit "zahl = (int)testvar->lnr;" durch die Zeile darunter.
Kompiliere ich das nun und führe es aus, dann bekomme ich als output vom zweiten USART0-Aufruf den Inhalt "0", also so, wie im memset angegeben. Ein Zugriff auf die erste Variable im struct bleibt mir verwehrt.
Ich habe das Ganze testweise auf meinem Firmenrechner in Linux nachprogrammiert und dort ist alles wie erwartet: Ein Zugriff auf die Speicheradresse des structs selbst liefert den Wert der ersten Variabel "lnr" zurück und die Adressen des structs und der ersten Variablen sind identisch.
Woran mag es liegen, dass der AVR(oder AVRStudio5 oder was auch immer) den Zugriff an dieser Stelle "verdreht"?
Ich bin nach 4 Stunden suchen ratlos und hoffe auf einen hilfreichen Tipp!
Beste Grüße
Herakles