53

組み込みシステム用のソフトウェアを書いています。

FPGA デバイスのレジスタにアクセスするためにポインタを使用しています。
一部のレジスタは読み取り専用で、その他は書き込み専用です。

書き込み専用レジスタは、読み取り時に未定義の値を生成します。

コンパイラーが書き込み専用レジスターから値を読み取るとき (別名逆参照) を検出できるようにするポインター型を定義したいと考えています。

C言語の構文のみを使用して書き込み専用ポインターを作成できますか?
(最初のプロトタイプは C を使用して開発していますが、第 2 世代では C++ に移行しています。)

C++で効率的な書き込み専用ポインターを作成するにはどうすればよいですか? (これは動的メモリ内のアイテムの追跡ではなく、ハードウェア アドレスへのアクセスであることを思い出してください。)

このコードは、安全性と品質が最も重要な組み込みシステムで使用されます。

4

6 に答える 6

8

私は多くのハードウェアを扱ってきましたが、そのうちのいくつかは「読み取り専用」または「書き込み専用」のレジスター (または、レジスターへの読み取りまたは書き込みによって異なる機能を備えているため、誰かがそうすることに決めたときに楽しいものになります) reg |= 4;" あるべき値を記憶する代わりに、ビット 2 を設定し、新しい値を書き込む必要があります。読み取れないレジスタからランダムなビットが現れたり消えたりするハードウェアをデバッグしようとするようなものはありません! ; ) 書き込み専用レジスタからの読み取り、または読み取り専用レジスタへの書き込みを実際にブロックする試みはこれまで見たことがありません。

ところで、「書き込み専用」のレジスタを持つことは本当に悪い考えだと言いましたか? ソフトウェアがレジスタを正しく設定したかどうかを確認するために読み返すことができないため、デバッグが非常に難しくなります - そしてドライバを書く人々 2 行の VHDL または Verilog コードで本当に簡単にできる難しい問題をデバッグするのは好きではありません。

レジスタのレイアウトをある程度制御できる場合は、「読み取り専用」レジスタを 4KB で整列されたアドレスに配置し、「書き込み専用」レジスタを別の 4KB で整列されたアドレスに配置することをお勧めします [4KB 以上でも問題ありません]。次に、ハードウェアのメモリ コントローラをプログラムして、アクセスを防止できます。

または、読み取りが想定されていないレジスタが読み取られている場合、または書き込みが想定されていないレジスタが書き込まれている場合は、ハードウェアに割り込みを生成させます。ハードウェアは他の目的で割り込みを生成すると思いますか?

さまざまな C++ ソリューションを使用して行われた他の提案は問題ありませんが、レジスタを直接使用することを意図している人を実際に止めることはありません。ハードウェアの誤用から保護するためのハードウェア。

于 2013-04-17T01:11:22.753 に答える
7

C では、不完全な型へのポインターを使用して、すべての逆参照を防ぐことができます。


/* writeonly.h */
typedef struct writeonly *wo_ptr_t;

/* writeonly.c */
#include "writeonly.h"

struct writeonly {
  int value 
};

/*...*/

   FOO_REGISTER->value = 42;

/* someother.c */
#include "writeonly.h"

/*...*/

   int x = FOO_REGISTER->value; /* error: deref'ing pointer to incomplete type */

のみwriteonly.c、または一般的に定義を持つすべてのコードはstruct writeonly、ポインターを逆参照できます。もちろん、そのコードも誤って値を読み取る可能性がありますが、少なくとも他のすべてのコードは、ポインターをすべて一緒に逆参照することはできませんが、それらのポインターを渡したり、変数、配列、および構造体に格納したりできます。

writeonly.[ch]値を書き込むための関数を提供できます。

于 2013-04-17T05:46:46.390 に答える