1

我必须编写一个低级驱动程序来管理嵌入式设备的 tft 显示。器件由 PIC24、64K ram 和大约 128K 程序存储器供电。

我的意图是编写一个通用图形库,我将在其中放置所有原始图形函数和驱动程序以发送命令和数据以进行显示。

图形库使用驱动程序来访问显示,但显示技术可以改变,因此驱动程序必须易于重新实现。

在这种情况下编写可重用代码的最佳方法是什么?

 -----------------          ---------------       
|                 |        |               |
|                 |        |               |
|    GFX_LIB      | =====> |    DRIVER     | ====> DISPLAY
|                 |        |               |
|                 |        |               |
 -----------------          -----/----\----
                                /      \
                               /        \
                         ----------   ----------
                        |          | |          |
                        | TYPE A   | |  TYPE B  |
                        |          | |          |
                         ----------   ----------

更多细节

这是我的 gfx lib 的一段代码

#include "Graphics.h"

void gfx_Init(uint16_t width, uint16_t height, uint8_t rotation){
    gfx_displayWidth=width;
    gfx_displayHeight=height;
    gfx_rotation=rotation;  
    displayDriverInit();
}

void gfx_setPixel(uint16_t x, uint16_t y, uint32_t color){
    displayDriverSendCommand(CHANGE_COORDINATE);
    displayDriverSendData(x);
    displayDriverSendData(y);
    displayDriverSendCommand(SET_COLOR);
    displayDriverSendData(color);
}

这是我的图形库的假设实现。

现在,如果我更改驱动程序,如果我可以重用我的 gfx 库,并且只重写显示驱动程序例程,我真的很高兴。实现这一目标的最佳方法是什么?

谢谢你。

4

4 回答 4

1

为什么要重新发明轮子?使用GD 图形库在显示器的图像缓冲区中创建图像。或者在显示器的图像缓冲区之外创建一个图像,然后在完成渲染后复制像素数据。

请注意,GD 通常用于创建图像文件(然后由浏览器下载),但渲染代码是独立的。

于 2012-06-30T20:16:50.310 回答
1

这在一定程度上取决于您的驱动程序将提供什么功能。

一个最小的 API 可以这样声明:

typedef void* gfx;
typedef struct init_options {
  int display_width, display_height;
  //..etc..
};

gfx* gfx_init( init_options* opts );
void gfx_free( gfx* gfx );

// blit something onto sceeen
void gfx_blit( gfx* gfx, void* buffer, int buf_w, int buf_h, int trg_x, int trg_y, int trg_w, int trg_h );

// if you have double buffering (probably a good idea)
void gfx_swap( gfx* gfx );

初始化、关闭、模式切换和在屏幕上显示像素可能是您所需要的。也许您还应该提供一个快速的 SetPixel() 例程。基于此,其他一切都可以在某种“GfxUtil”库中实现。

此 API 的驱动程序选择和实现可以通过链接正确的库来处理(其中每个库都包含一个实际的驱动程序,包含用于 blitting 的实际代码等)。

编辑

要拥有一些可动态替换的代码,您的驱​​动程序可以是一个结构,其中包含指向驱动程序特定代码的实际实现的函数指针:

// common driver struct, used by gfx api
typedef struct driver {
    void (*init)( driver *driver, init_options* );
    void (*setpixel)( driver *driver, int x, int y, color color );
    //...
};

// driver constructor
driver* create_foo_driver() {
    driver* d = malloc( sizeof(driver) );
    memset(d,0,sizeof(driver));
    d->init = foo_init;
    d->setpixel = foo_setpixel;
    return d;
}

// some driver-specific code ...
void foo_setpixel( driver *driver, int x, int y, color color ) {
    // actual implementation
}

// API code calling driver code
void gfx_setpixel( gfx* gfx, int x, int y, color color ) {
   driver* driver = ((gfx_impl)gfx)->driver; // .. just an example
   driver->setpixel( driver, x, y, color );
}
于 2012-06-30T20:43:21.277 回答
0

根据您在平台上可以节省多少内存,您可以使用Cairo,它的结构与您在 ASCII 艺术中绘制的完全一样。它也在 C 中实现。

于 2012-06-30T20:16:37.840 回答
0

任何在这里用谷歌搜索的人都应该看看Adafruit 的 GFX 库,然后看看他们的特定图形驱动程序库是如何实现它的。我的经验特别是他们的ST7735 驱动程序(我移植到在chipKIT 的PIC32上工作,现在正在从经验丰富的chipKIT 开发人员那里获得帮助)。特定硬件驱动程序可以实现的 C++/OOP 图形框架的完美示例。

我很惊讶这个问题并没有像其他“我怎么能完成这个”类型的问题一样被关闭。

于 2013-09-06T08:19:49.953 回答