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

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.