Forum: Compiler & IDEs Befehle werden übersprungen


von Haderlump (Gast)


Lesenswert?

Hallo zusammen
Bei folgendem Programm:

1
#include <avr/io.h>
2
#include <stdint.h>
3
#include <avr/eeprom.h>
4
#define BAUD 19200
5
#include <util/setbaud.h>
6
#include <avr/interrupt.h>
7
 
8
// Berechnungen
9
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
10
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
11
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
12
 
13
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
14
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
15
#endif
16
17
int usart_init(void)
18
  {
19
    
20
    UBRR0H = UBRRH_VALUE;
21
       UBRR0L = UBRRL_VALUE;
22
      UCSR0B |= (1<<RXC0)|(1<<RXCIE0);                           // UART TX einschalten
23
      UCSR0C = (1<<UMSEL01)|(1 << UCSZ01)|(1 << UCSZ00); // Asynchron 8N1
24
    
25
    return 0 ;
26
  }
27
28
#define UART_MAXSTRLEN 10
29
  volatile uint8_t uart_str_complete = 0;     // 1 .. String komplett empfangen
30
  volatile uint8_t uart_str_count = 0;
31
  volatile char uart_string[UART_MAXSTRLEN + 1] = "";
32
33
ISR(USART_RXC_vect)
34
{
35
  unsigned char nextChar;
36
 
37
  // Daten aus dem Puffer lesen
38
  nextChar = UDR0;
39
  if( uart_str_complete == 0 ) {  // wenn uart_string gerade in Verwendung, neues Zeichen verwerfen
40
 
41
    // Daten werden erst in uart_string geschrieben, wenn nicht String-Ende/max Zeichenlänge erreicht ist/string gerade verarbeitet wird
42
    if( nextChar != '\n' &&
43
        nextChar != '\r' &&
44
        uart_str_count < UART_MAXSTRLEN ) {
45
      uart_string[uart_str_count] = nextChar;
46
      uart_str_count++;
47
    }
48
    else {
49
      uart_string[uart_str_count] = '\0';
50
      uart_str_count = 0;
51
      uart_str_complete = 1;
52
    }
53
  }
54
}
55
56
57
ISR (TIMER0_OVF_vect)
58
{
59
  TCNT0 == 256-50;
60
}
61
62
63
int main(void)
64
{
65
//Initialisierungen
66
  int16_t impulsbreite[16];
67
  int16_t min_impulsbreite[16];
68
  int16_t max_impulsbreite[16];
69
  int8_t a;
70
  for (a=0 ; a<16; a++)
71
    { 
72
      impulsbreite[a] == eeprom_read_word (a);
73
      min_impulsbreite[a] == eeprom_read_word (a + 32);
74
    max_impulsbreite[a] == eeprom_read_word (a + 64);
75
    }
76
  usart_init();
77
  TCCR0A = (1<<CS01);
78
  TIMSK0 |= (1<<TOIE0);
79
  sei();
80
  TCNT0 == 256-50;
81
while(1) 
82
{         
83
     
84
     /* "Hauptschleife*/  
85
} 
86
return 0;
87
88
}

wird die For-Schleife (kurz nach main), mit der ich 3 Arrays 
initialisieren will, im Debuger einfach übersprungen.  Die 
Optimierungseinstellung ist -0s

Gruß Haderlump


--

Bitte in Zukunft die Formatierungstags [ c ] und [ / c ] verwenden.

-rufus

: Bearbeitet durch User
von holger (Gast)


Lesenswert?

== nicht gleich =

von (prx) A. K. (prx)


Lesenswert?

holger schrieb:
> == nicht gleich =

=> Warnungen einschalten und nicht ignorieren. Sollte eigentlich zu 
lesen sein.

Ausserdem werden diese Arrays erkennbar nicht genutzt, was Konsequenzen 
haben kann.

von Kaj (Gast)


Lesenswert?

Haderlump schrieb:
> Die
> Optimierungseinstellung ist -0s
Dann stell die doch mal runter...

Haderlump schrieb:
> wird die For-Schleife (kurz nach main), mit der ich 3 Arrays
> initialisieren will, im Debuger einfach übersprungen.
Koennte daran liegen das die wegoptimiert werden. Du initialisierts die 
Arrays zwar, aber das wars dann dann ja auch, mehr passiert mit den 
arrays ja nicht, also koennen die auch wegoptimiert werden.

Schalte doch mal die Compilerflags -Wall -Wextra ein.
Ich bin mir sicher das dir der Compiler dann sowas sagt wie: "Variable 
set but not used"

Haderlump schrieb:
> TCNT0 == 256-50;
Man koennte auch einfach TCNT = 206 schreiben...

Gruesse

von (prx) A. K. (prx)


Lesenswert?

Kaj schrieb:
> Man koennte auch einfach TCNT = 206 schreiben...

Und dafür in einen dann zwingend nötigen Kommentar wieder die 50, damit 
man später noch durchblickt???

Er sollte sich eher den CTC Mode ansehen.

: Bearbeitet durch User
von Haderlump (Gast)


Lesenswert?

Danke ür die schnellen Antworten.
Das Programm steckt natürlich erst in den Anfängen. Die Arrays werden 
später natürlich genutzt. Offensichtlich werden sie wohl wegoptimiert.
 Zu 256-50:
Natürlich könnte man auch 206 schreiben. Aber der wert 50 hat ja auch 
seine bedeutung, und da muss ich dann noch mit rumexperimentieren. und 
da ist es für mich übersichtlicher, als wenn ich das jedesmal wieder neu 
ausrechnen muß.

von Justus S. (jussa)


Lesenswert?

Haderlump schrieb:
> Die Arrays werden
> später natürlich genutzt. Offensichtlich werden sie wohl wegoptimiert.

immer noch nicht den Unterschied zwischen = und == verstanden?

von Karl H. (kbuchegg)


Lesenswert?

Haderlump schrieb:
> Danke ür die schnellen Antworten.
> Das Programm steckt natürlich erst in den Anfängen. Die Arrays werden
> später natürlich genutzt. Offensichtlich werden sie wohl wegoptimiert.
>  Zu 256-50:
> Natürlich könnte man auch 206 schreiben. Aber der wert 50 hat ja auch
> seine bedeutung, und da muss ich dann noch mit rumexperimentieren. und
> da ist es für mich übersichtlicher, als wenn ich das jedesmal wieder neu
> ausrechnen muß.


SChon klar. Du kannst aber auch ganz einfach
1
  TCNT0 = -50;
schreiben und kriegst genau dasselbe Ergebnis.

Trotzdem sollte man den CTC Modus nicht aus den Augen verlieren, wenn 
der µC den auf diesem Timer kann.

von Udo S. (urschmitt)


Lesenswert?

Haderlump schrieb:
> Offensichtlich werden sie wohl wegoptimiert.

Weshalb man fürs debuggen günstigerweise die Optimierung abschaltet.

von Thomas H. (Firma: CIA) (apostel13)


Lesenswert?

Hat der GCC mittlerweile eigentlich einen Deppenmodus der die 
wilkürliche Verwendung von == und = automatisch korrigiert und aus einem 
Vergleich eine Zweisung und Vice versa macht??

von Dussel (Gast)


Lesenswert?

Thomas Holmes schrieb:
> Hat der GCC mittlerweile eigentlich einen Deppenmodus der die
> wilkürliche Verwendung von == und = automatisch korrigiert und aus einem
> Vergleich eine Zweisung und Vice versa macht??
Schlag das mal den Entwicklern von Malbolge vor :D
Die Warnung ist absolut ausreichend.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Thomas Holmes schrieb:
> Hat der GCC mittlerweile eigentlich einen Deppenmodus der die
> wilkürliche Verwendung von == und = automatisch korrigiert und aus einem
> Vergleich eine Zweisung und Vice versa macht??

Nein, und wird er auch nicht bekommen.

Das Programm hat immer noch der Programmierer zu schreiben.  Davon ab 
ist ein = ein = und kein ==, und ein == ist ein == und kein =.

Du würdest ja auch nicht wollen, dass ein Compiler +1 durch -1 ersetzt, 
weil er ganz schlau ist und denkt: Das '+' ist überflüssig und daher 
hast du doch ganz bestimmt ein '-' gemeint?

Drittens werden die Stellen vom Compiler gewarnt, und wer Warnungen 
abschaltet oder ignoriert ist selber Schuld.

Viertens kann die Verwendung gewollt sein wie im Beispiel
1
    (void)
2
      (1 == (a = fun ())
3
       && (var1 = foo ())
4
       && (var2 = bar ())
5
       && (var3 = buh ()));
das genau so gemeint ist wie es da steht und nicht irgendwie vom 
Compiler gepimpt oder hochgeskillt.  Dass solche Idiome eher selten 
verwendet werden und viele länglichen Code wie den folgenden vorziehen 
ist Entscheidung des Anwenders und nicht Belang eines Compilers!
1
    a = fun();
2
    if (a == 1)
3
    {
4
        var1 = foo();
5
        if (var1)
6
        {
7
            var2 = bar();
8
            if (var2)
9
                var3 = buh();
10
        }
11
    }

Fünftens schließlich:  Wenn diese Funktionalität so essenziell wäre und 
so oft nachgefragt würde, gäbe es einen Markt dafür und z.B. 
Eclipse-Plugins, die den Code entsprechend verschlimmbesserten.

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.