1

わからないコードがありますが、その動作を簡単に説明していただければ幸いです。

最初のビットは型キャストについてです。次のコードを正しく読んでいるかどうか誰かに教えてもらえますか?

#define A_TIME          0xC0500000
#define B_TIME           *(UINT_8 *)(A_TIME + 0x00002909)

この出力は、B_TIMEが8ビットの符号なし整数= 0x09へのポインターであるということですか?型キャストがどのように機能するかわかりませんか?8 LSBをB_TIMEに割り当てますか?また、私は*(UINT_8 *)に混乱していますか?これは正確にはどういう意味ですか?これは、8ビットの符号なし整数へのポインタですか?

上記を知ったら、2番目の部分はおそらく私には明らかですが、とにかく投稿します:

UINT_8  Timer = 0;
Input_Time (&Timer);



#define C_TIME                 *(UINT_16 *)0xC0C0B000
#define MASK                        0x003F

void Input_Time (UINT_8 *Time)
{
    *Time = 0xC0;  
    *Time |= (UINT_8)((C_TIME >> 4) & MASK);

    return;
}

Input_Time関数に続く*Timeの値は何ですか?誰かがコードをステップスルーして、各ステップを説明してもらえますか?

質問の初心者(それは一言ですか?!)についてお詫びします。

とても有難い。ジェームズ

編集:

OK、上記に満足しています。ありがとう。Input_Time()が呼び出された後、コード内で発生する次のことについて混乱しています。

#define OUT_TIME *(UINT_8 *)0xC0411297
OUT_TIME = Timer;

これはどのように可能ですか?OUT_TIMEアドレス0XC0411297内の8ビット値ではありませんか?それはどのように機能しますか?

4

2 に答える 2

2

あなたが見ているコードは、メモリにマップされたレジスタにアクセスしているように見えます。

  1. B_TIME は、アドレスに指定されたオフセットを加えた場所にある 8 ビット レジスタにアクセスします。A_TIMEこの場合、つまり0xC0502909. 実際に何が読み取られるかは、使用しているハードウェアによって異なります。何が起こるかを分解してみましょう。 B_TIMEは、どこで使用されても、次のテキストに置き換えられます。

    *(UINT_8 *)(A_TIME + 0x00002909)
    

    次に、A_TIMEが に置き換えられ0xC0500000、次の結果が得られます。

    *(UINT_8 *)(0xC0500000 + 0x00002909)
    

    算術演算を少し行うと、次のようになります。

    *(UINT_8 *)(0xC0502909)
    

    これは、「0xC05029098ビット値へのポインターとして扱い、それを逆参照する」ことを意味します。

  2. 2 番目の質問は同じ動作に従います。が呼び出された0xC0C0B000ときに読み取られるマップされたレジスタがあります。Input_Time()そのアドレスから 16 ビット値が読み取られ、4 だけシフトダウンされてからマスクされます。この例の 16 ビット値を想定すると、文字を使用してビットを一意に表します。

    abcdefghijklmnop
    

    4 シフトダウン:

    0000abcdefghijkl
    

    そして、マスク ( 3f16 進数は00111111バイナリ) が適用されます。

    0000000000ghijkl
    

    次に、その結​​果が0xc0( 11000000binary) と ORed され、次の結果が得られます。

    0000000011ghijkl
    

    その値は 8 ビットの pass-in-byte に格納され、次の値が返されます。

    11ghijkl
    

    発信者へ。

  3. あなたの新しい例:

    #define OUT_TIME *(UINT_8 *)0xC0411297
    OUT_TIME = Timer;
    

    そのメモリアドレスに値を書き込んでいます。

于 2013-02-26T18:13:22.200 に答える
0

の値B_TIMEはタイプの値ですUINT8

#define B_TIME *(UINT_8 *)(A_TIME + 0x00002909)

演算子は、次の式で*ポインタを逆参照します。UINT8

(UINT_8 *)(A_TIME + 0x00002909)

上記の式では、整数定数式はキャストの平均によってA_TIME + 0x00002909へのポインタに変換されます。UINT8(UINT8 *)

于 2013-02-26T18:07:16.150 に答える