Forum: Compiler & IDEs Frage zu Pointern - AVR vs x86_64


von CC (Gast)


Lesenswert?

Hallo!

Ich weiß nicht, ob dieses Forum das Richtige ist, aber ich hoffe mal, 
ansonsten bitte verschieben.

Ich habe ein Projekt auf einem Atmega644p, das in mehrere Dateien 
aufgeteilt ist.

xbee.h:
1
//...
2
char *xbee_get_raw_packet(uint16_t *len);
3
//...

xbee.c:
1
volatile char xb_data[120];
2
volatile uint16_t  xb_len = 0; //wird zwischendurch gesetzt
3
4
//...
5
6
char *xbee_get_raw_packet(uint16_t *len)
7
{
8
  *len = xb_len;
9
  printf("--*len=%u ; xb_len=%u--\r\n", *len, xb_len);
10
  printf("len = %p\r\n", len);
11
  return (char *)xb_data;
12
}
13
14
//...
Ausgabe:
1
--*len=2 ; xb_len=2--
2
len = 0x10e4

main.c:
1
//...
2
main()
3
{
4
   //...
5
   while(1)
6
   {
7
       //...
8
       if(...)
9
       {
10
           uint16_t len = 3;
11
           printf("&len = %p\r\n", &len);
12
           char *data = xbee_get_raw_packet(&len);
13
14
           printf("type = %02x, len = %u\r\n", data[0], len);
15
16
           uint8_t i;
17
           for(i = 0; i < len; i++)
18
               printf("%02X ", data[i]);
19
           puts("\r\n");
20
       }
21
       //...
22
   }
23
}

Ausgabe:
1
...
2
 &len = 0x10e4
3
type = 8a, len = 3
4
...

Ja, ich weiß, printf() ist "böse" auf einem uC, aber es vereinfacht sehr 
vieles ungemein, kann u.U. später noch rausoptimiert werden.

Nun aber zu der Frage:
In einer ISR wird xb_len auf einen Wert gesetzt.

Rufe ich aus der main.c xbee_get_raw_packet(&len); auf, wird len NICHT 
beschrieben, es behält einfach den Wert von vorher.
Ich habe auf meinem Laptop (x86_64) die Funktionen "nachgebaut", da 
funktioniert alles.

Sieht jemand auf Anhieb einen Fehler?

Ich nutze avr-eclipse, daher kein Makefile.
1
$ avr-gcc --version
2
avr-gcc (GCC) 4.3.4
1
$ gcc --version
2
gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3


Vielen Dank für die Ratschläge, ich vermute, dass es etwas sehr banales 
ist, aber ich schon zu lang drauf geschaut habe :)

(Das gleiche Verhalten tritt auf, auch wenn xbee_get_raw_packet() einen 
uint8_t * erwartet.)

von Karl H. (kbuchegg)


Lesenswert?

CC schrieb:


> Sieht jemand auf Anhieb einen Fehler?

No.
Gut, da len ein uint16_t ist, müsst man atomaren Zugriff garantieren, 
aber das dürfte jetzt erst mal nicht der Fehler sein.

probier mal
1
//...
2
main()
3
{
4
   //...
5
   while(1)
6
   {
7
       //...
8
       if(...)
9
       {
10
           uint16_t len = 3;
11
           extern volatile uint16_t  xb_len;
12
13
           printf("&len = %p\r\n", &len);
14
           printf("xb_len vor Aufruf = %u\r\n, xb_len);
15
16
           char *data = xbee_get_raw_packet(&len);
17
18
           printf("type = %02x, len = %u\r\n", data[0], len);
19
20
           uint8_t i;
21
           for(i = 0; i < len; i++)
22
               printf("%02X ", data[i]);
23
           puts("\r\n");

Wie sieht dann die Asusgabe aus?

von CC (Gast)


Lesenswert?

Danke für die Antwort!
xb_len kann ich lesen, das funktioniert wunderbar. Aber ich habe gerade 
noch einen merkwürdigen anderen Fehler, bei dem mir irgendein Datenmüll 
angezeigt wird, den ich nicht verstehe :(
Also im Terminal kommen seltsame Steuerzeichen o.ä. an.
Mist! jetzt, wo es spannend wird, muss ich leider los :( Ich werde heute 
Abend berichten, was ich rausgefunden habe.
Viele Grüße!

von (prx) A. K. (prx)


Lesenswert?

Wie gross ist denn dein Dataspace?

von CC (Gast)


Lesenswert?

Dataspace = SRAM?
Wenn ja, dann 4 KByte laut Datenblatt. Ich bin zwar nicht gerade sparsam 
damit umgegangen, aber voll dürfte er dennoch nicht sein. Rekursionen 
o.ä. habe ich auch nicht drin, auch keine tiefen Unterprogrammaufrufe...

Leider komme ich gerade an den µC nicht dran, wollte nicht zurück in die 
Uni.

von (prx) A. K. (prx)


Lesenswert?

CC schrieb:

> Wenn ja, dann 4 KByte laut Datenblatt.

Datenblätter lesen kann ich auch. Wieviel davon ist verwendet?

von CC (Gast)


Lesenswert?

Hm, doofe Frage - aber wie krieg ich das raus, außer alle Variablen 
zusammenzuzählen? :)
avr-size datei.hex sagt mir bei text und bss "0".
Ich habe ein Array, das vorher 120 Bytes groß war Testweise auf 30 
verkleinert und eins von 48 auf 15 - die Ergebnisse waren die selben.

von CC (Gast)


Lesenswert?

AVR Memory Usage:
-----------------
Program:   12712 bytes (.text + .data + .bootloader)
Data:       1006 bytes
 (.data + .bss + .noinit)

(habe avr-mem.sh gefunden)

von (prx) A. K. (prx)


Lesenswert?

Ok, wenn du kein malloc verwendest, dann ist RAM kein Thema.

von CC (Gast)


Lesenswert?

Das nutze ich nicht. Kann mir das Verhalten auch nicht wirklich 
erklären...
Am Controller dürfte es auch nicht liegen, avrdude testet die Daten ja 
noch einmal.
Auch ein Versuch, den Block in der Abfrage mit cli() und sei() 
einzuschließen brachte nichts.

von g457 (Gast)


Lesenswert?

Schau Dir doch mal den zugehörigen Assemblercode an was der da alles 
anstellt.

von CC (Gast)


Lesenswert?

Puh, ich hab befürchtet, dass der Tag kommen wird, an dem man sich damit 
beschäftigen muss... Meine Assembler-Kenntnisse gehen leider gegen 0 :(

Ich habe jetzt versucht, es ohne Optimierungen zu übersetzen (-O0) und 
da scheint es zu gehen!?

Wo kann da in meinem Code der Fehler sein? Mir wird das langsam zu hoch 
;)

von CC (Gast)


Lesenswert?

(Vergessen: vorher war es -Os)

von CC (Gast)


Lesenswert?

So, nun geht es.
In einer ISR, in der ein Zeichen vom XBEE-Modul eingelesen wird, hatte 
ich probehalber noch das Zeichen ausgegeben. Das habe ich gelöscht, nun 
geht es.
Allerdings meine ich, dass ich das dort erst hinzugefügt hatte, nachdem 
die Übergabe des Parameters Probleme bereitet hat.
Kann das dann eventuell doch an dem Compiler liegen?

von CC (Gast)


Lesenswert?

Oh, verdammt!
Asche auf mein Haupt!
1
char str[3];
2
sprintf("%02X ", c);

KANN auch gar nicht funktionieren. Ich bedanke mich für eure Hilfe und 
entschuldige mich, euch die Zeit geraubt zu haben! :)

von Klaus (Gast)


Lesenswert?

CC schrieb:
> Kann das dann eventuell doch an dem Compiler liegen?

CC schrieb:
> Oh, verdammt!
> Asche auf mein Haupt!

Womit sich mein Lieblingsgesetz bezüglich Compilierfehlern mal wieder 
bestätigt hat ;-)

Mach dir nix draus, mir hat das stellen von Fragen hier auch schon 
manchmal geholfen, die Tomaten auf den eigenen Augen zu beseitigen. ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.