RTOSのヒープメモリを使用する
テクニカル・ノート 90383
アーキテクチャ:
ARM
コンポーネント:
general
更新日:
2018/08/26 3:14
はじめに
本テクニカルノートは、アプリケーションがヒープを使用する2つの状況をカバーしています。(このヒープはRTOSによって管理されます)。
1: RTOSのヒープメモリを使用する
アプリケーションがRTOSを使用している場合で、ヒープ使用時(すなわち、malloc、new、printf、およびファイル操作関数の呼び出し時)にRTOSが提供するヒープメモリを使用したい場合
解決方法1:
ライブラリ関数のmallocとfreeを、それらに対応するRTOSの関数にリダイレクトします。
例えば、mallocを呼び出したときにOS_mallocが呼び出されるようにオーバーライドするには、リンカオプション(オプション(Options) > リンカ(Linker) > 追加オプション(Extra Options) > コマンドラインオプションの使用(Use command line options))に以下の行を追加します。
--redirect malloc=OS_malloc
--redirect free=OS_free
--redirect realloc=_not_implemented
--redirect calloc=_not_implemented
以下のサンプルコードは、OS_malloc関数とOS_free関数の実装方法を示しています。
void * OS_malloc(size_t size)
{
char *p;
// ...
return p;
}
void OS_free(void* ptr)
{
// ...
}
2: RTOSが起動される前にRTOSのヒープを使用する
RTOSが提供するヒープを使用するには、多くの場合、RTOSのヒープを初期化するか、RTOSを起動する必要があります。
早い段階でヒープを使用する一般的な例には、new演算子を呼び出すC++のグローバルコンストラクタがあります。グローバルコンストラクタは、システム起動時の動的初期化で呼び出されますが、その際、RTOSのヒープが初期化される前に呼び出される可能性があります。
また、RTOSが起動される前に他のRTOS関数(ファイルシステム操作関数など)を呼び出すと、問題が発生する可能性があります。
解決方法2:
A. システム起動時に動的初期化を無効にします。以下のリンカオプションを使用します(オプション(Options) > リンカ(Linker) > 追加オプション(Extra Options))。
--manual_dynamic_initialization
B. アプリケーションのソースコードに、ライブラリ関数への呼び出しを追加します。
#include "iar_dynamic_init.h"
...
__iar_dynamic_initialization()
この解決方法を使用すると、この初期化関数が呼び出されるまで動的初期化が遅れることになります。
サンプルプロジェクトについては、次のリンクを参照してください: Example project (IAR Embedded Workbench for ARM 6.30.7).zip
解決方法2に関するMQX固有の情報:
MQX3.8ユーザガイドの6.3章「Global Constructors」に、「Initialize the constructors from _bsp_enable_card()」と記載されています。
全ての製品名は、それぞれの所有者の商標または登録商標です。