做嵌入式开发,Linux应用好还是驱动好?

本文探讨嵌入式开发中Linux驱动与应用如何配合使用double buffer来解决屏幕撕裂问题。通过分析Linux fbdev驱动和应用的实现方式,解释double buffer的工作原理,并提供代码示例。
摘要由CSDN通过智能技术生成

做嵌入式开发,Linux应用好还是驱动好?

一、为何需要 double buffer?

single buffer会导致:

文章下方附学习资源,自助领取。屏幕撕裂(tearing),即在屏幕上同时看到多帧数据拼接在一起。

8da12ec5693944298afa7d536435f4e3.png

点击查看大图

single buffer为何会造成撕裂:

refresh rate和 frame rate不一致。

refresh rate表示的是屏幕每秒能更新多少次显示,例如 30hz / 60hz。

724c139f7777e1bacfce9f09970c5d5c.png

点击查看大图

frame rate表示的是 lcd controller / gpu每秒能绘制多少帧数据,例如 30fps / 60fps。

390854d56cc56cf9c98774798054b7b1.png

点击查看大图

LCD controller / gpu和屏幕协作完成一帧图像的显示:

3d2d437ba21f07569e58e7de3136bbdb.png

点击查看大图

在 single buffer的场景下,LCD user和 LCD controller / gpu总是在共用同一个 framebuffer,且没有同步机制。

LCD user是写者,LCD controller / gpu是读者。

由于存在竞争关系且读写没有同步机制,framebuffer里必须会发生同时存在frame N和 frame N-1的数据,此时 LCD将 framebuffer的数据显示出来时,就会看到撕裂的效果:

af121df8fb1dd93898bff34d8944c550.png

点击查看大图

可以通过 double buffer+vsync解决撕裂的问题。

double buffer,顾名思义,就是有 2个 framebuffer,其工作逻辑如下:

·LCD controller : draw fb0 to screen

·LCD user : write data to fb1

·LCD controller : draw fb1 to screen

·LCD user : write data to fb0

·循环...

vsync机制则用于确保一帧图像能不被打断地显示在屏幕。

如何支持 double buffer?

需要驱动和应用互相配合:

0a2b502f1c6db118c08bd360bdec923f.png

二、编写支持 double buffer的 fbdev驱动

fbdev框图:

1bac343c56c7a8cbbdd444ecb0f72ad7.png

先梳理一下思路:

让驱动支持 double buffer需要做 3件事。

1.申请2 x buffer:

size = (2 * width * height);

fbi->screen_base = dma_alloc_wc(sfb->dev, size, &map_dma, GFP_KERNEL);

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值