查看: 16|回复: 0

[经验] 飞凌嵌入式ElfBoard ELF1板卡-LCD显示图片编程示例之介绍mmap

[复制链接]

该用户从未签到

发表于 8 小时前 | 显示全部楼层 |阅读模式
分享到:
mmap概念
存储映射 I/O这种高级 I/O方式,它的一个非常经典的使用场景便是用在 Framebuffer 应用编程中。通过 mmap()将显示器的显示缓冲区(显存)映射到进程的地址空间中,这样应用程序便可直接对显示缓冲区进行读写操作。
为什么这里需要使用存储映射 I/O 这种方式呢?其实使用普通的 I/O 方式(譬如直接 read、write)也是可以的,只是,当数据量比较大时,普通 I/O 方式效率较低。假设某一显示器的分辨率为 1920 * 1080,像素格式为ARGB8888,针对该显示器,刷一帧图像的数据量为 1920 x 1080 x 32 / 8 = 8294400 个字节(约等于 8MB),这还只是一帧的图像数据,而对于显示器来说,显示的图像往往是动态改变的,意味着图像数据会被不断更新。
在这种情况下,数据量是比较庞大的,使用普通 I/O 方式必然导致效率低下,所以才会采用存储映射I/O 方式。
用法
  1. void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
复制代码

下面介绍一下 mmap 函数的各个参数作用:
addr:指定映射的虚拟内存地址,可以设置为 NULL,让 Linux 内核自动选择合适的虚拟内存地址。
length:映射的长度;
prot:映射内存的保护模式,可选值如下:
PROT_EXEC:可以被执行;
PROT_READ:可以被读取;
PROT_WRITE:可以被写入;
PROT_NONE:不可访问;
flags:指定映射的类型,常用的可选值如下:
MAP_FIXED:使用指定的起始虚拟内存地址进行映射;
MAP_SHARED:与其它所有映射到这个文件的进程共享映射空间(可实现共享内存);
MAP_PRIVATE:建立一个写时复制(Copy on Write)的私有映射空间;
MAP_LOCKED:锁定映射区的页面,从而防止页面被交换出内存;

fd:进行映射的文件句柄;
offset:文件偏移量(从文件的何处开始映射);

回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条



手机版|小黑屋|与非网

GMT+8, 2024-11-21 17:12 , Processed in 0.105424 second(s), 15 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.