5

画面に描画するRaspberry Pi用の小さなベアメタルプログラムがあります。私は C を使用しており、GCC をコンパイラとして使用し、Yagarto を ARM ツール チェーンとして使用しています。

現在、GPUが読み取るフレームバッファ構造を宣言するヘッダー(gpu.h)があります(解像度とビット深度が含まれています)。GPU は、描画先のポインターを含め、構造体に値を入力します。

struct frame_buffer {
    int width;
    int height;
    int vwidth;
    int vheight;
    int bytes;
    int depth;
    int ignorex;
    int ignorey;
    int pointer;
    int size;
};
extern struct frame_buffer framebuf;

構造体は (関数内ではなく) main.c で定義されます。

struct frame_buffer framebuf __attribute__ ((aligned (16))) = {GPU_HRES, GPU_VRES, GPU_HRES, GPU_VRES, 0, GPU_BITDEPTH, 0, 0, 0, 0};

また、main.c には、画面に文字を描画する関数 (draw_char) と、draw_char 関数を使用する putchar() の独自の実装があります。現在、これは正常に機能しています。

draw_char 関数を別のファイルに移動すると、すべて正常にコンパイルされますが、画面には何も描画されません。

構造体がグローバルに利用できないと思うので、ポインタが正しくありません。

これを修正するために何をすべきかについてのアイデアはありますか?

ありがとうございました

4

1 に答える 1

0

問題を実際に解決するのに十分な情報を提供していませんが、上記のコメントは正しい可能性が非常に高く、データ構造が異なるか、関数が異なります。過去に同様の問題で私を助けた理由を見つける方法をいくつか提案することしかできません。

1) objdump(gcc ツールチェーン) または同様のツールを使用して、オブジェクト ファイルが必要なものとエクスポートするものを確認します。各関数と構造体は、1 つのオブジェクト ファイルにのみ存在する必要があります (また、他のオブジェクト ファイルからインポートする必要があります)。

2) 同名のライブラリ関数がリンク段階で取られるかどうかを確認します (名前putchar()はここでは非常に危険です)。C リンカは引数を検証しません (C++ リンカとは異なります)。リンカーが最初にオブジェクトを取得し、後でライブラリを取得するようにしてください。ほとんどのコンパイラ/リンカーでは、引数の順序が重要です。

3) ファイルとヘッダーで変数の名前を個別に変更し、コードがまだコンパイルされるかどうかを確認します。変更されていないファイルはコンパイルされません。

4) 関数と変数のアドレスを示すデバッグ ステートメントを追加します。変数のアドレスは、ソフトウェアの実行中は常に同じである必要があります (表示関数の横にデバッグ テキストを出力する別の可能性があると思います)。

5) ポインターが取得されたと言います - コード全体で実際に同じであることを確認し、値が上書きされないことを確認します。

申し訳ありませんが、これ以上のアイデアはありません。

于 2013-01-06T22:05:04.900 に答える