映射函数原型: void *mmap( void *addr, ---》要映射到内存的那一个地址上 填写为NULL让系统自动分配 size_t length, ---》要映射的空间大小 int prot, ---》映射空间的权限 PROT_EXEC Pages may be executed.可执行 PROT_READ Pages may be read. 可读 PROT_WRITE Pages may be written. 可写 PROT_NONE Pages may not be accessed.没有权限
int flags, ---》其他进程对改空间的访问权限 MAP_SHARED -》其他进程可访问改内存 MAP_PRIVATE -》该空间为私有的,其他进程不可访问 int fd, ---》需要映射的设备描述符 off_t offset );->映射空间的偏移量 0不偏移 返回值:成功返回映射空间的首地址,失败返回NULL ---------------------------------------------------------------------------- 解除映射空间 函数原型: int munmap(void *addr,,size_t length);
参数一:需要解除映射的首地址 参数二:需要解除的长度 返回值:成功返回0,失败返回-1
-------------------------------------------------------------------------------------------- mmap函数在嵌入式开发板中的使用
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <linux/fb.h>
int main()
{
//打开LCD设备
int fd=open("/dev/fb0",O_RDWR);
if(fd<0)
{
perror("lcd:");
}
//获取LCD屏幕属性
struct fb_var_screeninfo lcdmsg;
int ret=ioctl(fd,FBIOGET_VSCREENINFO,&lcdmsg);
if(ret==0)
{
printf("lcd x=%d,y=%d,bit=%d\n",lcdmsg.xres,lcdmsg.yres,lcdmsg.bits_per_pixel);
}
//获取字节的大小
int c= lcdmsg.bits_per_pixel/8;
//对LCD设备空间进行映射
unsigned int *lcd=mmap(NULL,lcdmsg.xres*lcdmsg.yres*c,PROT_READ|PROT_WRITE, MAP_SHARED,fd,0);
if(*(int *)lcd==-1)
{
perror("mmap lcd fail:");
}
//对LCD屏幕进行操作
int i=0,j=0;
for(i=0;i<480;i++)
{
for(j=0;j<800;j++)
{
*(lcd+i*800+j) = 0x00ff00;
}
}
close(fd);
return 0;
}