マルチスレッド環境の取扱い
テクニカル・ノート 95292
アーキテクチャ:
Arm
コンポーネント:
compiler
更新日:
2022/10/04 10:12
はじめに
マルチスレッド環境を使用時、標準ライブラリのマルチスレッドサポートを使用する必要があります(malloc()の呼び出しなど)。
解決方法
標準ライブラリでマルチスレッドのサポートを有効にできます。開発ガイドの「マルチスレッドサポートの有効化」の章を参照してください:
検証
システムロック/ファイルロックインタフェースを実装すると、malloc/freeなどの呼び出し時にシステムロック関数が呼び出されるかどうかを検証できます。*Mtxinit関数、*Mtxlock関数、および*Mtxunlock関数にブレークポイントを設定し、malloc/freeの呼び出しをステップオーバしてください。
RTOSを使用する場合
RTOSを使用する場合、最初に、マルチスレッドサポートを本当に実装すべきかどうかを検討します。
多くのRTOSベンダは、そのようなマルチスレッドサポートを既に実装しています。以下にその例を示します。
- Micrium uC/OS-IIおよびIII: uC/OS-IIIユーザマニュアルの「Thread Safety of the Compiler's Run-Time Library」の章を参照してください。
- Segger embOS: embOSのCPUとCompilerに関する仕様の「Thread-safe system libraries」の章を参照してください。
- Express Logic ThreadX: ThreadXとアプリケーションの両方で、TX_ENABLE_IAR_LIBRARY_SUPPORTというシンボルを定義する必要があります。
- また、多くのRTOSでは、独自のヒープを使用するよう推奨されています。
Express Logic ThreadXの場合: [tx_byte/block_allocate]
RTOSとC++を使用する場合
マルチスレッドRTOSとC++を組み合わせて使用する場合、以下のコンパイルオプションを使用する必要があります。
--guard_calls
IDEでは、このオプションは、プロジェクト(Project) > オプション(Options) > C/C++コンパイラ(C/C++ Compiler) > 追加オプション(Extra Options)で指定できます。
その理由は、C++では複数のRTOSスレッドからコンストラクタ/デストラクタを呼び出せるためです。
IAR Embedded Workbench for ARM 6.60以降を使用する場合
IAR Embedded Workbench for ARMバージョン6.60以降を使用する場合、以下のリンカオプションを有効にします。
--threaded_lib
これは、IDEの次のオプションで設定できます: プロジェクト(Project) > オプション(Options) > 一般オプション(General Options) > ライブラリ設定(Library Configuration) > ライブラリのスレッドサポートを有効にする(Enable thread support in the library)
Example project: Example project (version 9.30.1).zip.
全ての製品名は、それぞれの所有者の商標または登録商標です。