记一个framebuffer显示混乱的低级错误

记一个framebuffer显示混乱的低级错误

由于framebuffer的基础知识不扎实,这个任务上我多卡了两天,差点把我搞死,于此记录为后鉴。

打算用awtk做一个多进程项目,计划把framebuffer的内容通过websocket输出到浏览器上去显示画面, 架构大概为:

browser部署项目<---websocket<------framebuffer输出程序

用于输出framebuffer的项目在公司的嵌入式设备平台上显示良好:

image-20241214104234183

但是换到ubuntu服务器上部署时,在浏览器上显示,却变成了这样:

image-20241214104526302

检查framebuffer输出程序内部代码,mock数据给跟fb打交道的中间bitmap变量,然后再推流:

void update_g_bitmap_backgroud() {rect_t r = rect_init(0, 0, g_bitmap->w, g_bitmap->h);char *shared_data = LibFrameBufferGet(USE_FB_ID)->fbdata;  bitmap_t temp_bmp;bitmap_init(&temp_bmp, 800, 480, BITMAP_FMT_BGRA8888, shared_data);// ******* addrect_t temp_r = rect_init(0, 0, temp_bmp.w / 3, temp_bmp.h);image_fill(&temp_bmp, &temp_r, color_init(0, 0, 255 , 255));temp_r = rect_init(temp_bmp.w / 3, 0, temp_bmp.w / 3, temp_bmp.h);image_fill(&temp_bmp, &temp_r, color_init(0, 255, 0 , 255));temp_r = rect_init(temp_bmp.w * 2 / 3, 0, temp_bmp.w / 3, temp_bmp.h);image_fill(&temp_bmp, &temp_r, color_init(255, 0,  0, 255));// ********helper_bitmap_bgra8888_to_rgba8888(g_bitmap, &temp_bmp);bitmap_deinit(&temp_bmp);
}

浏览器上正常显示:

image-20241214114746960

那看来是获取fb这段的逻辑或者输出到fb的程序出了问题,但是检查一天,并未发现明显的错误,这时候通过awtk-linux-fb的输出日志注意到一个现象,我之前用的测试机器的line_length是3200,像素显示位数32 / 8 = 4 pixel, 正好对应机器显示分辨率xres= 3200/ 4 = 800:

app_root=./res
devices_load : path = file:///home/zhangdalin/AWStudioProjects/kp25sweb/process/Awtk_GamiWebDisplayStream/config/devices.json
devices[0]: path = /dev/fb0, type = fb
devices[1]: path = /dev/dri/card0, type = drm
devices[2]: path = /dev/input/event1, type = input
devices[3]: path = /dev/input/event2, type = mouse
fb_info_t: /dev/fb0
xres=800 yres=480
xres_virtual=800 yres_virtual=480
bits_per_pixel=32 line_length=3200
fb_info_t: red(16 8) green(8 8) blue(0 8)
xpanstep=1 ywrapstep=0
fb_size=768000 fb_total_size=1536000 fb_nr=2 smem_len=1536000
fb_open clear
fb_open ok
run in vmware and fix FBIOPAN_DISPLAY block issue
=========fb_number=2
ratio=1.000000 800 480
ratio=1.000000 800 480

而在ubuntu机器上,同样像素字节数4位,line_length=4704对应虚拟分辨率xres_virtual=4704 / 4 = 1176。

app_root=./res
devices_load : path = file:///home/zhangdalin/AWStudioProjects/kp25sweb/process/Awtk_GamiWebDisplayStream/config/devices.json
devices[0]: path = /dev/fb0, type = fb
devices[1]: path = /dev/dri/card0, type = drm
devices[2]: path = /dev/input/event1, type = input
devices[3]: path = /dev/input/event2, type = mouse
fb_info_t: /dev/fb0
xres=800 yres=600
xres_virtual=1176 yres_virtual=885
bits_per_pixel=32 line_length=4704
fb_info_t: red(16 8) green(8 8) blue(0 8)
xpanstep=1 ywrapstep=0
fb_size=2257920 fb_total_size=4163040 fb_nr=2 smem_len=4163040
fb_open clear
fb_open ok
run in vmware and fix FBIOPAN_DISPLAY block issue
=========fb_number=2
ratio=1.000000 800 600
ratio=1.000000 800 600

这时候已经接近线索了,可惜framebuffer基础没怎么过,以为是分辨率不一样的问题,还用fbset去改,结果当然是无功而返,实际上分辨率设多少都只是放缩画布的大小,只要在项目的设置里面设定了分辨率800x480, 那它就会以(0,0)起点绘制一个800x480的画面。

比如fbset设置分辨率1024x768的情况:

image-20241214111021491

fbset搞了半天,始终没有找到问题的解决方法,干脆想把ubuntu虚拟机的fb设置改成和机器一致,但fb设置属于linux驱动范畴,已经超出了我的能力,眼看这个任务卡到明天毫无头绪,就这么卡死了?

现在想起来我是忽略了这几个点:

  • framebuffer的读取方式是从左到右,从上到下的

  • framebuffer的参数分variable和fix两类,fbset能修改的是xres, yres, xres_virtual这类的,但是line_length和smem_len都属于fix类参数,fbset改不了

  • awtk中的bitmap_init函数是直接引入外来的一维数组指针的,读取方式和fb一样,但是我想当然的以为是引用整个fb框内从(0,0)左上角为起点的800x480的区域

  • framebuffer一行的长度取决于line_length, 而我当时又想当然的认为一行长度是fbset设置的分辨率宽度*像素位数,基于此,我的framebuffer接口mmap是这么写的:

    size_t screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
    fb->fbdata = (unsigned char *)mmap(NULL, screensize, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0);
    if (fb->fbdata == MAP_FAILED) {perror("Error mapping framebuffer to memory");exit(EXIT_FAILURE);
    }
    

    但是后面看awtk-linux-fb的源码,才发现smem_len才会把整个framebuffer都包括进去,于是我改成:

    fb->fbdata = (unsigned char *)mmap(NULL, finfo.smem_len, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0);
    

推流定时器函数逻辑改成:

void update_g_bitmap_background() {rect_t src_r = rect_init(0, 0, g_bitmap->w, g_bitmap->h);LibFrameBuffer *libframebuffer = LibFrameBufferGet(USE_FB_ID);char *shared_data = libframebuffer->fbdata;  int line_length = libframebuffer->fixinfo.line_length / libframebuffer->bpp;int height = libframebuffer->height;bitmap_t temp_bmp;bitmap_init(&temp_bmp, line_length, height, BITMAP_FMT_RGBA8888, shared_data);...

终于正常显示。

在这个ub虚拟机的fb是个长为1176x885的一维数组,而且每1176字节为一行长度,而我只取了800x480的部分放到800x480的位图,在这个位图上,一行只显示800个像素,剩下的376个像素只能到800x480位图第二行去显示了,这样800x480位图两行才能存放1176x885位图的一行内容,后面的行以此类推,这就解释了为什么出来的800x480位图上出来的图像像是拧毛巾(不知道该怎么比喻。。。。)一样。

嵌入式做业务,底层基础一定要过关啊!

ADD:

ubuntu 20.04中:

  1. Ctrl + Alt + F2:GUI模式
  2. Ctrl + Alt + F6:命令行模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/64135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用的前端框架介绍

在前端开发中&#xff0c;有许多流行的框架能够帮助开发者更高效地构建用户界面和交互 1. React&#xff1a; • React是一个由Facebook开发的JavaScript库&#xff0c;用于构建用户界面。 • 它使用组件化的思想&#xff0c;将UI拆分成可复用的组件&#xff0c;每个组件都有自…

Kaggler日志-Day4

进度24/12/14 昨日复盘&#xff1a; Pandas课程完成 Intermediate Mechine Learning2/7 今日记录&#xff1a; Intermediate Mechine Learning之类型变量 读两篇讲解如何提问的文章&#xff0c;在提问区里发起一次提问 实战&#xff1a;自己从头到尾首先Housing Prices Compe…

【21天学习AI底层概念】day5 机器学习的三大类型不能解决哪些问题?

机器学习的三大类型——监督学习、无监督学习和强化学习&#xff0c;虽然可以应用于许多问题&#xff0c;但并非所有问题都能通过这些方法有效解决。每种类型的机器学习都有其局限性&#xff0c;具体如下&#xff1a; 1. 监督学习 (Supervised Learning) 监督学习是通过训练数…

【常考前端面试题总结】---2025

React fiber架构 1.为什么会出现 React fiber 架构? React 15 Stack Reconciler 是通过递归更新子组件 。由于递归执行&#xff0c;所以更新一旦开始&#xff0c;中途就无法中断。当层级很深时&#xff0c;递归更新时间超过了 16ms&#xff0c;用户交互就会卡顿。对于特别庞…

二三(Node2)、Node.js 模块化、package.json、npm 软件包管理器、nodemon、Express、同源、跨域、CORS

1. Node.js 模块化 1.1 CommonJS 标准 utils.js /*** 目标&#xff1a;基于 CommonJS 标准语法&#xff0c;封装属性和方法并导出*/ const baseURL "http://hmajax.itheima.net"; const getArraySum (arr) > arr.reduce((sum, item) > (sum item), 0);mo…

Java爬虫设计:淘宝商品详情接口数据获取

1. 概述 淘宝商品详情接口&#xff08;如Taobao.item_get&#xff09;允许开发者通过编程方式&#xff0c;以JSON格式实时获取淘宝商品的详细信息&#xff0c;包括商品标题、价格、销量等。本文档将介绍如何设计一个Java爬虫来获取这些数据。 2. 准备工作 在开始之前&#x…

LeetCode-hot100-73

https://leetcode.cn/problems/largest-rectangle-in-histogram/description/?envTypestudy-plan-v2&envIdtop-100-liked 84. 柱状图中最大的矩形 已解答 困难 相关标签 相关企业 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#x…

深度学习中损失函数(loss function)介绍

深度学习中损失函数(loss function)介绍 ​ 在深度学习的宏伟城堡中&#xff0c;损失函数扮演着国王的角色&#xff0c;它决定了模型训练的方向和目标。损失函数&#xff0c;也被称为代价函数&#xff0c;是衡量模型预测与实际结果之间差异的函数。在深度学习的训练过程中&…

【docker】springboot 服务提交至docker

准备docker &#xff08;不是docker hub或者harbor&#xff0c;就是可以运行docker run的服务&#xff09;&#xff0c;首先确保docker已经安装。 本文以linux下举例说明&#xff1a; systemctl stats docker ● docker.service - Docker Application Container EngineLoaded…

【新版】阿里云ACP云计算题库及答案解析

阿里云ACO云计算考试提醒都是选择题&#xff0c;70道单选题30道单选题&#xff0c;聪明的小伙伴都知道刷题备考加深记忆&#xff0c;给大家分享一波阿里云ACP云计算题库及答案&#xff0c;希望对大家顺利拿到阿里云ACP云计算高级工程师证书有所帮助&#xff01; 1、设计云上架…

通过ajax的jsonp方式实现跨域访问,并处理响应

一、场景描述 现有一个项目A&#xff0c;需要请求项目B的某个接口&#xff0c;并根据B接口响应结果A处理后续逻辑。 二、具体实现 1、前端 前端项目A发送请求&#xff0c;这里通过jsonp的方式实现跨域访问。 $.ajax({ url:http://10.10.2.256:8280/ssoCheck, //请求的u…

Unity 沿圆周创建Sphere

思路 取圆上任意一点连接圆心即为半径&#xff0c;以此半径为斜边作直角三角形。当已知圆心位置与半径长度时&#xff0c;即可得该点与圆心在直角三角形两直角边方向上的位置偏移&#xff0c;从而得出该点的位置。 实现 核心代码 offsetX radius * Mathf.Cos(angle * Mathf…

【CUDA】CUBLAS

【CUDA】CUBLAS 在深入了解之前&#xff0c;提前运行预热&#xff08;warmup&#xff09;和基准测试&#xff08;benchmark runs&#xff09; 是获得准确执行时间的关键。如果不进行预热运行&#xff0c;cuBLAS 的首次运行会有较大的开销&#xff08;大约 45 毫秒&#xff09;…

9. 高效利用Excel设置归档Tag

高效利用Excel设置归档Tag 1. Excle批量新建/修改归档Tag2. 趋势记录模型批量导入归档Tag(Method1)2. 趋势记录模型批量导入归档Tag(Method2)3. 趋势记录控件1. Excle批量新建/修改归档Tag Fcatory Talk常常需要归档模拟量,对于比较大的项目工程会有成千上万个重要数据需…

网页端web内容批注插件:

感觉平时每天基本上90%左右的时间都在浏览器端度过&#xff0c;按理说很多资料都应该在web端输入并且输出&#xff0c;但是却有很多时间浪费到了各种桌面app中&#xff0c;比如说什么notion、语雀以及各种笔记软件中&#xff0c;以及导入到ipad的gn中&#xff0c;这些其实都是浪…

Jackson @JsonIgnore 注解

1. 概述 Jackson 是一个广泛使用的Java库&#xff0c;它允许轻松地将Java对象序列化为JSON以及从JSON反序列化回Java对象。Jackson库提供的其中一个注解是JsonIgnore。这个注解用于在序列化和反序列化过程中忽略特定的属性。这在转换JSON与Java对象之间时隐藏或省略敏感或不必…

数据结构——栈的模拟实现

大家好&#xff0c;今天我要介绍一下数据结构中的一个经典结构——栈。 一&#xff1a;栈的介绍 与顺序表和单链表不同的是&#xff1a; 顺序表和单链表都可以在头部和尾部插入和删除数据&#xff0c;但是栈的结构就锁死了&#xff08;栈的底部是堵死的&#xff09;栈只能从…

基于springboot+vue的高校校园交友交流平台设计和实现

文章目录 系统功能部分实现截图 前台模块实现管理员模块实现 项目相关文件架构设计 MVC的设计模式基于B/S的架构技术栈 具体功能模块设计系统需求分析 可行性分析 系统测试为什么我&#xff1f; 关于我项目开发案例我自己的网站 源码获取&#xff1a; 系统功能 校园交友平台…

数字货币金融研究,深度学习虚拟币价格预测 数据集 市值top20 (2014年—2024年)

比特币&#xff0c;以太坊&#xff0c;狗狗币&#xff0c;屎币&#xff0c;模因币 声明 此数据集的目的是 用于数字货币金融研究&#xff0c;深度学习虚拟币价格预测 1、数据集 2014年——2024年 市值top20 比特币&#xff0c;以太坊&#xff0c;屎币&#xff0c;狗狗币交易…

让文案生成更具灵活性/chatGPT新功能canvas画布编辑

​ ​ OpenAI最近在2024年12月发布了canvas画布编辑功能&#xff0c;这是一项用途广泛的创新工具&#xff0c;专为需要高效创作文案的用户设计。 无论是职场人士、学生还是创作者&#xff0c;这项功能都能帮助快速生成、优化和编辑文案&#xff0c;提升效率的同时提高内容质量…