2

私は小さなロボットである実行可能ファイルを持っています。これは行をたどることになっています。私の仕事は、コマンドを実行する C コードを作成することです。ここでの問題は、ロボット プログラム自体からデータを取得して送り返すことです。

命令は 8 ビットのバイナリ コードでソフトウェアに渡され、データを処理するためにこれら 2 つの構造が用意されています。

typedef struct
{
    unsigned speed:4;
    unsigned inv_right_wheel:1;
    unsigned right_wheel:1;
    unsigned inv_left_wheel:1;
    unsigned left_wheel:1;
} INPUT;

typedef struct
{
    unsigned char unused:2;
    unsigned char capt_left:1;
    unsigned char capt_right:1;
    unsigned char cont_back_right:1;
    unsigned char cont_front_right:1;
    unsigned char cont_back_left:1;
    unsigned char cont_front_left:1;
} OUTPUT;

バイナリコードのアドレスがどこにあるかを見つけるために、私はこのような小さな関数REGISTER(0xE001)(その型は a static volatile unsigned char * REGISTER(unsigned short address)) を持っています。

私のメインは次のようになります。

int main() { 
    OUTPUT  *out;
    INPUT   *in;

    out = REGISTER(0xE001);


    printf("%d", out.capt_left);
    return EXIT_SUCCESS;

}

4

1 に答える 1

2

埋め込まれた楽しみ。ロボットがあなたに返信したい場合は、ある種の API またはロボットが使用する登録が必要です。現在、システム レジスタ 0xE001 は、出力について通知している場所です。このレジスタが読み取り/書き込み可能な場合、次のことができます。

out->capt_left = 1;

INPUT を介して通信する場合 (そう考えるのは論理的です)、INPUT レジスタが存在する場所を見つける必要があります。これは、ドキュメントのどこかにあります。そしてあなたはするでしょう:

in = (REGISTER(0xE000));   // Guessing on Register location.
in->speed = 1;
...

これにより、どこから始めるべきかがわかりますか? ところで、次のように、一度にバイト全体を入力に書き込みたい可能性が高いです。

INPUT buffer;

buffer.speed = 1;
buffer.inv_right_wheel = 0;
...

*in = buffer;

あるいは:

*(REGISTER(INPUT_REGISTER)) = 0x4F;  // Speed to 4, all other bits set true - maybe depending on bitfield order!

お役に立てれば!

于 2013-05-29T18:16:28.890 に答える