1

Keil RTX RTOS 構成ファイルで、ユーザーはデフォルトのユーザー スレッド スタック サイズを構成できました。一般に、スタックは auto/local 変数を保持します。「ZI データ」セクションには、初期化されていないグローバル変数が保持されます。

したがって、RTX 構成ファイルでユーザー スレッドのスタック サイズを変更すると、スタック サイズが増加し、「ZI データ」セクションのサイズは増加しません。

テストしたところ、ユーザー スレッドのスタック サイズを増やすとテスト結果が示されました。「ZI data」セクションのサイズは、同じサイズで同期的に増加します。

私のテスト プログラムでは、6 つのスレッドがあり、それぞれに 600 バイトのスタックがあります。Keil を使用してプログラムをビルドすると、次のことがわかります。

      コード (データを含む) RO データ RW データ ZI データ デバッグ   

     36810 4052 1226 380 6484 518461 総計
     36810 4052 1226 132 6484 518461 ELF 画像の合計 (圧縮)
     36810 4052 1226 132 0 0 ROM合計

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

    合計 RO サイズ (コード + RO データ) 38036 ( 37.14kB)
    合計 RW サイズ (RW データ + ZI データ) 6864 ( 6.70kB)
    合計 ROM サイズ (コード + RO データ + RW データ) 38168 ( 37.27kB)  

しかし、各スレッドのスタック サイズを 800 バイトに変更したとします。キールは次のように私に示します:

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


      コード (データを含む) RO データ RW データ ZI データ デバッグ   

     36810 4052 1226 380 7684 518461 総計
     36810 4052 1226 132 7684 518461 ELF 画像の合計 (圧縮)
     36810 4052 1226 132 0 0 ROM合計

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

    合計 RO サイズ (コード + RO データ) 38036 ( 37.14kB)
    合計 RW サイズ (RW データ + ZI データ) 8064 ( 7.88kB)
    合計 ROM サイズ (コード + RO データ + RW データ) 38168 ( 37.27kB)

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

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

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

この記事は私に別の答えを与えます。そして、私は今それについて少し混乱しています。 https://developer.mbed.org/handbook/RTOS-Memory-Model

4

2 に答える 2

1

リンカは、どのメモリ セクションが存在するかを判断します。リンカは、デフォルトでいくつかのメモリ セクションを作成します。あなたの場合、これらのデフォルト セクションの 3 つは、明らかに「RO データ」、「RW データ」、および「ZI データ」という名前です。変数を配置するセクションを明示的に指定しない場合、リンカーは、変数が const として宣言されているか、初期化されているか、または初期化されていないかに基づいて、これらの既定のセクションのいずれかに変数を割り当てます。

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

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

于 2016-08-19T12:43:39.293 に答える