Forum: Mikrocontroller und Digitale Elektronik Delay Funktion funktioniert nach Wechsel von C zu C++ nicht mehr ,STM32F4xx


von Alex K. (alexk99123)


Lesenswert?

Hallo,

ich möchte ein aktuelles Firmwareprojekt eines STM32F4xx, geschrieben in 
C, in ein C++ Projekt migrieren, um für ein Firmwareupdate Klassen etc. 
nutzen zu können. Es findet zudem ein Wechsel der IDE statt (CooCox zu 
TrueStudio). Kompilierfähig ist bereits alles. Wenn ich ein C Projekt 
unter TrueStudio anlege, funktioniert die Timing Funktion mit Systick 
problemlos. Sobald ich ein C++ Projekt verwende, kompiliert auch alles 
ohne Probleme, beim Debuggen bleibt das Programm aber in der Delay 
Funktion hängen.

Die Variable Systick_Delay ist als
1
 static volatile uint32_t Systick_Delay;
 in der systick.cpp Datei angelegt.
Code für die µs Delay Funktion:
1
void delay_us(volatile uint32_t delay)
2
{
3
  Systick_Delay = delay;
4
5
  while(Systick_Delay != 0);
6
}

Initialisierung des Systicks:
1
void systick_init(void)
2
{
3
  RCC_ClocksTypeDef RCC_Clocks;
4
5
  // alle Variablen zurücksetzen
6
  Systick_Delay=0;
7
8
  RCC_GetClocksFreq(&RCC_Clocks);
9
  SysTick_Config((RCC_Clocks.HCLK_Frequency / 3000000));
10
}


Die Delay Funktionen für die Millisekunden und Sekunden sind aus der µs 
- Funktion abgeleitet.


Der Systick Handler sieht folgendermaßen aus:
1
void SysTick_Handler(void)
2
{
3
  //Tick für Delay
4
  if(Systick_Delay != 0x00)
5
  {
6
  Systick_Delay--;
7
  }
8
}

Hat irgendjemand eine Idee, was C++ stören könnte, sodass die Delay 
Funktion plötzlich nicht mehr funktioniert? Ich bin mittlerweile total 
ratlos.

Ich habe bereits die CooCox - Standardkonfiguration, die beim erstellen 
des Projekts angelegt wird, komplett in TrueStudio übernommen, habe die 
systick - Dateien als .c deklariert und mit
1
extern "C" { }
 included, habe alle Clock Settings incl. PLL überprüft, aber ich finde 
einfach keinen Fehler.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Wird der SysTick_Handler ausgeführt? Kannst du mal den 
disassemblisierten Code der Systick_Delay zeigen? Tritt das Problem bei 
allen Compiler-Optimierungs-Stufen auf?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Alex K. schrieb:
> Ich habe bereits die CooCox - Standardkonfiguration, die beim erstellen
> des Projekts angelegt wird, komplett in TrueStudio übernommen, habe die
> systick - Dateien als .c deklariert und mit extern "C" { } included,
> habe alle Clock Settings incl. PLL überprüft, aber ich finde einfach
> keinen Fehler.

Ich weiß jetzt nicht konkret, was Du alles mit extern "C" geklammert 
hast, aber das solltest Du hier schon tun:
1
extern "C" void SysTick_Handler(void)
2
{
3
    // Dein Code
4
}

Ich vermute nämlich mal, dass Dein Systick_Handler gar nicht aufgerufen 
wird. Dadurch bleibt das Programm in der delay-Schleife hängen.

von Alex K. (alexk99123)


Lesenswert?

Frank M. schrieb:
> Alex K. schrieb:
>> Ich habe bereits die CooCox - Standardkonfiguration, die beim erstellen
>> des Projekts angelegt wird, komplett in TrueStudio übernommen, habe die
>> systick - Dateien als .c deklariert und mit extern "C" { } included,
>> habe alle Clock Settings incl. PLL überprüft, aber ich finde einfach
>> keinen Fehler.
>
> Ich weiß jetzt nicht konkret, was Du alles mit extern "C" geklammert
> hast, aber das solltest Du hier schon tun:
> extern "C" void SysTick_Handler(void)
> {
>     // Dein Code
> }
>
> Ich vermute nämlich mal, dass Dein Systick_Handler gar nicht aufgerufen
> wird. Dadurch bleibt das Programm in der delay-Schleife hängen.


Könnte ich deine Antwort 1000x Upvoten, würde ich das tun!!! Vielen 
Dank, das war tatsächlich die Lösung für mein Problem, das ich nach 2 
Tagen Fehlersuche nicht herausgefunden habe. Was ich schonmal gemacht 
habe, ist in der main.cpp einen Bereich als
1
extern "C"
 für die includes festzulegen, also
1
extern "C"{ 
2
#include systick.h ... 
3
}
, aber damit hat es auch nicht funktioniert.
Aber jetzt klappt alles, wie gewollt.
Vielen Dank nochmal für die Hilfestellung

: Bearbeitet durch User
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.