Frage zu Pointern - AVR vs x86_64

Gast #1783032
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.)
#1783046
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?
Gast #1783076
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!
Gast #1783367
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.
Gast #1783387
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.
Gast #1783416
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.
Gast #1784190
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 
;)
Gast #1784354
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?
Gast #1784484
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. ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren