一般的に、特にDMA

あなたがどこに落ちるか知っていたら、私はストローを敷くでしょう


DMA(ダイレクトメモリアクセス)-ロシア語DAP(メモリへのダイレクトアクセス)の存在については、組み込みデバイスの多くの開発者が聞いたことがありますが、今では(DAP)に値するよりもずっと少なく使用しています。 ちなみに、私はこの非常に略語に言及しますが、私がそのような頑固な愛国者であり、英語の借用の反対者であるからではなく、キーボードレイアウトをもう一度切り替えるのが面倒だからです。



MKプログラムでのDAPの不十分な使用の主な理由は3つです。1)このデバイスの相対的な複雑さと、2)その使用の利点の理解の欠如は、このデバイスの研究と習得に消極的です(そのような場合、姉は注文しません-それらのために戦車の中で誰が私たちが以前に生まれた怠aboutについてです)、3)MKに付属のマニュアルでMPDを使用する良い例と理解できる例が不足していることを圧倒しました。 最初の2つの理由が本質的に明らかに主観的である場合、3番目は間違いなく客観的であり、妄想は私の中で覚醒し、これは特に国内のMK開発者が60以上のどこかに苦しんでいる高度なレベルに達するのを防ぐために行われたと主張していますそして、世界中の開発者の残りは、1)正しい例がロシアの外に広がっているか、2)起きないという大きな目標のために、ブルジョアジーがどんなひざの上に行く準備ができているので、妄想によって無視されます。 rtvy)。



それにもかかわらず、ジョークなしで、実際には、例ではせいぜい、個々のRAPチャネルを設定するためのモジュールがあり、アプリケーションの例ではRPSドライバーとリンクされたシステムを見つけることはありません(CMSISでさえ、実際には客観的な理由があります-私は約記事を書きます彼-私は言及します)。 なぜそうなのか-わからないが、クリスタル開発者はよく知っている、私の頭に浮かぶ唯一の合理的な正当性は、RAPが非常に具体的であるため、「あなたはそれを手に入れてそれを取ることはできません」別のソースからコードを転送するが、実際の開発ではRAPの需要が低いため、このような例が存在しないことは大きな欠点とは見なされません。 私が示した知識のギャップを埋めるために、この投稿は意図的ではありません(控えめな発言ですが、自分を賞賛しない場合は、唾を吐くように一日中歩き回ってください)。



それにもかかわらず、私は彼のデザインに安全に含めることができる銀の弾丸をここで見つけることはできませんが、MKで独自のシステムを構築するのを容易にするいくつかの考えとアプローチを見つけるでしょうRAPの適用。 つまり、私は熊手が正確にある場所に旗を置きますが、マークのない熊手がないことを保証することはできませんが、それはあなたがイチジクに旗を投げて熊手を自分で歩くことを妨げるものではありません。 一般に、私の投稿を読んだ人は、私が何をすべきか、どのように正確に焦点を合わせていないことに気づいているに違いありませんが、なぜそうすることをお勧めするのでしょうか。



そのため、DAPはMK機器の一部であり、プロセッサリソースを引き付けることなく、特定のMK(および参加しているシステム)のさまざまなコンポーネント間でデータを送信できます(より正確には、最小限の関与で、一般的にプロセッサ参加なしで何かを行うため) -大胆かつ広範囲に及ぶ考え)。



これらのデバイスの主な考え方は、プログラムが実行されるときに、すべてのコマンドが外部デバイスまたはRAMへのシステムバスを呼び出すわけではないためです(プログラムメモリへのアクセスは考慮されません)。したがって、システムバスにサービスを提供するデバイスにはアイドルサイクルがあります何かを使うといいでしょう。



RAPの作成に貢献したもう1つの理由は、ポーリングでのメンテナンスにかなりのプロセッサ時間が必要な高速入出力デバイスの出現で、割り込みサービスはほとんど不可能でした。 RAPの前身は、ローカルメモリを備えたメインフレームアーキテクチャのいわゆる周辺プロセッサと見なされる必要があります。これは、高速入出力デバイスとメインランダムアクセスメモリ間のデータ転送の問題を解決し、特定の外部デバイスを制御するハードウェアの一部である実際のRAPに変換されます。



1つのWUがRAPに従って動作し、2番目のWUが中断またはポーリングサイクル(MXドライバー、覚えている場合)に従って動作したときの画像(たとえば、DCK)がありました。 メモリがチップに統合されている最初のMCが登場したとき、チップ外部のDAPを使用したデバイスの作成は非常に簡単な作業になり、もちろんDAPはMC内に移行し、そのアーキテクチャの一部になりました。 このプロセスはプログレッシブでは線形ではなく、DAPのサポートに基づく51アーキテクチャと、豊富なペリフェラルセットを備えたCortex-M3ベースのMCの両方にありますが、DAP(Stellarisなど)のサポートはありません。 それにもかかわらず、ARMベースの最新のMCの大部分にはSDAが存在するため、SDAの調査を進め、最初はその機能の検討に専念することができます。



前述のように、RAPの主な目的は、プロセッサーの関与を最小限に抑えて、異なるデバイス間でデータを転送することです。 原則として、これらのデバイスの1つはMKのメインメモリですが、2つの外部デバイス間で転送できる場合もあるため、メモリ間で転送することもできます。 一部のRAPはそのような機能をサポートしますが、サポートしないものもあり、MKを選択する際にはこれを考慮する必要があります。



次の重要な特性は、同時に処理される伝送チャネルの数です-もちろん、各時点でバス上で送信できるデータは1つだけですが、CPUリソースを最小限に抑えて、複数の要求を交互に処理できます。 当然、MAPチャネルの最小数は-1(少ないチャネルが動作する可能性は低い)、最大はほぼ無制限、実際の制限は外部デバイスの数+ 1(メモリ-メモリタイプリクエストの場合)ですが、何も(コストを除く)干渉することはありませんRAPの多数のチャネルを勝手に作成します。



次の機能は、1つのチャネルのリクエストサービスメカニズムと考えることができます。 この点についてさらに詳しく説明し、RAPの1つのチャネルの1つの要求の動作を一般的に分析します。



転送を行うには、データの転送元、送信元、転送するデータの量、転送モード(詳細は後述)、および場合によってはサービス情報など、意図をRAPに通知する必要があります。 この情報は、DAPの操作を担当するレジスタ(旧式の方法であり、後で説明します)またはシステムのRAMに配置できます。後者の場合、DAPが情報を取得する場所を知るために、特別に割り当てられたメモリ領域のいずれかにする必要がありますまたは、データがメインメモリのどこにあるかに関する情報(通常の言語では、リンクを配置する必要があります)は、RAPのレジスタに配置する必要があります。 次の利点があるため、後者の方法が使用されます。MKのメインメモリは貴重なリソースであり、決定論的なブロックに分割することはお勧めできません。



そのため、指定された転送が完了した後、転送の終了に関する信号を受信し(ほとんどの場合、割り込みの形で)、できるだけ早く次の転送を開始する必要があります。 レジスタに転送パラメータを設定すると、現在の転送が終了する前にパラメータを変更できないか、シャドウレジスタを実行できません。 レジスタに転送を定義するデータへのリンクが含まれている場合(TCB-Transfer Control Block-Transmission Control Unit-BUP)、次の転送のために事前に次の転送用にBUPを構成し、現在の転送の最後にRAPレジスタ内のリンクのみを変更できます。



実際には、主にMK機器の保存を目的としたさまざまな組み合わせスキームがあります-2つ以上のBUPが配置されているメモリ領域へのポインター、実行時に循環する、現在のBUPのサービスフィールド内の次のBUPへのポインター、BUPが含まれる場合の階層アクセス実際に実行されるBUPのシーケンスの指示など。



上記の場合、現在要求されているすべての送信の完了を示す特別なタグも必要になります。これはサービス情報に含まれます。 他のサービス情報の中でも、多くの場合、送信モード(送信データのビット深度、受信者と送信者のアドレスを変更するステップと方向、メモリ管理モジュールの情報など)を示すタグがあります。



次に、一般的なRAPの検討から、具体的な実装、つまりMilander 1986VE1T会社のMKの検討に移りましょう。



なぜ彼に? まあ、最初に、私は彼と一緒に仕事をし、2番目に、彼は能力の面で十分に豊富なMPDを持っています、そして3番目に、彼は豊富な機能を持っています(これはバグではなく、この機能はこのカテゴリからのものです) MKでの作業はエキサイティングなアクティビティであり、その後、有名なメーカーのアナログでの作業は簡単で簡単に思えます。



まず、朗報-PDPは32の独立したアクセスチャネルをサポートします-MKの一部としての外部デバイスごとに1つ、メモリとメモリの転送のために1つ。 さらに、前の文からすでに理解したように、PDPは可能なすべての転送モード、つまり、WUメモリレジスタ、WUレジスタ、WUレジスタ、メモリメモリをサポートします。そうではなく、異なるモードはわずかに異なる機能を持ち、常に実装されるとは限りません。



さらに、PDPはさまざまなデータ形式をサポートしています:1バイト、2バイト、4バイト(このアーキテクチャのワード)、およびソースとレシーバーの異なるタイプのアドレスインクリメント:1、2、4(デクリメントはサポートされていません)。 RAPには、サービスチャネルの調停システムがあり、各チャネルに柔軟な優先順位を割り当てて、構成可能な基本トランザクションサイズ(調停が実行される1つのチャネルの送信数)を割り当てることができます。 さらに、各チャネルには最大2つのMCUを搭載できます。これは、サイクリックシステムに置き換えたり、階層モードで動作したりすることができ、同時に単一モードも可能です。



バランスを保つために、あまり良くないことを言ってみましょう。 再びドキュメントについて-RAPがどのように機能するかわからない場合、会社のドキュメントからは間違いなくそれを知りません。 ドキュメントは明確に翻訳可能であり、意味を大きく歪める翻訳エラーがあり、非常に聞き取れないほど説明された場所もありますが、一般的に、著者の推測に慣れている場合、訓練された開発者にとっては十分です。 より重要な欠点(もちろん、理想的なデバイスと比較して)-かなりのバスリソースコスト(1回の転送につき6回のアクセスですが、何か誤解しているかもしれません)およびいくつかの機能については、少し後で説明します。



そして、ここで私たちは待っています:



開発者からの待ち伏せ#1-転送の終了による中断は外部デバイスには表示されません。 つまり、プログラムされたチャネルのいずれかからのトランザクションの終了時に1つの割り込みベクトルがあります。 さらに、トランザクションを完了したチャネルの番号が格納されるレジスタ、または少なくともフラグ付きのビットレジスタはありません。 つまり、送信を完了したチャネルの番号を判断する唯一の方法は、すべてのチャネルをソートして、TCBの対応するフィールドを調べることです。これは、割り込みハンドラで行う必要があります。これには最小限の時間がかかります。 明らかな解決策-チャネル検索を処理ドライバーの下半分に転送することは機能しません。



開発者からの待ち伏せ第2-中断の可能性があり、明示的にドロップせずに上半分の操作を停止することはできません。 また、もあります



それらから3番目を待ち伏せします-RAPを操作して割り込みをリセットすることはできませんが、外部デバイスのレジスタでクエリを生成する権限をリセットする必要があります。 はい、はい、そうです、RAPドライバーはサービス対象デバイスのレジスターの構成について何かを知っている必要があります。カプセル化の原則のより大きな違反を想像することは困難です(ハードウェア設計にも当てはまります)。 RAPの開発者たちが何を吸っていたのかは知りませんが、Gaydukが言うように、「非常に興味深いもの」です。 つまり、あなたはそれを信じないかもしれませんが、対応するチャネルからのリクエストの通過を禁止し、その処理を禁止した場合、とにかく中断をリセットしません。

予定よりも文字数が多いことがわかったので、特に金曜日の夜には、物語の主人公が自分自身を見つけるという困難な状況について読者に考えさせてください。



All Articles