目次
1. 背景
1.1. 序文
STM32 を FreeRTOS に移植する方法を学習する過程で、ソース コードは正常に移植されましたが、コンパイル中にエラーが発生しました。
システム: win10
ソフトウェア: keil5 mdk
移植: FreeRTOS
問題: 使用前に未定義のエラーが発生する
2. 完全なエラー情報
2.1. 完全なエラーレポート
*** コンパイラ 'V5.06 update 5 (build 528)' を使用し、フォルダ: 'D:\keil\keil4\ARM\ARMCC\Bin' ビルド ターゲット 'FreeROTS移植一' をコンパイル
list.c
...
タイマーをコンパイルしています。 c...
croutine.c をコンパイル...
event_groups.c をコンパイル...
stream_buffer.c をコンパイル...
queue.c を
コンパイル...tasks.c を
コンパイル...heap_4.c
をコンパイル...port.c をコンパイル...
リンク中...
..\OBJ\LED.axf: エラー: L6218E: 未定義のシンボル xTaskGetCurrentTaskHandle (stream_buffer.o から参照)。
画像シンボルをリストするには情報が不十分です。
イメージ マップ内のロード アドレスをリストするには情報が不十分です。
完了: 情報 2 件、警告 0 件、エラー メッセージ 1 件。
"..\OBJ\LED.axf" - エラー 1 件、警告 0 件。
ターゲットは作成されていません。
ビルド経過時間: 00:00:00
2.2. エラー情報の解析
キーエラー:
..\OBJ\LED.axf: エラー: L6218E: 未定義のシンボル xTaskGetCurrentTaskHandle (stream_buffer.o から参照)。
分析: xTaskGetCurrentTaskHandle は使用前に定義されていません。
3. 解決策のアイデア
3.1. アイデア
未定義のエラー (このカテゴリ) の場合、解決策は通常、Ctrl+F で検索し、マクロ定義を見つけて、定義を変更することです。
以下の図 1 に示すように:
図1
ご覧のとおり、ここで定義がない場合、値は 0 に代入されますが、コードをコンパイルするときにそれを使用したため、エラーが発生しました。これを解決するには 0 を 1 に変更する必要があります。
以下の図 2 に示すように:
図2
変更を保存した後、次の図 3 に示すように再度コンパイルします。
画像3
4. 結果
上の図 3 からわかるように、このエラーは解決されていますが、使用前にエラーが定義されていない場合は、まず検索でマクロ定義を見つけて変更する必要があります。