LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1199|回复: 4

谁在uclinux下编程使用过 mmap() ?

[复制链接]
发表于 2007-8-14 00:16:31 | 显示全部楼层 |阅读模式
为测试framebuffer驱动程序,写的测试程序:
int main(int argc,char * *argv)
{
        int fbfd=0;
        struct fb_var_screeninfo vinfo;
        struct fb_fix_screeninfo finfo;
        long int screensize=0;
        unsigned char *fbp;
        const unsigned char acLuigi[] = {...........................};
        printf("test lcd now\n");

         /*打开设备文件*/
         fbfd=open("/dev/fb0",O_RDWR);

         ioctl(fbfd,FBIOGET_FSCREENINFO,&finfo);
         ioctl(fbfd,FBIOGET_VSCREENINFO,&vinfo);

         printf("###lcd ictol worked normally###\n");
        
        /*计算屏幕缓冲区大小*/
        screensize=vinfo.xres*vinfo.yres*vinfo.bits_per_pixel/8;
        printf("screensize=%d\n",screensize);
        
        /*映射屏幕缓冲区到用户地址空间*/
        fbp=(unsigned char *)mmap(0,screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0);
        
        printf("fbp=0x%x\n",fbp);
        memset(fbp, 0, screensize);
        
        /*通过fbp访问缓冲区,进行图形绘*/
        printf("acLuigi[ ]=%d;sizeof(fbp)=%d\n",sizeof(acLuigi),sizeof(fbp));
        
        memcpy(fbp,acLuigi,screensize);
        
        printf("delay 2 min \n");
        
        sleep(30);
        
        
        munmap(fbp,screensize);//释放
           
        close(fbfd);
        
        return 0;
}
 楼主| 发表于 2007-8-14 00:17:42 | 显示全部楼层
运行结果如下

test lcd now

###lcd ictol worked normally### MAP_SHARED not supported (cannot write mappings to disk)                                                   
screensize=153600                       
delay 2 min              
。。。。

分析:很明显 mmap()分配失败:MAP_SHARED not supported (cannot write mappings to disk)

后来我根据网上的参考 将MAP_SHARED 参数改成0。爆出更多错误:

src/build/231499-i386/BUILD/glibc-2.3.2-20030313/build-i386-linux/csu/a                                                                                
bi-tag.h        
src/build/231499-i386/BUILD/glibc-2.3.2-20030313/build-i386-linux/csu/abi-tag.h:                                                                                
Bad command or file name                        
Command: tfini.c               
tfini.c: Bad command or file name                                 
Command: ibc-2.3.2-20030313/build-                                
ibc-2.3.2-20030313/build-i386-linux/csu/crtn.S: Bad command or file name                                                                        
Command: _libc_start_main@@GLIBC_2.0                                    
_libc_start_main@@GLIBC_2.0: Bad command or file name                                                     
Command: on_start__                  
on_start__: Bad command or file name                                    
Execution Finished, Exiting                           
/bin>
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-14 00:23:06 | 显示全部楼层
lcd 驱动程序是自己写的, 我猜测是 mamp函数的问题,请高手指点迷津啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-14 00:53:12 | 显示全部楼层
在QQ群里面 别个说我是编译器或用了gLibc是不是有错。 我的分析:


我在编译内核的时候执行make menuconfig后选择了(uClib)Libc Version选项的呀,没选gLibc或者是uC-libc

我的Makefile是照搬前一个测试程序(前一个测试程序能顺利在开发板上运行) 改写的

前一个测试程序my_test.c在uClinux-dist/user/app 下 且Makefile也在下面。

同理上面个lcd_test.c 在uClinux-dist/user/applcd下  且Makefile也在下面。

我也不晓得为什么 会出这么个错误,很迷惑....

请高手指点。。
相应的makefile如下


EXEC = lcd_test
OBJS = lcd_test.o

all: $(EXEC)

$(EXEC): $(OBJS)

$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
romfs:
$(ROMFSINST)     /bin/$(EXEC)
clean:
-rm -f $(EXEC) *.elf *.gdb *.o
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-14 00:54:21 | 显示全部楼层
在分析:
$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)

我想CC已经被定义成了arm-elf-gcc
前面个程序my_test不是已经编译通过了么?

猜测:关键是不是库函数的问题?????
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表