2017-02-23 1300 views
1

我使用STM32F405RGT + HAL驅動程序+ FreeRTOSv9。代碼是C++。首先,當我編寫C代碼時,沒有問題。但是C++,錯了。在main.ccFreeRTOS + STM32F4 + CPP卡住時調用vTaskDelay

切入點

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); 
} 

在 「命令::的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。你應該檢查你的中斷tick或者檢查文件末尾的freertos_config.h文件中的特殊定義,以便與hal_delay兼容。

+0

他的問題是使用extern C語句與他們的C代碼。丟失extern「C」語句並且只用C++對你的代碼進行修改。試圖導入C語句。 – Nightforce2