0

我的嵌入式 ARM 设备有一个 800x480 16 位 Linux 帧缓冲 LCD,需要手动进行双缓冲。目前我只是memcpy()用来将双缓冲区写入帧缓冲区,这非常慢。循环以 100%的while(1){memcpy(lfb,dbuf)}速度最大化 CPU 并以大约 40 FPS 的速度更新。

我正在使用的 ARM 设备和 Linux 内核确实支持 DMA 内存-内存复制,但我无法弄清楚如何在用户空间程序中访问它。

似乎linux/dmaengine.h并且dma_async_memcpy_buf_to_buf()是我需要使用的,但似乎这些只能从内核中获得?

4

2 回答 2

0

您正在做的正确方法是根本不复制内存,而只需使用嵌入式显示控制器功能从另一个内存缓冲区读取下一帧。

确保您的 SoC 具有/不具有此功能。我有 80% 的把握。

于 2015-09-09T18:30:58.070 回答
0

此信息,来自: http: //pandorawiki.org/Kernel_interface

可能会有所帮助>

帧缓冲接口

Framebuffers可以访问Linux fbdev接口:

fbdev = open("/dev/fb0", O_RDWR); 缓冲区 = mmap(0, 800*480*2, PROT_READ | PROT_WRITE, MAP_SHARED, fbdev, 0);

(这是基本示例,没有错误检查)

返回的指针可用于在屏幕上绘图。

确保#include 可以访问 FB 设备 ioctl 接口,以及访问 ioctl 本身。双缓冲

这可以使用 FBIOPAN_DISPLAY ioctl 系统调用来实现。为此,您需要映射双倍大小的帧缓冲区

buffer1 = mmap(0, 800*480*2 * 2, PROT_WRITE, MAP_SHARED, fbdev, 0); buffer2 = (char *)mem + 800*480*2;

然后显示 buffer2 你会调用:

结构 fb_var_screeninfo fbvar; ioctl(fbdev, FBIOGET_VSCREENINFO, &fbvar); fbvar.yoffset = 480; ioctl(fbdev, FBIOPAN_DISPLAY, &fbvar);

回到 buffer1 将在上面重复 fbvar.yoffset = 0。可以使用相同的技术实现三重或四重缓冲。

于 2015-09-10T06:10:53.930 回答