いつでも変更可能なハードウェア・レジスタのセットにマップされた構造体があります。揮発性ポインタからハードウェア・レジスタをダンプする
例えば、
typedef struct
{
int register1;
char register2;
... (varying sizes, etc) ...
int registerX;
} registers_t;
そして私は、
などのベースに揮発性のポインタとして
#define regs (* (volatile registers_t *) ADDR_OF_REGS)
をREGSを定義しています私がREGSをダンプしようとしています特定の時間を計算し、レジスタの履歴を格納する配列に保存します。
例えば、
registers_t register_history[5];
私はmemcpyのは/それは未定義の動作ですので、揮発性が* * CONSTにキャストすることができないであろうことはできないことを理解しています。
例えば、私は次のような何かをしようとしている:
memcpy(®ister_history[0], regs, sizeof(registers_t));
明示的に個々のレジスタをデバウンスし、保存せずにメモリにレジスタをコピーする方法はありますか?
ありがとうございました。
編集:
私は、私が掲示した後、8時間まで、私の質問に答えるために質問を十分評判を持っていないので、私は今のところ、ここで答えを投稿します:
私がいることを知っているので私はデータをキャプチャしようとしているときにレジスタは変更されません、私はvoid *にADDR_OF_REGSをキャストし、memcpyを使用することができます。
例えば、コンパイルドメイン間構造を用い
memcpy(®ister_history[0], (void *)ADDR_OF_REGS, sizeof(registers_t));
memcopy(memcpy(register_history [0]、(void *)ADDR_OF_REGS、sizeof(registers_t))を使用して、アドレスから直接memcopyすることができると思います...しかし、意図した動作をガラージュしません。 – theShingles
「意図した動作を保証する」とはどういう意味ですか?レジスタは何を表しますか(たとえば、I/O、割り込みなど)? –
はいこれは組み込みシステムであり、レジスタはI/O、割り込み、ステータスなどを表します。レジスタはいつでも変更できます(私はデバウンスが必要かもしれないと思っていました)が、私はレジスタが変更されないことを知っておく必要があります。したがって、memcpyを使用することは有効です。 – theShingles