2012-01-13 11 views
3

いつでも変更可能なハードウェア・レジスタのセットにマップされた構造体があります。揮発性ポインタからハードウェア・レジスタをダンプする

例えば、

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(&register_history[0], regs, sizeof(registers_t)); 

明示的に個々のレジスタをデバウンスし、保存せずにメモリにレジスタをコピーする方法はありますか?

ありがとうございました。

編集:

私は、私が掲示した後、8時間まで、私の質問に答えるために質問を十分評判を持っていないので、私は今のところ、ここで答えを投稿します:

私がいることを知っているので私はデータをキャプチャしようとしているときにレジスタは変更されません、私はvoid *にADDR_OF_REGSをキャストし、memcpyを使用することができます。

例えば、コンパイルドメイン間構造を用い

memcpy(&register_history[0], (void *)ADDR_OF_REGS, sizeof(registers_t)); 
+0

memcopy(memcpy(register_history [0]、(void *)ADDR_OF_REGS、sizeof(registers_t))を使用して、アドレスから直接memcopyすることができると思います...しかし、意図した動作をガラージュしません。 – theShingles

+0

「意図した動作を保証する」とはどういう意味ですか?レジスタは何を表しますか(たとえば、I/O、割り込みなど)? –

+0

はいこれは組み込みシステムであり、レジスタはI/O、割り込み、ステータスなどを表します。レジスタはいつでも変更できます(私はデバウンスが必要かもしれないと思っていました)が、私はレジスタが変更されないことを知っておく必要があります。したがって、memcpyを使用することは有効です。 – theShingles

答えて

0

は危険なビジネスです。メモリ/レジスタを指し示すものなどは、 "コンパイルドメイン"です。

第2に、memcpyはレジスタを順番に読み込んで順次コピーします。構造体とmemcpyでこれを行おうとすると魔法はありません。例えば、これらが32ビットのレジスタで、整列されていれば、memcpyよりもうまくいくかもしれません....あなた自身でやってください。

例えば8つの32ビット・レジスタをコピーする:

myregcopy(base_add_of_registers,base_add_of_destination_ram); 

のmemcpyと

.globl myregcopy 
myregcopy: 
    push {r4,r5} 
    ldmia r0!,{r2-r5} 
    stmia r1!,{r2-r5} 
    ldmia r0!,{r2-r5} 
    stmia r1!,{r2-r5} 
    pop {r4,r5} 
    bx lr 

コールは、再度シフトその後クルーズは、多くの場合、命令ごとに4つの言葉を使用して単語にハーフワードのバイトからギアをシフト(必要に応じて、しかし、チェックコードがあるので)停止する前にハーフワードとバイトに下ろしてください。そうすれば、memcpyを実行し、これらのコンパイラの問題に対処する必要はありません。

ハードウェア担当者に確認する必要があります.4ワードのldmまたはstmまたはldrd/strdを使用すると、コアに64ビットバスがある場合、32ビットトランザクションではなく64ビットのトランザクションが発生します。レジスタハードウェアが、レジスタが64ビットトランザクションでペアでアクセス可能であると述べていない場合は、2つのレジスタのうちの1つをデコードし、バス上では32ビットのガベージを取得するだけです。したがって、これが32ビットバスまたは64ビットバスのコアであるかどうか、およびI/Oハードウェアまたはキャプチャしているものがトランザクションを適切に処理するかどうかを知る必要があります。それはこのようなものにコードを変更するdoesntの場合:

.globl wordcopy 
wordcopy: 
    ldr r3,[r0],#4 
    str r3,[r0],#4 
    subs r2,r2,#1 
    bne wordcopy 
    bx lr 

必ずしも速いmemcpyをより

wordcopy(regbase,destmembase,numregs); 

と呼ばれるこの機能を使用する必要がある場合は、より速く、同じか、少し遅くなるかもしれませんあなたが32ビットレジスタに対して64ビットレジスタの読み込みを処理できないので、速度比較がないようにmempcyを使用することはできません。

レジスタが変更されないと仮定しても、あなたはまだ責任を負いません。これはまた、あなたがいくつかの追加の対策を講じない限り、このコピーがどれくらいの時間を取るかという手がかりがないので、危険な前提です。それでもコピー時間は変わる可能性があります。

関連する問題