nur "schrott" nach Variablendeklaration

Gast #962726
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
Angehängte Dateien:
Persönliche Seite #962753
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
Gast #962778
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
Moderator (Firma: Titel) Persönliche Seite #962865
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...
Gast #963002
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
Angehängte Dateien:
Persönliche Seite #963080
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.
Persönliche Seite #963166
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!
Gast #964949
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....
Angehängte Dateien:

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