2017-02-23 5 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()。初期化()"、別のタスクを作成し、その中タスク、ちょうどvTaskDelay(_500ms)とprintf(「何か\ r \ n」)。それで全部です。

「スタートアップ」タスクで「HAL_Delay()」を使用すると、すべて正常です。コンソールでは、「スタートアップ」と「何か」という2つの文字列を見ることができます。しかし、 "スタートアップ"タスクで "vTaskDelay()"を使用すると、 "vTaskDelay()"にスタックされ、システムコール "HardFault_Handler()"に移動する必要があります。

私は本当に理由を知らない。

+0

完全なコードサンプルを提供していないため、何が間違っているのか分かりにくいです。 HardFaultなどの予期しない動作については、通常、いくつかの機能が何をしているかについての言葉による説明は十分ではありません。私が提供するデータで示唆できるのは、HardFaultを自分で追跡することだけです。それについてはこちらをご覧ください:http://www.freertos.org/Debugging-Hard-Faults-On-Cortex-M-Microcontrollers.html –

答えて

0

おそらく、割り込みハンドラでSystickを正しくインクリメントしないでください。割り込みのチェックをチェックするか、ファイルの最後にあるfreertos_config.hファイルの特別な定義をチェックして、hal_delayと互換性のあるfreertosにする必要があります。

+0

彼の問題は、C++コードでextern Cステートメントを使用していることです。 extern "C"ステートメントを失い、C++のみでコードを修正してください。 Cのステートメントをインポートしようとします。 – Nightforce2

関連する問題