十四、使用framebuffer填充纯色
简单描述一下framebuffer的使用,它其实就相当于将屏幕上的像素映射到内存中,改变内存中的内容后屏幕自动就变颜色了。
首先要调用open("/dev/fb0", O_RDWR);打开帧缓冲设备文件,获得文件描述符,然后使用mmap将文件内容映射到内存中,具体映大小取决于屏幕大小,初始化程序如下:
typedef unsigned short color_t; /* 根据实际情况修改,此处为unsigned short是565的屏 */ static struct fb_var_screeninfo __g_vinfo; /* 显示信息 */
static color_t *__gp_frame; /* 虚拟屏幕首地址 */ int framebuffer_init (void)
{
int fd = ; fd = open("/dev/fb0", O_RDWR);
if (fd == -) {
perror("fail to open /dev/fb0\n");
return -;
} ioctl(fd, FBIOGET_VSCREENINFO, &__g_vinfo); /* 获取显示信息 */
printf("bits_per_pixel = %d\n", __g_vinfo.bits_per_pixel); /* 得到一个像素点对应的位数 */ __gp_frame = mmap(NULL, /* 映射区的开始地址,为NULL表示由系统决定映射区的起始地址 */
__g_vinfo.xres_virtual * __g_vinfo.yres_virtual * __g_vinfo.bits_per_pixel / , /* 映射区大小 */
PROT_WRITE | PROT_READ, /* 内存保护标志(可读可写) */
MAP_SHARED, /* 映射对象类型(与其他进程共享) */
fd, /* 有效的文件描述符 */
); /* 被映射内容的偏移量 */
if (__gp_frame == NULL) {
perror("fail to mmap\n");
return -;
} return ;
}
初始化成功后对__gp_frame指针操作就相当于对屏幕进行操作了。附上完整测试程序:
#include <stdio.h>
#include <linux/fb.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h> typedef unsigned short color_t; /* 根据实际情况修改,此处为unsigned short是565的屏 */ static struct fb_var_screeninfo __g_vinfo; /* 显示信息 */
static color_t *__gp_frame; /* 虚拟屏幕首地址 */
static color_t __g_pen_color; /* 画笔颜色 */ int framebuffer_init (void)
{
int fd = ; fd = open("/dev/fb0", O_RDWR);
if (fd == -) {
perror("fail to open /dev/fb0\n");
return -;
} ioctl(fd, FBIOGET_VSCREENINFO, &__g_vinfo); /* 获取显示信息 */
printf("bits_per_pixel = %d\n", __g_vinfo.bits_per_pixel); /* 得到一个像素点对应的位数 */ __gp_frame = mmap(NULL, /* 映射区的开始地址,为NULL表示由系统决定映射区的起始地址 */
__g_vinfo.xres_virtual * __g_vinfo.yres_virtual * __g_vinfo.bits_per_pixel / , /* 映射区大小 */
PROT_WRITE | PROT_READ, /* 内存保护标志(可读可写) */
MAP_SHARED, /* 映射对象类型(与其他进程共享) */
fd, /* 有效的文件描述符 */
); /* 被映射内容的偏移量 */
if (__gp_frame == NULL) {
perror("fail to mmap\n");
return -;
} return ;
} /**
* \brief 填充整屏
*/
void full_screen (color_t color)
{
int i;
color_t *p = __gp_frame; for (i = ; i < __g_vinfo.xres_virtual * __g_vinfo.yres_virtual; i++) {
*p++ = color;
}
} int main(int argc, const char *argv[])
{
int i = ; if (framebuffer_init()) {
return ;
} while () {
if (i % == )
full_screen(0x001F);
else if (i % == )
full_screen(0x07E0);
else if (i % == )
full_screen(0xF800); sleep();
i++;
} return ;
}
执行程序后屏幕交替显示红绿蓝三种颜色。
十四、使用framebuffer填充纯色的更多相关文章
- 解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译)
解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译) http://improve.dk/how-are-vardecimals-stored/ 在这篇文章,我将深入研究 ...
- NeHe OpenGL教程 第十四课:图形字体
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- 第十四章——循环神经网络(Recurrent Neural Networks)(第二部分)
本章共两部分,这是第二部分: 第十四章--循环神经网络(Recurrent Neural Networks)(第一部分) 第十四章--循环神经网络(Recurrent Neural Networks) ...
- 实验十四 第九组 张燕~杨蓉庆~杨玲 Swing图形界面组件
实验十四 Swing图形界面组件 8-11-29 理论知识 Swing和MVC设计模式 (1)设计模式(Design pattern)是设计者一种流行的 思考设计问题的方法,是一套被反复使用,多数人 ...
- 第三百四十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制
第三百四十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制 用命令创建自动爬虫文件 创建爬虫文件是根据scrap ...
- (C/C++学习笔记) 十四. 动态分配
十四. 动态分配 ● C语言实现动态数组 C语言实现动态数组,克服静态数组大小固定的缺陷 C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量.一旦定义了一个数组,系统将为它分配一个 ...
- 如鹏网学习笔记(十四)ASP.NET
Asp.net笔记 一.Socket类 进行网络编程的类,可以在两台计算机之间进行网络通讯 过程: 向服务器发送指令: GET /index.html HTTP/1.1 Host:127.0.0.1: ...
- 条目十四《使用reserve来避免不必要的重新分配》
条目十四<使用reserve来避免不必要的重新分配> 使用vector和string的插入元素的时候,我们是不用担心内存问题的(只要不超过容器的max_size).因为底层有分配子管理内存 ...
- Java编程思想之十四 类型信息
第十四章 类型信息 运行时类型信息使得你可以在程序运行时发现和使用类型信息 14.1 为什么需要RTTI 面向对象编程中基本的目的是:让代码只操作对基类的引用. 多态: import java.uti ...
随机推荐
- Hadoop2.X管理与开发
Hadoop 2.X 管理与开发 一.Hadoop的起源与背景知识 (一)什么是大数据 大数据(Big Data),指无法在一定时间范围内用常规软件工具进行捕捉.管理和处理的数据集合,是需要新处理模式 ...
- 第 9 章 数据管理 - 077 - 跨主机使用 Rex-Ray volume
跨主机使用 Rex-Ray volume 在docker1上创建mysql容器,并挂载使用mysqldata数据卷 磁盘文件直接挂载在了docker1 上 验证数据 也是存在的 Rex-Ray 可以提 ...
- Redis(一)--安装与简介
1.Redis是用c编写的,刚开始只支持linux,后来又团队开发出了windows版本:Redis属于非关系型数据库,key-value格式,传统关系型数据库处理高并发.海量数据存储和访问.高可扩展 ...
- Ubuntu - Start - 必要软件安装
1.安装Chromium浏览器 sudo apt install chromium-browser 如果出错, 先更新下apt sudo apt update 2. 安装rime输入法 sudo ap ...
- 阿里云yum配置
CentOS 安装源列表见 CentOS Mirror List.本文使用阿里云安装源安装官方源和扩展源.其他安装源也可以参考. 依次执行命令. #使用 yum-config-manager 软件包命 ...
- vue案例todolist备忘录
项目效果:https://cinderellastory.github.io/todolist/dist/index.html#/ 项目链接:https://github.com/Cinderella ...
- hive的排序,分組练习
hive的排序,分組练习 数据: 添加表和插入数据(数据在Linux本地中) create table if not exists tab1( IP string, SOURCE string, TY ...
- 如何将baseUrl项目地址提取放到放到static
原本项目的baseUrl地址是放在src/common/config.js ,但是这有一个缺点,就是本地测试一个地址,生产一个地址.每发一次不同環境的包就要build一下,太麻烦了!有没有解决的办法呢 ...
- laravel使用 面向对象的方式绑定多对多的关系
创建model文件,并且一起创建migration文件: php artisan make:model Habit -m 创建多对多的中间表的方法: php artisan make:migr ...
- win10下安装vs2013无法安装解决方案
win10下安装vs2013无法安装解决方案 win+r,输入cmd进入命令行 进入界面后选择修复 进入vs_ultimate文件所在目录,输入: vs_ultimate /Uninstall ...