Функция не работает, если не вызывается в том же файле
Поэтому я следую учебному пособию, но делаю это на 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" void blink () { gpio_setFunction (16, 1); gpio_setFor (16, 0, 0x3f0000, 1); gpu_makeDefaultBuffer (); gpu_fill (0xf8ff); // gpio_setFor (16, 0, 0x3f0000, 1); без знака int i = 0; while(1) { gpu_drawPixelBridge(i, 0, i); //gpu_fill(я); if(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("Привет, мир!"); 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); while(1) { // Материал } }
/*gpu.h*/ #ifndef H_GPUH #define H_GPUH #define CHARACTER_WIDTH 8 #define CHARACTER_HEIGHT 16 typedef struct { без знака int pwidth; без знака int pheight; без знака int vwidth; без знака int vheight; unsigned int pitch; без знака int глубина; без знака int x; без знака int y; пустота * буфер; беззнаковый размер int; } gpu_request __attribute__ ((выровнен (16))); int gpu_makeDefaultBuffer(); int gpu_makeBuffer(volatile gpu_request* req); int gpu_fill(беззнаковый короткий цвет); int gpu_drawPixelBridge(без знака int x, без знака int y, беззнаковый короткий цвет); int gpu_drawPixel(без знака int x, без знака int y, беззнаковый короткий цвет); int gpu_drawAsciiChar(unsigned char chr, неподписанный короткий фронт, неподписанный короткий зад, 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.pheight = 768; r.vwidth = 1366; r.vheight = 768; r.pitch = 0; Глубина = 16; rx = 0; ry = 0; r.buffer = 0; r.size = 0; gpu_makeBuffer(& г); } 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(resp) { //Fail gpio_errorHang(0, 2); возврат 2; } } int gpu_fill(беззнаковый короткий цвет) { /*unsigned int i = 0; while(i *(*_gpu_buffer).size* / 1366*768*2) { *(volatile unsigned short *)((*_gpu_buffer).buffer+i) = color; я +=2; }*/ int y = 0; while(y < 100) { y ++; int x = 0; while(x < 100) { x ++; gpu_drawPixel(x, y, color); } } } int gpu_drawPixel(без знака int x, без знака int y, беззнаковый короткий цвет) { unsigned int dest = (y * (*gpu_buffer).pitch) + x*2; *(volatile unsigned short *)((*gpu_buffer).buffer+dest) = цвет; } int gpu_drawPixelBridge(без знака int x, без знака int y, беззнаковый короткий цвет) { gpu_drawPixel(x, y, color); } 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); без знака int y = 0; while(y < 16) { unsigned int x = 0; while(x < 8) { if((*(unsigned char*)base >> x) & 0b1) { gpu_drawPixel(ox+x, oy+y, front); }else{ gpu_drawPixel(ox+x, oy+y, back); } x ++; } y ++; база ++; }}
(Проверка была удалена как для тестирования, так и для краткости в этом посте)
Ладно, настолько непоследовательными и "дурацкими" были бы слова, которые я бы использовал для описания того, как это работает. На данный момент, я думаю, что по крайней мере одна проблема вызывает вызов drawPixel из чего-либо, кроме файла, в котором он находится. Вызов drawPixelBridge из blink.c работает, как и drawAsciiCharacter, но вызов drawPixel напрямую из blink.c, похоже, не работает и (возможно,) вызывая любую будущую попытку нарисовать что-нибудь неудачное
Я полагаю, я должен объяснить, как работает рисунок. Как правило, gpu_makeBuffer отправляет "почту" в GPU с указателем на структуру gpu_request. Затем графический процессор отвечает на это, устанавливая свойство "buffer" этой структуры в виде указателя на последовательность байтов, которая будет отображаться на экране. Учитывая, что материал отображается на экране в нужном месте (хотя размер и высота тона не соответствуют моим ожиданиям), я предполагаю, что это работает.