だから私はチュートリアルに従っていますが、アセンブリがあまりにも扱いにくいのでCでやっています。これは私がCで行った最初の「実際のプロジェクト」であるため、これはばかげた間違いか、Cがどのように機能するかの微妙な違いのいずれかです。
とにかく、私はこのコードを持っています:
/*blink.c*/ #include "gpio.h" #include "timer.h" #include "morse.h" #include "util.h" #include "mailbox.h" #include "gpu.h" #include "text.h" ボイドブリンク() { gpio_setFunction(16, 1); gpio_setFor(16, 0, 0x3f0000, 1); gpu_makeDefaultBuffer(); gpu_fill(0xf8ff); //gpio_setFor(16, 0, 0x3f0000, 1); 符号なし整数 i = 0; ながら(1) { gpu_drawPixelBridge(i, 0, i); //gpu_fill(i); もし (私 >= 0xffff) { 壊す; } 私は++; } //gpu_drawPixel(0, 0, 0x0000); gpu_drawAsciiChar(0x0, 0xffff, 0x0000, 50, 10); gpu_drawAsciiChar(0x0, 0b0011111, 0b00000011, 0, 50); //gpu_drawPixel(50, 50, 0x0000); gpu_drawAsciiChar(0x0, 0b0011111, 0b00000011, 0, 0); print("Hello World!"); gpu_drawPixelBridge(10, 10, 0xffff); gpu_drawPixel(100, 100, 0x0008); gpu_drawPixelBridge(101, 101, 0x000f); gpu_drawPixelBridge(102, 102, 0x0080); gpio_setFor(16, 0, 0x1f0000, 1); ながら(1) { // もの } }
/*gpu.h*/ #ifndef H_GPUH #H_GPUH を定義 #定義CHARACTER_WIDTH 8 #定義CHARACTER_HEIGHT 16 typedef 構造体 { unsigned int pwidth; unsigned int ファイト; unsigned int vwidth; unsigned int vheight; unsigned int ピッチ。 unsigned int 深さ; unsigned int x; unsigned int y; void* バッファ; unsigned int サイズ。 } gpu_request __attribute__ ((整列 (16))); int gpu_makeDefaultBuffer(); int gpu_makeBuffer(volatile gpu_request* req); int gpu_fill(unsigned short color); int gpu_drawPixelBridge(unsigned int x, unsigned int y, unsigned short color); int gpu_drawPixel(unsigned int x, unsigned int y, unsigned short color); int gpu_drawAsciiChar(unsigned char chr, unsigned short front, unsigned short back, unsigned int ox, unsigned int oy); #endif
/*gpu.c*/ #include "gpu.h" #include "mailbox.h" volatile gpu_request* gpu_buffer = 0; const unsigned char gpu_font[]; int gpu_makeDefaultBuffer() { volatile gpu_request r; r.pwidth = 1366; r.feight = 768; r.vwidth = 1366; r.vheight = 768; r.ピッチ= 0; r.深さ = 16; rx = 0; ry = 0; r.buffer = 0; r.size = 0; gpu_makeBuffer(&r); } int gpu_makeBuffer(volatile gpu_request* req) { gpu_buffer = req; if(mail_write((unsigned int)req+0x40000000, 1) < 0) { //書き込み失敗 gpio_errorHang(0, 1); 1 を返します。 } unsigned int resp = mail_read(1); if(応答) { //失敗 gpio_errorHang(0, 2); 2 を返します。 } } int gpu_fill(unsigned short color) { /* unsigned int i = 0; while(i < /*(*_gpu_buffer).size* / 1366*768*2) { *(volatile unsigned short *)((*_gpu_buffer).buffer+i) = color; i +=2; }*/ int y = 0; while(y < 100) { y ++; 整数 x = 0; while(x < 100) { ×++; gpu_drawPixel(x, y, 色); } } } int gpu_drawPixel(unsigned int x, unsigned int y, unsigned short color) { unsigned int dest = (y * (*gpu_buffer).pitch) + x*2; *(volatile unsigned short *)((*gpu_buffer).buffer+dest) = color; } int gpu_drawPixelBridge(unsigned int x, unsigned int y, unsigned short color) { gpu_drawPixel(x, y, 色); } int gpu_drawAsciiChar(unsigned char chr, unsigned short front, unsigned short back, unsigned int ox, unsigned int oy) { unsigned int base = (chr*16)+((int)&gpu_font); unsigned int y = 0; while(y < 16) { 符号なし int x = 0; while(x < 8) { if(((*(unsigned char*)base >> x) & 0b1) { gpu_drawPixel(ox+x, oy+y, フロント); }そうしないと{ gpu_drawPixel(ox+x, oy+y, back); } ×++; } y ++; ベース++; } }
(この投稿では、テストと簡潔さの両方のために検証を削除しました)
さて、それがどのように機能するかを説明するために私が使用したであろう言葉は、一貫性がなく「風変わり」です。現時点では、少なくとも 1 つの問題は、drawPixel が入っているファイル以外から drawPixel を呼び出すことだと思います。blink.c から drawPixelBridge を呼び出すと、drawAsciiCharacter と同様に機能しますが、blink.c から直接 drawPixel を呼び出すと、両方とも機能しないようです (おそらく) 今後何かを描画しようとすると失敗します。
描画がどのように機能するかを説明する必要があると思います。通常、gpu_makeBuffer は、gpu_request 構造体へのポインターを含む「メール」を GPU に送信します。次に、GPU は、その構造体の「buffer」プロパティを、画面に描画される一連のバイトへのポインターに設定することによって、これに応答します。画面の適切な場所に物が表示されることを考えると (サイズとピッチは私が期待するものではありませんが)、これでうまくいくと思います。