マルチスレッド環境の取扱い

テクニカル・ノート 95292

アーキテクチャ:

ARM

コンポーネント:

compiler

更新日:

2018/08/26 3:43

はじめに

マルチスレッド環境を使用時、標準ライブラリのマルチスレッドサポートを使用する必要があります(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では、独自のヒープを使用するよう推奨されています。
    • Freescale MQXの場合: [_mem_alloc].
    • 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)

バージョン6.40~6.50を使用する場合

バージョン6.40または6.50を使用する場合、マルチスレッドサポートを有効にするには、プロジェクト(Project) > オプション(Options) > リンカ(Linker) > 追加オプション(Extra Options)でいくつかのリンカオプション(--redirect)を追加する必要があります。

--redirectオプションについては、以下のファイルに説明が記載されています。

<DLib_Threads.h>

なお、RTOSを使用する場合でも、これらのオプションを追加する必要があります。

DLib_Threads.h information のリンク、および、サンプルプロジェクトExample project (version 6.50.6).zip.を参照してください。 

 

全ての製品名は、それぞれの所有者の商標または登録商標です。

申し訳ございませんが、弊社サイトではInternet Explorerをサポートしていません。サイトをより快適にご利用いただくために、Chrome、Edge、Firefoxなどの最新ブラウザをお使いいただきますようお願いいたします。