Forum: Compiler & IDEs GCC kompiliert falsch?


von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


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.

von Karl H. (kbuchegg)


Lesenswert?

Markus Müller schrieb:

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

Wie hast du das festgestellt?
Der Anzeige eines Debuggers darfst du bei eingeschalteter Optimierung 
nicht mehr alles glauben.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Ganz einfach, wenn es geht steht das im Terminal:
1
FW-Loader V1.3.1607
2
U


und wenn es nicht geht, sieht das so aus:
1
U

Denn der "FW_Init();" initialisiert erst den UART.

Cpu: STM32F103

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Aktiviere erst mal Warnungen und beseitige die alle ;-)

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


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.

von (prx) A. K. (prx)


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.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Angehängte Dateien:

Lesenswert?

Ich hab die Datei mal etwas gegürzt.

Der Fehler tritt bei Zeile 94 auf.

von Norminator (Gast)


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.

von Norminator (Gast)


Lesenswert?

Oder hab ich das gerade falsch verstanden?

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Ja, du hast was falsch verstanden.
Erst konnt der INIT dann die Textausgabe, dann klappt das.

von Karl H. (kbuchegg)


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.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


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

von Rolf Magnus (Gast)


Lesenswert?

Markus Müller schrieb:
> Ein -Wall ist bereits drin, in der Datei gibt es keine einzige Warnung.

Füge noch -ansi -pedantic -Wextra hinzu.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


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.

von Rolf Magnus (Gast)


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.

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.