2

マイクロコントローラーの C ヘッダー ファイルをいくつかめくっていますが、レジスタ アドレスが vint として初期化されているのを確認し続けています。これまでこのデータ型に出会ったことがないので、少し検索しましたが、実際の結果はありませんでした。私が得た最も近いものはhttps://stackoverflow.com/a/12855989からのもので、 v は「揮発性」を表していることがわかります。したがって、ハードウェアレジスタアドレスを保持する揮発性の符号なし整数があります。のように、「このアドレスは変更される可能性があります」と明示的に示すデータ型があります。これは、ハードワイヤードで変更できないレジスタを表しています。私の vint の理解は間違っていますか? そうでない場合、なぜこのようにアドレスを表すのでしょうか?

4

2 に答える 2

5

メモリにマップされたレジスタは、コンパイラが認識していない外部の理由 (ハードウェア割り込みなど) によって値が変更される可能性があるため、揮発性として設定されます。これは、コンパイラが特定の最適化を回避し、アドレスへの読み取りが実際に行われることを保証する必要があることを意味します (キャッシュされた値などに対して最適化されるのではなく...)。

簡単な例として、いくつかのフラグを含むメモリ マップド レジスタがあります。

read flags
set bit in flags
interrupt sets another bit
<compiler optimizes and cached flags from before>
read flags <contains incorrect cached value>
于 2013-09-16T18:21:01.327 に答える
2

タイプを誤解していると思います。ほとんどの場合、揮発性の符号なし整数へのポインターであり、符号なし整数が揮発性でポインターではないことを示します。これは、構造体を介してハードウェア レジスタを記述する場合に一般的です。各構造体メンバーは揮発性の符号なし整数であり、メモリ マップ内のレジスタの開始位置を示すベース アドレスがどこかに定義されます。

于 2013-09-16T18:49:56.770 に答える