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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Alex K. (alexk99123)


Bewertung
0 lesenswert
nicht 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


Bewertung
1 lesenswert
nicht 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


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.