GCC kompiliert falsch?

OP (Firma: EleLa - www.elela.de) #2245686
Lesenswert?

Hallo,

Ich habe folgende Zeilen im Code:
1
FW_ForceHW = 1;
2
: : : :
3
while (1)
4
{
5
  if (!FW_ForceHW)
6
  {
7
    if ((u32)(AppVectors[1].__ptr) != 0xFFFFFFFF)
8
    {
9
      AppVectors[1].__fun(); // main() aufrufen
10
      FW_ForceHW = 0;
11
    } else FW_ForceHW = 1;
12
  }
13
  FW_Init();            // 2
14
  if (FW_ForceHW)       // 1
15
  {
16
    FW_Seriell_Text(2, str1);
17
    if (OB->RDP != 0x5AA5)
18
      FW_Seriell_Text(2, str2);
19
    FW_ForceHW = 0;
20
  }
21
  FW_UpdateLoop();      // 3
22
}

Wiso wird zu erst der if Block bei "// 1" ausgeführt und dann erst
"// 2" und dann "// 3" ?

Der Compiler hat die Optimierungsstufe -O1.
"arm-none-eabi-gcc (Sourcery G++ Lite 2009q3-68) 4.4.1"

Dennoch darf der doch nicht einfach irgend welche Programmabläufe 
umdrehen !?!?!?

Hat dazu jemand eine Idee?

Grüße Markus.

PS: Bei Optimierungsstufe -O0 macht der das richtig.
OP (Firma: EleLa - www.elela.de) #2245714
Lesenswert?

Denn wenn ich den Code so abändere:
1
: : : :
2
while (1)
3
{
4
  if (!FW_ForceHW)
5
  {
6
    if ((u32)(AppVectors[1].__ptr) != 0xFFFFFFFF)
7
    {
8
      AppVectors[1].__fun(); // main() aufrufen
9
      FW_ForceHW = 0;
10
    } else FW_ForceHW = 1;
11
  }
12
  if (FW_ForceHW)       // 1
13
  {
14
    FW_Init();          // 2
15
    FW_Seriell_Text(2, str1);
16
    if (OB->RDP != 0x5AA5)
17
      FW_Seriell_Text(2, str2);
18
    FW_ForceHW = 0;
19
  } else FW_Init();     // 2
20
  FW_UpdateLoop();      // 3
21
}

dann geht es auch mit -O1 richtig.
OP (Firma: EleLa - www.elela.de) #2245722
Lesenswert?

Das ist die Kompiler-Zeile:
1
arm-none-eabi-gcc -c -mcpu=cortex-m3 -O0 -gdwarf-2 -mthumb -funsigned-char -fomit-frame-pointer -fno-inline -Wall -fverbose-asm  -MD -MP -MF .dep/FW_Update_USB.o.d -I . -I\WinARM\yagarto\arm-none-eabi\include -I./lib -I./lib/cm3 -I./lib/inc -I/WinARM/CodeSourcery/arm-none-eabi/include -I./s_gui/inc -I./s_inc -I./inc -I./s_db src/FW_Update_USB.c -o out/src/FW_Update_USB.o

Ein -Wall ist bereits drin, in der Datei gibt es keine einzige Warnung.
#2245724
Lesenswert?

Vermutete Compilerfehler lassen sich besser handhaben, wenn man ein 
compilierbares File hier reinstellt. Extrem minimalisiert, also wirklich 
nur das drin was nötig ist, keine 20 Files mit 100K Zeilen.

Die Schlussfolgerung von
> Ganz einfach, wenn es geht steht das im Terminal:
auf
> Wiso wird zu erst der if Block bei "// 1" ausgeführt und dann erst
> "// 2" und dann "// 3" ?
erschliesst sich mir nicht.
Gast #2245746
Lesenswert?

Markus Müller schrieb:
1
 if (FW_ForceHW)       // 1
2
   {
3
     FW_Init();          // 2
4
     FW_Seriell_Text(2, str1);
5
     if (OB->RDP != 0x5AA5)
6
       FW_Seriell_Text(2, str2);
7
     FW_ForceHW = 0;
8
   } else FW_Init();     // 2
9
   FW_UpdateLoop();      // 3

Also diese Reihenfolge kann ja nun auch nicht so ganz richtig sein.
Er kann nur if oder else, aber nicht else nach if.
#2245757
Lesenswert?

Gib dich mal in die FW_Init selber eine Textausgabe rein.
Dann weißt dsu es ganz genau, wann sie aufgerufen wird.


Ich tippe aber eher auf eine uninitalisierte Variable irgendwo. Meistens 
ist es irgendwas in dr Richtung, wenn sich die optimierte Variante von 
der nicht optimierten Variante unterschieidet.
OP (Firma: EleLa - www.elela.de) #2245775
Lesenswert?

Ich habe meine Original Datei wieder restauriert, diesen Text rein 
gemacht, siehe da es geht.

Dann hab ich diesen Text wieder raus gemacht und es geht immer noch 
!!???!?

Also nur einen Text extra hinzugefügt und sonst keine einzige Zeile 
angefasst. Komisch.

Ich habe zuvor auch schon mit make clean alles gelöscht und bevor ich 
hier poste sicher schon 2 Stunden selbst gesucht und probiert.

Vielleicht sollte ich soch mal meinen Rechner neu starten.

Vielen Dank für die schnelle Antworten.

Grüße Markus
OP (Firma: EleLa - www.elela.de) #2245950
Lesenswert?

Der Parameter -ansi meckert bei der Zeile:

SysTick->VAL = 0;

mit den Fehlern:
src/FW_Update_USB.c:272: error: expected identifier or '(' before 
'SysTick_Type'
src/FW_Update_USB.c:272: error: expected ')' before '(' token


Der Parameter -pedantic meckert bei der Zeile:

//****************

mit der Warnung:
src/FW_Update_USB.c:19: warning: C++ style comments are not allowed in 
ISO C90
src/FW_Update_USB.c:19: warning: (this will be reported only once per 
input file)
(und noch einige andere Warnungen bei Deklarationen zwischen Code)

Somit kann ich diese beiden Parameter nicht gebrauchen.

-Wextra meckert nichts an. Den lasse ich mal drin.
Gast #2246322
Lesenswert?

Markus Müller schrieb:
> Der Parameter -ansi meckert bei der Zeile:
>
> SysTick->VAL = 0;
>
> mit den Fehlern:
> src/FW_Update_USB.c:272: error: expected identifier or '(' before
> 'SysTick_Type'
> src/FW_Update_USB.c:272: error: expected ')' before '(' token

In dieser Zeile kommt weder der Name SysTick_Type, noch eine Klammer 
vor. Beziehen sich die Meldungen wirklich darauf? Ist SysTick oder VAL 
viellicht irgendwo als Makro definiert?

> Der Parameter -pedantic meckert bei der Zeile:
>
> //****************
>
> mit der Warnung:
> src/FW_Update_USB.c:19: warning: C++ style comments are not allowed in
> ISO C90
> src/FW_Update_USB.c:19: warning: (this will be reported only once per
> input file)
> (und noch einige andere Warnungen bei Deklarationen zwischen Code)

Dann mach statt "-ansi -pedantic" ein "-std=c99 -pedantic". In C99 ist 
beides erlaubt.

> Somit kann ich diese beiden Parameter nicht gebrauchen.
>
> -Wextra meckert nichts an. Den lasse ich mal drin.

Der Sinn der Sache war nicht, nur die Optionen drin zu lassen, die bei 
deinem aktuellen Code keine Meldungen produzieren, sondern zusätzliche 
Meldungen zu erhalten, die dir helfen, Fehler im Code zu finden.

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