Forum: Mikrocontroller und Digitale Elektronik Atollic STM32, GCC Compiler, Debug<->Release


von Frank (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich benutze zum Programmieren eines STM32f103 das Atollic TrueSTUDIO 
Lite.

Dieses bietet einem die Möglichkeit über ein Auswahlmenü zwischen Debug 
und Release beim kompilieren zu unterscheiden.
In meinem Programm nutze ich den Watchdog des STM. Um aber weiter 
Debuggen zu können, muss dieser in der Debug-Phase deaktiviert werden.

Das Aktiviere bzw. Deaktivieren realisiere ich wie folgt:
1
#ifdef XXXXX
2
  IWDG_init();//Funktion zum Initialisieren des WD
3
#endif

Nur leider kann ich nicht in Erfahrung bringen, welche Variable/Symbol 
sich hinter dem Menü verbirgt (siehe Bild im Anhang).
Getestet habe ich folgende Varianten:
NDEBUG
__DEBUG
_DEBUG
DEBUG
...

Kann mir vielleicht jemand helfen und mir sagen welches Symbol ich für 
"XXXXX" einsetzen muss?

Vielen Dank und Gruß

von 900ss (900ss)


Lesenswert?

Ich spreche jetzt mal für Eclipse. Atollic Studio ist ja davon 
abgeleitet.

In den jeweiligen Project-Properties kannst du die Compileroptionen 
einstellen. Unter anderem auch defines, die per Kommandozeile an den 
Compiler übergeben werden. Das geht jeweils für die Debug- und auch die 
Release Konfiguration. Dort kannst du für die Debug-Konfiguration ein 
define "DEBUG" eintragen und dieses dann später im Code verwenden. Bei 
der Release-Konfiguration trägts du dieses define nicht ein.

von Frank (Gast)


Angehängte Dateien:

Lesenswert?

Vielen Dank für deine schnelle Antwort.

Ich habe wie im Anhang gezeigt das Symbol "_NDEBUG" unter der 
Debug-Konfiguration angelegt (Atollic.PNG).
Im Bild Atollic2.PNG ist zu erkennen, dass unter der 
Release-Konfiguration das Symbol nicht existiert.

Wenn ich jetzt aber wie im Bild aus dem ersten Post umschalte, wird 
nicht unterschieden. Bedeutet, bei
1
#ifdef _NDEBUG
2
  IWDG_init();//Funktion zum Initialisieren des WD
3
#endif

wird die Funktion immer ausgeführt. Egal ob Debug oder 
Release-Konfiguration.

Sind die Einstellungen denn eigentlich so richtig oder muss ich noch 
weitere vornehmen?

Vielen Dank nochmal für die Hilfe

von 900ss (900ss)


Lesenswert?

Wenn du das Projekt baust, dann sieh mal im Logfenster beim 
Compileraufruf nach, ob das Define übergeben wird (Debug Konfig) oder 
eben nicht (Release).
Daran müßtest du das gut sehen können.

Oder du hast das define noch woanders stehen :-)

von Frank (Gast)


Lesenswert?

Hallo,

hier mal die Ausschnitte aus den Logfenstern:
Logfenster-Ausschnitt bei Debug:
1
arm-atollic-eabi-gcc -c -mthumb -mcpu=cortex-m3 -DSTM32F10X_MD
2
-DUSE_STDPERIPH_DRIVER -D_NDEBUG -I../src -I..\Libraries
3
\STM32F10x_StdPeriph_Driver\inc -I..\Libraries\CMSIS\CM3\CoreSupport
4
-I..\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x -I../my_lib/inc 
5
-I../my_lib/src -O0 -ffunction-sections -fdata-sections -g -Wall -std=c99
6
-osrc\main.o ..\src\main.c

und der Ausschnitt beim Release:
1
arm-atollic-eabi-gcc -c -mthumb -mcpu=cortex-m3 -DSTM32F10X_MD
2
-DUSE_STDPERIPH_DRIVER -I../src -I..\Libraries
3
\STM32F10x_StdPeriph_Driver\inc -I..\Libraries\CMSIS\CM3\CoreSupport
4
-I..\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x -I../my_lib/inc
5
-I../my_lib/src -Os -ffunction-sections -fdata-sections -Wall -std=c99
6
-osrc\main.o ..\src\main.c

Es scheint so, als ob alles richtig übergeben wird, oder? Das "_NDEBUG" 
ist ja zu sehen.
Trotzdem wird keine Unterscheidung gemacht.

Hast du oder jemand anderes noch eine Idee?

Vielen Dank und Gruß...

von Lutz (Gast)


Lesenswert?

Frank schrieb:
> Getestet habe ich folgende Varianten:
> NDEBUG
> __DEBUG
> _DEBUG
> DEBUG

Frank schrieb:
> Das "_NDEBUG"
> ist ja zu sehen.

Letzteres hast Du jetzt aber auch probiert, oder? Ansonsten sieht es 
eigentlich gut aus.

von 900ss (900ss)


Lesenswert?

HMm.. der Aufruf sieht gut aus.
Du mußt auch beachten, dass die Debug-Config (bei Eclipse zumindest) 
auch in einem Debug-Directory den ELF-File erzeugt. Während die 
Release-Config in einem Release-Ordner abgelegt wird. Vielleicht 
startest du immer die Debug-Variante?

von Frank (Gast)


Lesenswert?

Hallo,

Problem war, wie 900ss gesagt hat, das ich immer das Debug-RLF-File 
geladen habe. Es werden 2 verschiedene Files erzeugt, eins im Debug- und 
eins im Release-Ordner. Leider lädt Atollic beim umschalten zwischen 
Debug und Release immer nur das Debug-File in den Controller.

Da ich das Release-File nur per RS232 und dem ST Flash Loader und nicht 
aus der IDE heraus lade, ist das also erstmal kein Problem.
Vielleicht hat aber ja noch einer eine Idee, wie man Atollic/Eclipse 
dazu bringt auch gleich das richtige ELF-File zu laden.

Vielen Dank für die Hilfe und Gruß

von frame (Gast)


Lesenswert?

Ich würde es einmal so versuchen:
In den Project Properties->RunDebug Settings auswählen.
Dort die entsprechende 'Launch configuration' markieren
(wahrscheinlich steht dort nur eine, "<Projektname>.elf"),
dann den Edit-Button drücken.
Dort steht üblicherweise (so z.B. bei meinem Projekt, das ich
gerade offen habe), als "C/C++ Application":
    Debug/<Projektname>.elf
und als Build Configuration
    Use Active

Ändere doch einfach bei "C/C++ Application" den Pfad auf "Release/" um.

Das Atollic beim Debuggen mit der Debug-Konfiguration startet,
finde ich nicht ganz unlogisch.

von Marcus P. (spell)


Lesenswert?

Gibt es da keine Extra Funktion für um den Release Code in den 
Controller zu bekommen?

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.