2017-02-23 4 views
1

stecken Ich verwende STM32F405RGT + HAL-Treiber + FreeRTOSv9. Und der Code ist C++. Zuallererst, als ich den Code von C geschrieben habe, gibt es kein Problem. Aber C++, stimmt etwas nicht.FreeRTOS + STM32F4 + CPP beim Aufrufen der vTaskDelay

Eintrittspunkt in main.cc

extern "C" int main(void) { 

    HAL_Init(); 
    SystemClock_Config(); 

    xTaskCreate(startup, "startup", STARTUP_TASK_STACK, NULL, STARTUP_TASK_PRIO, NULL); 
    vTaskStartScheduler(); 

    return 0; 
} 

Und "startup" Aufgabe ist

static void startup(void *param) { 

    Config::GetInstance().Init(); 
    Command::GetInstance().Init(); 

    while (1) { 

    trace("startup\r\n"); 
    vTaskDelay(M2T(1000)); 
    } 

    vTaskDelete(nullptr); 
} 

In "Befehl :: GetInstance(). Init()", eine andere Aufgabe erstellen, und dass Aufgabe, nur vTaskDelay (_500ms) und printf ("etwas \ r \ n"). Das ist alles.

Wenn ich "HAL_Delay()" in der "Start" Aufgabe verwenden, ist alles in Ordnung. In der Konsole kann ich zwei Zeichenfolgen sehen - "Start" und "etwas". Aber wenn ich die "vTaskDelay()" in der "Start" -Task verwenden, sollte es in der "vTaskDelay()" und Systemaufrufe "HardFault_Handler()" stecken.

Ich weiß wirklich nicht warum.

+0

Sie haben das vollständige Codebeispiel nicht zur Verfügung gestellt, daher ist es schwer zu sagen, was falsch ist - wahrscheinlich etwas mit dem Code, den Sie nicht angegeben haben. Eine verbale Beschreibung dessen, was einige Funktionen tun, ist in der Regel nicht ausreichend, insbesondere wenn es sich um unerwartetes Verhalten wie HardFault handelt. Nichtsdestoweniger kann ich mit den bereitgestellten Daten nur vorschlagen, HardFault selbst zu verfolgen. Sehen Sie dazu hier: http://www.freertos.org/Debugging-Hard-Faults-On-Cortex-M-Microcontroller.html –

Antwort

0

Wahrscheinlich sollten Sie den Systick nicht korrekt im Interrupt-Handler inkrementieren. Sie sollten Ihr Interrupt-Häkchen überprüfen oder eine spezielle Definition in der Datei freertos_config.h am Ende der Datei prüfen, um kompatible Freertos mit der hal_delay zu erhalten.

+0

Sein Problem ist die Verwendung von externen C-Anweisungen mit C++ - Code in ihnen. Verliere die externe "C" -Anweisung und korrigiere deinen Code nur mit C++. Sie versuchen, C-Anweisungen zu importieren. – Nightforce2