2017-02-23 12 views
1

Я использую драйвер STM32F405RGT + HAL + FreeRTOSv9. И код - C++. Прежде всего, когда я написал код C, проблем нет. Но C++, что-то не так.FreeRTOS + STM32F4 + CPP застревает при вызове vTaskDelay

точка входа в 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; 
} 

И "запуска" задача

static void startup(void *param) { 

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

    while (1) { 

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

    vTaskDelete(nullptr); 
} 

В "Command :: GetInstance(). Init()", создать еще одну задачу, и в том, что задачи, просто vTaskDelay (_500ms) и printf («something \ r \ n»). Это все.

Если я использую «HAL_Delay()» в задаче «Запуск», все в порядке. В консоли я вижу две строки - «запуск» и «что-то». Но когда я использую «vTaskDelay()» в задаче «запуска», он должен застревать в «vTaskDelay()», а системные вызовы «HardFault_Handler()».

Я действительно не знаю почему.

+0

Вы не представили полный образец кода, поэтому трудно сказать, что не так - возможно, что-то с кодом, который вы не указали. Вербальное описание того, что делают некоторые функции, обычно недостаточно, особенно когда дело доходит до неожиданного поведения, такого как HardFault. Сказав это, все, что я могу предложить с предоставленными данными, - это отслеживать HardFault самостоятельно. Для этого посмотрите здесь: http://www.freertos.org/Debugging-Hard-Faults-On-Cortex-M-Microcontrollers.html –

ответ

0

Возможно, вы не должны правильно увеличивать Systick в обработчике прерываний. Вы должны проверить свой тираж прерывания или проверить специальное определение в файле freertos_config.h в конце файла, чтобы быть совместимым freertos с hal_delay.

+0

Его проблема заключается в использовании внешних инструкций C с кодом C++. Потеряйте выражение extern «C» и верните свой код только на C++. отключает попытку импортировать инструкции C. – Nightforce2