4

主要なサイクルが 10KHz で実行されるリアルタイム組み込みアプリがあります。フラッシュから起動するように構成された TI TMS320C 上で動作します。最近、初期化された配列をソース ファイルに追加したところ、突然タイミングが狂いました (複雑すぎてうまく説明できません - 基本的に、シリアル ポートの書き込みが時間どおりに完了しなくなりました)。

これについて私を困惑させること:

  • 初期化された配列を宣言するだけで、新しいデータにアクセスすることすらありません
  • サイズに依存します - 問題は、配列が 40 ワードを超える場合にのみ発生します。
  • リンク マップ内のデータ セグメントがオーバーフローしていないことはわかっています。
  • データ キャッシュがないため、キャッシュの一貫性が損なわれることはありません。

フラッシュ内の .cinit セグメントのサイズを単純に大きくすると、コードのタイミングにどのように影響するかについてのアイデアはありますか?

追加情報:
コードが移動したのではないかと考えましたが、データから十分に分離されています。すべてのコード セグメントがバグの前後で同じアドレスを持っていることをメモリ マップで確認しました。また、満杯のセグメントがないことも確認しました。マップ内で変化するアドレスは、.cinit セクションの一部のみです。そのセクションには、RAM の変数を初期化するために使用されるデータ値が含まれています (私の配列など)。main() が呼び出された後はアクセスしないでください。

4

7 に答える 7

1

おそらく、新しい静的に割り当てられた配列は、既存のデータをより遅いメモリ領域にプッシュし、そのデータへのアクセスをより遅くしますか?

于 2008-09-24T22:31:17.623 に答える
1

私は自分自身を危険にさらし、ここではパフォーマンスの問題はなく、パフォーマンスの問題として症状を示すある種のメモリ破損はないと主張します。メモリ画像を変更する実行可能ファイルに配列を追加します。したがって、ほとんど無害なメモリ破損 (つまり、メモリの使用されていない部分を上書きする) があり、メモリを 40 バイト以上シフトすると、メモリ破損がより大きな問題になると思います。どれが本当の質問ですか

于 2008-09-25T09:17:09.037 に答える
1

配列がアドレス空間のチャンクの最後のものである場合、問題は再発しますか? そうでない場合は、マップを調べて、配列宣言を移動して、1 つずつ、その後に配置されたものが代わりに前に配置されるようにシャッフルしてみてください。このようにして、関連するオブジェクトを特定し、それを移動すると遅延が発生する理由を理解し始めることができます。

于 2008-09-24T22:42:35.597 に答える
1

トレースと生成されたアセンブリを1日以上見つめた後、私はそれを理解したと思います. 根本原因の問題は、シリアル ポートの書き込みを開始した ISR が優先度の高い ISR と衝突した場合にのみグリッチを引き起こす設計上の問題であることが判明しました。タイミングはたまたま、1 つのループにいくつかの命令を追加するだけで 2 つの割り込みが衝突することがわかりました。

問題は、次のようになります: フラッシュ メモリに追加のデータをアクセスするのではなく格納すると、追加の命令がどのように実行されるのでしょうか?

答えは Frosty と Frederico による提案に関連しているように見えますが、まったく同じではありません。新しい配列はいくつかの既存の変数を移動しますが、ページの境界を越えたり、より遅い領域には移動しません (このボードでは、アクセス時間はすべての領域で同じでなければなりません)。ただし、頻繁にアクセスされる一部の構造体のオフセットが変更されるため、オプティマイザーはそれらにアクセスするためにわずかに異なる命令シーケンスを発行します。1 つのデータ アライメントが原因で 1 サイクルのパイプライン ストールが発生する場合がありますが、他の場合はそうではありません。そして、これらのいくつかの命令は、根本的な問題を明らかにするのに十分なタイミングをシフトしました。

于 2008-09-26T16:22:28.637 に答える
1

私の疑いは、データ/コードとその下にあるメディア/メモリとの間の調整の変化を示していると思います. データに追加すると、ヒープ内のメモリの場所が変更され (メモリ モデルによって異なります)、コードがフラッシュ デバイスの「ページ」境界を越えて配置される可能性があり、以前にはなかったレイテンシが発生します。

于 2008-09-24T21:05:45.580 に答える
0

同様に、銀行またはページの競合である可能性があります。たぶん、同じページにあり、現在2つのページに分割されている2つのルーチン(割り込みハンドラーなど)が頻繁に呼び出されます。

于 2008-09-24T21:19:08.060 に答える
0

初期化によって、隣接する別のコードが上書きされる可能性はありますか? 配列を使用する構造体または変数はありますか?それらは現在より大きく、スタックオーバーフローを引き起こす可能性がありますか?

于 2008-09-24T21:10:40.623 に答える