2016-08-19 21 views
1

Keil RTX RTOSコンフィギュレーションファイルで、ユーザはデフォルトのユーザスレッドスタックサイズを設定できます。 一般に、スタックには、自動/ローカル変数が格納されます。 "ZIデータ"セクションには、初期化されていないグローバル変数があります。Keil RTX RTOSスレッドスタックサイズ

RTX構成ファイルでユーザースレッドのスタックサイズを変更すると、スタックサイズが大きくなり、セクションサイズが「ZIデータ」にならないようになります。

私はそれをテストし、私はユーザーのスレッドのスタックサイズを増やすと、テスト結果が表示されます。 「ZIデータ」セクションのサイズは、同じサイズと同期して増加します。

私のテストプログラムには6つのスレッドがあり、それぞれに600バイトのスタックがあります。私は、プログラムを構築するためにKeil社を使用し、それがあることを私に示しています

 
     Code (inc. data) RO Data RW Data ZI Data  Debug 

    36810  4052  1226  380  6484  518461 Grand Totals 
    36810  4052  1226  132  6484  518461 ELF Image Totals (compressed) 
    36810  4052  1226  132   0   0 ROM Totals 

============================================================================== 

    Total RO Size (Code + RO Data)    38036 ( 37.14kB) 
    Total RW Size (RW Data + ZI Data)    6864 ( 6.70kB) 
    Total ROM Size (Code + RO Data + RW Data)  38168 ( 37.27kB) 

しかし、私は800バイトに、各スレッドのスタックサイズを変更した場合。

 
============================================================================== 


     Code (inc. data) RO Data RW Data ZI Data  Debug 

    36810  4052  1226  380  7684  518461 Grand Totals 
    36810  4052  1226  132  7684  518461 ELF Image Totals (compressed) 
    36810  4052  1226  132   0   0 ROM Totals 

============================================================================== 

    Total RO Size (Code + RO Data)    38036 ( 37.14kB) 
    Total RW Size (RW Data + ZI Data)    8064 ( 7.88kB) 
    Total ROM Size (Code + RO Data + RW Data)  38168 ( 37.27kB) 

============================================================================== 

「ZIデータ」セクションのサイズが6484から7684バイトに増加しました。 7684 - 6484 = 1200 = 6 * 200。そして800 - 600 = 200。 スレッドスタックは "ZI Data"セクションに置かれています。

私の質問は: それは、スレッドスタックは、「ZIデータ」RAM内のセクションに置かれたとき、スレッドの自動車/ローカル変数は、「ZIデータ」セクションに置かれるということですか? 真の場合は、スタックセクションがまったくないことを意味します。 「RO/RW/ZIデータ」とヒープセクションのみがあります。

この記事では、私にはさまざまな答えが与えられます。そして今私はちょっと混乱しています。 https://developer.mbed.org/handbook/RTOS-Memory-Model

+0

_実行中のスレッドの観点から、 "スタックは自動/ローカル変数"を保持します。私はこれらのスタックが静的に割り当てられた変数をOSの観点から考えることはできないという理由は見当たりません。あなたは単にここで観測を提示しただけです。特定の質問は何ですか? – Notlikethat

答えて

1

リンカは、どのメモリセクションが存在するかを決定します。リンカはデフォルトでいくつかのメモリセクションを作成します。あなたのケースでは、これらのデフォルトセクションのうちの3つが、明らかに「ROデータ」、「RWデータ」、および「ZIデータ」と呼ばれています。変数をどのセクションに配置するかを明示的に指定しないと、リンカーは変数がconst、initialized、またはuninitializedのいずれで宣言されているかに基づいて、これらのデフォルトセクションの1つに割り当てます。

リンカーは、RTOSを使用していることを自動的に認識しません。スレッドスタックとしてどの変数を使用するかについて特別な知識はありません。したがって、リンカはスレッドスタック用の独立したメモリセクションを自動的に作成しません。むしろ、リンカーはスタック変数を他の変数と同様に扱い、デフォルトのメモリセクションの1つに含めます。あなたの場合、スレッドスタックは明らかにリンカによってZIデータセクションに置かれています。

スレッドスタック用に特別な独立したメモリセクションをリンカーに作成させる場合は、リンカーコマンドファイルを使用してリンカーに明示的に指示する必要があります。また、スタック変数をカスタムセクションに配置するように指定する必要もあります。これを行う方法の詳細については、リンカーのマニュアルを参照してください。

+0

ありがとうございます。通常、「ROデータ」、「RWデータ」、「ZIデータ」、「スタック」、「ヒープ」のデフォルトセクションがあります。リンカは、フラッシュメモリとRAMメモリのレイアウトを決定します。スレッドスタックが "ZI Data"に置かれている場合、そのスレッドで呼び出された関数のすべての自動変数が "ZI Data"セクションにあることを意味しますか?次に、「スタック」セクションには何がありますか? –

+0

メインプログラム用のスタックがあります。これは、main()が呼び出されたとき、およびRTOSが開始される前に使用されているスタックです。リンカコマンドファイルは、メインスタックのメモリセクションを明示的に指定することがあります。各スレッドには、メインスタックとは別のスタックがあります。リンカーは、これらのスレッドスタックをZIデータセクションに配置しています。 RTOSが実行されると、スレッドのローカル変数がスレッドスタック上に作成されます。スレッドスタックがZIデータにあるため、スレッドローカル変数はZIデータにあります。メインスタックは、RTOSが実行される前にローカル変数が配置されている場所です。 – kkrambo

+0

RTOSの実行後、「main関数」は決して再び呼び出されません。一度RTOSが台無しになると、メインスタックは決して使用されません。メモリを節約するために、メインスタックとスレッドスタックのメモリ空間が重複することを意味します。 –

0

タスクスタックはどこかから来なければなりません - RTXではデフォルトで静的に割り当てられ、固定サイズです。

os_tsk_create_user()は、呼び出し側が任意の方法で(静的にもヒープからでも割り当てることができますが、呼び出し元スタックからの割り当ては可能ですが、通常は無意味で、おそらく無意味であり、確かに危険です)バイト整列。私はRTXの自動スタック割り当てがほとんど無意味で、ほとんどの場合には適切ではないことがわかりました。

関連する問題