問題タブ [memory-mapped-io]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - メモリ マップド IO レジスタの読み取り方法 (データシートから) と mmap での使用
私はインテルシステムを持っていEthernet controller: Intel Corporation 82579LM Gigabit Network Connection (Lewisville) (rev 04)
ます。のデータシートのようなデータシートをダウンロードしましたIntel ® 82579 Gigabit Ethernet PHY
今、私は次のようなpciイーサネットデバイスのresource0を読んでいます
x86-64 ビット システムを使用しています。カリ Linux 5.7。だから私は Register_Values_From_Datasheet
上記のようにデータシートからのレジスタオフセット値で置き換えています0x00008
for STATUS:Device Status Register
=from datasheet
しかし、mmap() の errno は、22:EINVAL
mmap 呼び出し後に値を持っています。無効な引数を意味します。データシートから読み取っているオフセット値は、別の方法で解釈する必要があるかもしれません。
イーサネットデバイスの sys/bus/pci/devices/0000:00:19.0 にある私のリソースファイルは次のようなものです
上記のリソース テキスト ファイル (resource0) のダンプから、メモリ マップド IO が 0x00000000fe400000 から始まることがわかります。だから私は mmap (return (void*)=&0x00000000fe400000)= の戻りアドレスであるべきだと思いますが、私は次のようなものを取得してい0xffffffff
ます.errnoは22です。オフセットをどのように解釈する必要があるかについて、正しい方向に私を導くことができますかデータシートから。また、pci イーサネット デバイスのパケットを取得するために、通常どのレジスタにアクセスする必要がありますか。私はデバイスプログラミングが初めてなので。
c++ - ハードウェア メンバ以外のメモリ マップド C++ オブジェクト
C++ を使用してメモリ マップド ハードウェアのドライバーを開発しており、このデバイスを表すクラスを定義しました。次のようになります。
このクラスには、device.cpp と device.h の 2 つのファイルがあります。メンバー変数は、デバイス自体の実際のレジスタを表します。デバイス自体の実際のレジスタではないメンバーをさらに定義したいのですが、クラス内で定義することはできません。そうすると、デバイスのメモリマップされた場所で定義され、他のデバイス/レジスタが含まれる可能性があるためです。 . それらをパブリックとして定義すると、標準のレイアウトが壊れ、クラスが機能しなくなります。
だから私がしたことは、それらをクラス定義の外でグローバル変数として定義したことです。問題は、複数のオブジェクトを定義すると、それらはすべてこれらのグローバル変数を共有することですが、各オブジェクトに独自の変数を持たせたいのですが、どうすればよいですか?
java - メモリ マップト ファイルが大きくなりすぎないようにする
メモリ マップド IO を使用して、私の 2 つのアプリケーション間の通信を確立したいと考えています (主に、ソケットがネットワーク上の他のコンピューターにリークする傾向があるという問題を回避するため)。ただし、私が懸念している問題の 1 つはストレージ容量です。ファイルにコマンドを書き続けると、そのファイルは大きくなるだけです。確かに、ほとんどのコマンドは短く、一定の実行時間が問題になるまでに数日かかりますが、それでも避けたいと思います。受信者アプリケーションが既に読んだ「古い」メッセージのファイルを定期的にクリアして、ディスク ストレージ スペースを再利用する良い方法はありますか?
c - SDCC の特定のメモリ位置に変数を配置する方法
低レベルのプログラミングでは、特定のメモリ位置で、これが私のアドレスであると言う必要がある場合があります。この投稿では、例としてPIR1
PIC16F886 および関連するマイクロコントローラーのレジスターを取り上げます。常にアドレス 0x000C にあります。
私はこのアプローチを取りました:
これで、変数に次のようなものを割り当てることができますpir1 |= 0x40
(わかりました、マジック ナンバーの代わりに #defined 定数を使用しますが、あなたは私のドリフトを取得します)。これは GCC で問題なくコンパイルされ、使用しても警告は表示されません-Wextra -Wall
。私の仮定を確認するために、GCC は次の x86_64 を吐き出します。
まさに私が望んでいたものです(わかりました、なぜそれが時々あるのかがわかりました。それはおそらくさらに別の愚かなx86の癖ですが、とにかくPIC14コードが欲しいので無関係ですeax
)rax
さて、PIC14 をターゲットにするために、実際に SDCC コンパイラを使用しています。私はこのようにそれを呼び出しています
で始まる上記のコードで#define
は、次の警告が表示されます。
私は代わりにこれをやってみました:
しかし、それはエラーメッセージになります
課題を出そうとしたとき。
だから私の質問は、Cでこれを行う慣用的な方法が欠けているかどうかです? SDCC が警告しているのはなぜですか? ここで無視している特定の SDCC 固有のファンクはありますか?