Forum: Compiler & IDEs nur "schrott" nach Variablendeklaration


von Timo (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe das Projekt von Simon 
Beitrag "Datenrekorder auf SD-Karte mit mega88" nachgebaut und auf eigene 
Bedürfnisse angepasst. (nur die Main-Routine)

Jetzt gibt es aber in meiner Main-Routine das Problem, dass ich eine 
Variable "sichern" (u08) brauche um einen Zustand zu "merken". 
Deklarieren ok, aber sobald ich diese beschreibe (Wert zuweisen oder 
incrementieren) läuft mein Programm amok, d.h. die gespeicherten Daten 
auf SD haben nichts mehr mit der Realität zu tun!
Ich weiß, das sind dürftige Infos, aber kann man dazu eine 
Fehlerdiagnose geben? Da ich erst seit kurzem mich mit C beschäftige 
gibt es sicher was, dass ich einfach nur übersehen habe.

Der entsprechende Auszug
1
            //detektiere Schwelle
2
            u08 sichern=0;
3
            tx_rdp_Copy=tx_rdp;  // Pointer übernehmen
4
            
5
            for (i=0; i<channels; i++) 
6
            {
7
              if (((tx_buf[tx_rdp_Copy]+256*tx_buf[tx_rdp_Copy+1])>SCHWELLWERT_MAX))//||((tx_buf[tx_rdp_Copy]+256*tx_buf[tx_rdp_Copy+1])<480))
8
              {
9
                sichern++;
10
              }
11
              tx_rdp_Copy+=2;
12
              tx_rdp_Copy &= TX_BUF_SIZE-1;
13
              
14
            }
Danke vorab!

Timo

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Schau dir im C-Lehrbuch deiner Wahl das Kapitel an, in dem die 
Sichtbarkeit/Gültigkeit von Variablen besprochen wird. Also wo es um 
globale und lokale Variablen (static oder auto) geht.

Die Position der Definition (u08 sichern=0;) deutet (#) auf eine auto 
lokale Variable hin. Die Verwendung (sichern++;) und deine Beschreibung 
(um einen Zustand zu "merken) deuten darauf hin, dass du einen 
dauerhaften Speicherplatz willst. Beides beisst sich derzeit.

(#) Tipp: bei Codeausschnitten mindestens die komplette Funktion posten

von Timo (Gast)


Lesenswert?

Hallo Stefan,

Den Status brauche ich nur in der unmittelbar nachfolgenden if-Abfrage, 
daher ist eine kurze Lebensdauer (nur innerhalb des Main-Blocks) sicher 
angebracht.
Mir scheint es eher so, als ob irgend etwas in Speicher oder Zeiger 
darauf hin verbogen werden - aber das ist mangels ausreichender Kenntnis 
nur eine Deutung....

Timo

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> ...tx_buf[tx_rdp_Copy]+256*tx_buf[tx_rdp_Copy+1]...
ist tx_buf[] ein char-Array?
Falls ja: dann solltest du das auf short casten. Ich bin nicht sicher, 
ob der Compiler das macht (sollte er zwar mit der Konstante 256, aber 
wer weiß)?

> ...tx_buf[tx_rdp_Copy] + 256*(unsigned short)tx_buf[tx_rdp_Copy+1]...
Den Rest macht dann der Compiler...

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Du könntest mal den aktuellen Sourcecode posten, bei dem der Fehler 
auftritt. Der Codeauszug oben deckt sich nicht mit deinem ZIP-Archiv.

von Timo (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

der Code sollte eigentlich identisch sein - sollte....

Im Anhang wirklich die aktuelle Version.

Nach wie vor gilt der folgende Codeschnipsel als problematisch. Sobald 
die beiden Zeilen auskommentiert sind, läuft das Programm wie vom 
Ursprungsautor gewollt.
1
u08 sichern=0;
2
sichern++;
1
// ********************************************************************************************************            
2
            //detektiere Schwelle
3
            u08 sichern=0;
4
            
5
            tx_rdp_Copy=tx_rdp;  // Pointer übernehmen
6
            
7
            for (i=0; i<channels; i++) 
8
            {
9
              if (((tx_buf[tx_rdp_Copy]+256*tx_buf[tx_rdp_Copy+1])>SCHWELLWERT_MAX))//||((tx_buf[tx_rdp_Copy]+256*tx_buf[tx_rdp_Copy+1])<480))
10
              {
11
                sichern++;
12
              }
13
              tx_rdp_Copy+=2;
14
              tx_rdp_Copy &= TX_BUF_SIZE-1;
15
              
16
            }
17
// *******************************************************************************************************
18
19
(der Rest vom Code im Anhang)

Danke!


Timo

von Timo (Gast)


Lesenswert?

Nicht verwirren lassen. Ich meinte natürlich, diese beiden Zeilen 
auskommentieren

u08 sichern=0;
sichern++;

Danach kommt in meiner Antwort dann der Codeauszug.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

@  Timo
Etwas OT, aber statt deiner selbstgebauten Funktion
   write_number_u32();
könntest du doch
   ltoa();       // long to ascii  verwenden



>Sobald die beiden Zeilen auskommentiert sind
> u08 sichern=0;
Welchen Compiler hast du? Kann der inline Variablendeklarationen 
handhaben? Das ist kein Standard C-Syntax.

von Timo (Gast)


Lesenswert?

@Lothar: ich habe das Programm größtenteils von Simon 
übernommen(Beitrag "Datenrekorder auf SD-Karte mit mega88") und bin noch 
nicht in der Lage, den Code zu optimieren. Ich kämpfe noch (oder schon) 
mit den Erweiterungen. Trotzdem danke für den Hinweis.

Ich nutze das AVR Studio 4.13 SP2 Build 571 mit WinAVR 20080610

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Timo wrote:
> Nicht verwirren lassen. Ich meinte natürlich, diese beiden Zeilen
> auskommentieren
>
> u08 sichern=0;
> sichern++;
>
> Danach kommt in meiner Antwort dann der Codeauszug.

Kannst du vom Compiler die LSS Dateien mit/ohne obige Zeilen erzeugen 
lassen und posten?

LSS Dateien sind gemischter ASM und C Quellcode. Die Einstellung zur 
Erzeugung der LSS Dateien findest du bei den Projektoptionen von AVR 
Studio.

von Timo (Gast)


Angehängte Dateien:

Lesenswert?

Hier die LSS-Files. Ich bin mal gespannt, was Du da rauslesen kannst

von holger (Gast)


Lesenswert?

Data:        960 bytes (93.8% Full)

Wenn dir da mal nicht einfach nur der Stack überläuft.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Timo wrote:
> Hier die LSS-Files. Ich bin mal gespannt, was Du da rauslesen kannst

Leider nichts, weil die beiden Dateien nahezu identisch sind.

Unterschiede befinden sich lediglich im Bereich der Debugsymbole aber 
nicht im Bereich des Quellcodes.

Für mich sieht es so aus, als ob beide Male eine Source übersetzt wurde, 
die die untenstehenden Zeilen überhaupt nicht enthält!

Zeilen 524-566 aus main.c:
1
          else if (channels && sample == channels) {
2
            adcflag = 0;
3
            sample = 0;
4
            if (linebrkneeded) {
5
              linebrkneeded = 0;
6
              mmc_write_byte(0x0d);
7
              mmc_write_byte(0x0a);
8
            }
9
10
// ********************************************************************************************************            
11
            //detektiere Schwelle
12
            u08 sichern=0;
13
            
14
            tx_rdp_Copy=tx_rdp;  // Pointer übernehmen
15
            
16
            for (i=0; i<channels; i++) 
17
            {
18
              if (((tx_buf[tx_rdp_Copy]+256*tx_buf[tx_rdp_Copy+1])>SCHWELLWERT_MAX))//||((tx_buf[tx_rdp_Copy]+256*tx_buf[tx_rdp_Copy+1])<480))
19
              {
20
                sichern++;
21
              }
22
              tx_rdp_Copy+=2;
23
              tx_rdp_Copy &= TX_BUF_SIZE-1;
24
              
25
            }
26
// ********************************************************************************************************
27
28
            /*if (time==1)
29
            {
30
              for (i=0; i<channels; i++) 
31
              {
32
                adc_offset[i*2]=tx_buf[tx_rdp_Copy];
33
                adc_offset[i*2+1]=tx_buf[tx_rdp_Copy+1];
34
                tx_rdp_Copy+=2;
35
                tx_rdp_Copy &= TX_BUF_SIZE-1;
36
              }
37
            }*/
38
39
            // Schreibe Datenblock
40
            //if (sichern>0)
41
            //{
42
              PORT_LED &= ~PIN_LED;  // kurzer Peak zum "REC"-rausmessen
43
              PORT_LED &= ~PIN_LED;

Zeilen 3868-3900 aus ...nicht auskommentiert....lss
1
          else if (channels && sample == channels) {
2
    157c:  80 91 56 01   lds  r24, 0x0156
3
    1580:  90 91 61 01   lds  r25, 0x0161
4
    1584:  88 23         and  r24, r24
5
    1586:  09 f4         brne  .+2        ; 0x158a <main+0x438>
6
    1588:  45 c0         rjmp  .+138      ; 0x1614 <main+0x4c2>
7
    158a:  98 17         cp  r25, r24
8
    158c:  09 f0         breq  .+2        ; 0x1590 <main+0x43e>
9
    158e:  5d c0         rjmp  .+186      ; 0x164a <main+0x4f8>
10
            adcflag = 0;
11
    1590:  10 92 b1 04   sts  0x04B1, r1
12
            sample = 0;
13
    1594:  10 92 61 01   sts  0x0161, r1
14
            if (linebrkneeded) {
15
    1598:  22 23         and  r18, r18
16
    159a:  21 f0         breq  .+8        ; 0x15a4 <main+0x452>
17
              linebrkneeded = 0;
18
              mmc_write_byte(0x0d);
19
    159c:  8d e0         ldi  r24, 0x0D  ; 13
20
    159e:  7c d2         rcall  .+1272     ; 0x1a98 <mmc_write_byte>
21
              mmc_write_byte(0x0a);
22
    15a0:  8a e0         ldi  r24, 0x0A  ; 10
23
    15a2:  7a d2         rcall  .+1268     ; 0x1a98 <mmc_write_byte>
24
            }*/
25
26
            // Schreibe Datenblock
27
            //if (sichern>0)
28
            //{
29
              PORT_LED &= ~PIN_LED;  // kurzer Peak zum "REC"-rausmessen
30
    15a4:  28 98         cbi  0x05, 0  ; 5
31
              PORT_LED &= ~PIN_LED;
32
    15a6:  28 98         cbi  0x05, 0  ; 5
33
    15a8:  2e c0         rjmp  .+92       ; 0x1606 <main+0x4b4>

In Zeile 3892 (vor // Schreibe Datenblock) fehlt der komplette 
Anweisungsblock zwischen den beiden // *** oben.

Hast du zum Übersetzen die Optimierung eingeschaltet? tx_rdp_Copy und 
sichern wird ja nur in diesem Block benutzt und der Compiler kann die, 
da hier funktionslos, ersatzlos streichen!

von Timo (Gast)


Angehängte Dateien:

Lesenswert?

ich habe nochmals die Sequenz mit "sichern" eingeschalten und 
compiliert. In der LSS-Datei kommt dann der Ausdruck vor.
Der Code jetzt heißt
1
// ********************************************************************************************************            
2
            //detektiere Schwelle
3
            u08 sichern=0;
4
            
5
            tx_rdp_Copy=tx_rdp;  // Pointer übernehmen
6
            
7
            for (i=0; i<channels; i++) 
8
            {
9
              if (((tx_buf[tx_rdp_Copy]+256*tx_buf[tx_rdp_Copy+1])>SCHWELLWERT_MAX))//||((tx_buf[tx_rdp_Copy]+256*tx_buf[tx_rdp_Copy+1])<480))
10
              {
11
                sichern++;
12
              }
13
              tx_rdp_Copy+=2;
14
              tx_rdp_Copy &= TX_BUF_SIZE-1;
15
              
16
            }
17
// ********************************************************************************************************
18
19
            /*if (time==1)
20
            {
21
              for (i=0; i<channels; i++) 
22
              {
23
                adc_offset[i*2]=tx_buf[tx_rdp_Copy];
24
                adc_offset[i*2+1]=tx_buf[tx_rdp_Copy+1];
25
                tx_rdp_Copy+=2;
26
                tx_rdp_Copy &= TX_BUF_SIZE-1;
27
              }
28
            }*/
29
30
            // Schreibe Datenblock
31
            if (sichern>0)
32
            {
33
              PORT_LED &= ~PIN_LED;  // kurzer Peak zum "REC"-rausmessen
34
              PORT_LED &= ~PIN_LED;
35
36
              while (tx_rdp != tx_wrp) {
37
                mmc_write_byte(':'); write_number_u32(time);
38
                for (i=0; i<channels; i++) {
39
                  mmc_write_byte(9);
40
                  write_number_u32(tx_buf[tx_rdp]+256*tx_buf[tx_rdp+1]);
41
                  tx_rdp+=2;
42
                  tx_rdp &= TX_BUF_SIZE-1;
43
                }
44
                
45
                
46
                mmc_write_byte(0x0d);
47
                mmc_write_byte(0x0a);
48
              }
49
            }
50
            else
51
            {
52
              // tu was anderes
53
            }

Inhaltlich nichts geändert zu vorher, außer dass "sichern" ausgewertet 
wird.
Vielleicht kann man jetzt mehr damit anfangen....

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.