显示学习2(基于树莓派Pico) -- Framebuffer

书接上回:显示学习1(基于树莓派Pico) -- 基础-优快云博客

如果是基于树莓派Pico,那么看这个文档最权威的。

framebuf — 帧缓冲操作 — mPython掌控 2.2.0 documentation

我的理解显示屏其实还是一堆LED点的组合,在内存中有映射到显示屏的显示数据,记录了每个点的详细信息,比如色彩,亮度等等的信息,这部分信息先在内存中进行预处理,处理完成后,再将这段内存送到显示器逐个点进行显示。如果是30帧的视频,那么基本上要在0.03秒内处理完毕。

在Micropython中,常规是将驱动继承Framebuffer,这样方便操作。如下:

i2c = I2C(1, scl=Pin(7), sda=Pin(6), freq=200000)#Grove - OLED Display 0.96" (SSD1315)
oled = SSD1306_I2C(128, 64, i2c)
 
while True:  
    oled.fill(0)#clear
    oled.text("Hello,World!",0,0)
    oled.show()

其中SSD1306_I2C就是继承的Framebuffer。可以提供最基础的显示功能。

从python的接口来看,FB还提供了一些简易接口,line画线,fill_rect画矩形,text写文字。

图形的格式看起来也不少,MONO_VLSB,MONO_HLSB,MONO_HMSB,RGB565,GS2_HMSB,GS4_HMSB,GS8,每一种都要能基本了解吧。

MONO_VLSB1位。单色(单通道)垂直扫描低位优先。这是一种单色图像格式,每个像素仅使用一个位来表示颜色,按垂直方向从上到下扫描,低位优先存储。
MONO_HLSB1位。单色(单通道)水平扫描低位优先。类似于 MONO_VLSB,但是按水平方向从左到右扫描。
MONO_HMSB1位。单色(单通道)水平扫描高位优先。类似于 MONO_VLSB 和 MONO_HLSB,但是高位优先存储。
RGB56516位,2个字节。彩色(三通道)格式,每个像素使用 16 位表示,其中 5 位用于红色通道,6 位用于绿色通道,5 位用于蓝色通道。
GS2_HMSB2位。灰度级(单通道)2 位 高位优先。每个像素使用 2 位表示灰度级别,高位优先存储。
GS4_HMSB4位。灰度级(单通道)4 位 高位优先。每个像素使用 4 位表示灰度级别,高位优先存储。
GS88位,1个字节。灰度级(单通道)8 位。每个像素使用 8 位表示灰度级别。

分析完功能,我个人觉得基础版本的FB不是太复杂,1000行代码以内也许可以搞定。

还有几点我觉得可以看看。

1 双缓冲区。

很早很早就看到这个概念了,我觉得本质上还是处理速度和IO速度的异步导致的,所以使用两个来加速。看起来使用也很简单,应该算是编程技巧的一种,下面是从GPT要的示例代码:

import framebuf
import utime

# 设置屏幕分辨率
WIDTH = 128
HEIGHT = 64

# 创建两个 Framebuffer 对象
buf1 = bytearray(WIDTH * HEIGHT // 8)
fb1 = framebuf.FrameBuffer(buf1, WIDTH, HEIGHT, framebuf.MONO_HLSB)

buf2 = bytearray(WIDTH * HEIGHT // 8)
fb2 = framebuf.FrameBuffer(buf2, WIDTH, HEIGHT, framebuf.MONO_HLSB)

# 渲染函数,渲染到 buf1
def render(fb):
    fb.fill(0)  # 清空 Framebuffer
    fb.text('Hello', 0, 0, 1)  # 在 Framebuffer 上绘制文本
    fb.text('MicroPython', 0, 16, 1)
    fb.text('Double Buffering', 0, 32, 1)

# 初始化屏幕
# display.init()  # 初始化显示器,具体操作可能因硬件平台而异

while True:
    # 渲染到 buf1
    render(fb1)
    # 将 buf1 写入显示器的内存中,显示到屏幕上
    # display.update(buf1)  # 更新显示,具体操作可能因硬件平台而异
    utime.sleep_ms(100)  # 等待一段时间,以便观察显示效果

    # 渲染到 buf2
    render(fb2)
    # 将 buf2 写入显示器的内存中,显示到屏幕上
    # display.update(buf2)  # 更新显示,具体操作可能因硬件平台而异
    utime.sleep_ms(100)  # 等待一段时间,以便观察显示效果

核心就是display.update这个接口很依赖硬件,IO也有延时。

2 GPU如何操作Framebuffer

我理解是共享内存,然后通过信号量或者其它来进行同步,后面有时间再看看吧。

3 OpenCV和Framebuffer的关系

两个的功能好像有点重叠。。。后面再看看这部分。

4 Framebuffer和显存的关系

Framebuffer是在内存之中,对投射到屏幕的点阵进行处理。那么和显存是什么关系呢?

  • 在很多系统中,Framebuffer 和显存可以是同一个内存区域的不同部分,也就是说,Framebuffer 的数据可能直接位于显存中。(From GPT)

### 回答1: 树莓派Pico树莓派推出的一款微型电脑,Pico中文版是针对中国市场推出的版本。Pico-Python-SDK是树莓派官方提供的软件开发工具包,用于编写和运行Python程序。Pico-Python-SDK中文版是根据中国用户的需求进行本土化开发的版本。 树莓派Pico是一款体积小巧但功能强大的微型电脑,搭载了ARM Cortex-M0+处理器和26个GPIO口,可用于连接各种传感器、执行各种控制任务。同时,Pico支持MicroPython和C/C++两种编程语言,非常适合初学者和嵌入式系统开发人员。 Pico-Python-SDK中文版是官方提供的软件开发工具包,它提供了一系列的API和库函数,可以帮助开发者更方便地编写和调试Python程序。无论是控制外部硬件设备还是实现各种功能,Pico-Python-SDK都提供了丰富的功能和示例代码,使开发工作更加便捷。 Pico-Python-SDK中文版还提供了中文文档和教程,有助于开发者更快速地上手。通过学习这些文档和教程,开发者可以了解Pico的基本原理、功能特性以及编程方法,从而高效地开发出各种应用。 总的来说,树莓派Pico-Python-SDK中文版为中国用户提供了一个方便、易用的软件开发平台,帮助开发者快速上手并实现各种创意和项目。无论是学习编程还是进行嵌入式系统开发,Pico-Python-SDK中文版都是一个不错的选择。 ### 回答2树莓派pico-python-sdk-中文版是为了方便中国开发者使用而推出的一款软件开发工具包。它是基于树莓派pico微控制器设计的,通过使用Python语言进行开发。该SDK提供了丰富的功能和接口,使得使用者能够轻松地进行树莓派pico的开发工作。 树莓派pico-python-sdk-中文版包含了各种模块和库,如GPIO库、PWM库、I2C库、SPI库等,这些库可以帮助开发者通过编写Python代码来操控各种外设和传感器。例如,使用GPIO库可以控制LED灯的开关,使用PWM库可以控制舵机的转动,使用I2C库可以与其他设备进行通信,使用SPI库可以实现高速数据传输等等。 此外,树莓派pico-python-sdk-中文版还提供了丰富的示例代码和文档,帮助开发者快速上手。开发者可以参考这些示例代码和文档,了解如何使用SDK中的功能和接口,从而加速自己的开发进程。 总之,树莓派pico-python-sdk-中文版是一款功能强大、易于学习和使用的软件开发工具包。它不仅方便中国开发者使用树莓派pico进行开发工作,还提供了丰富的功能和接口,使得开发者能够更加便捷地实现各种应用和项目。无论是初学者还是有经验的开发者,都可以通过使用这个SDK来实现自己的创意和想法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值