搜索
bottom↓
回复: 10

go语言开发f1c100s之oled驱动mmap版

[复制链接]

出0入0汤圆

发表于 2020-4-7 08:46:44 | 显示全部楼层 |阅读模式
上次是用文件方式操作io,这次换成了设备地址映射到虚拟地址,操作虚拟地址来操作io。但是这两种方式驱动oled都非常慢,有很明显的扫描感。不知道大家用什么方式操作f1c100s的io,理论上不应该这么慢的。
https://github.com/kekemuyu/f1c100s/tree/master/oled_spi
mmap部分代码:
  1. #include"devmem.h"


  2. int tempfd;

  3. void Openfile(){
  4.     if((tempfd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) FATAL;
  5.    
  6. }

  7. void Closefile(){
  8.      close(tempfd);
  9. }

  10. void Writebit(long  target,int bitsize ,char value){

  11.     void *map_base, *virt_addr;
  12.     unsigned long read_result, writeval;
  13.     int fd;

  14.     fd = fcntl(tempfd, F_DUPFD, 0);
  15.     if(fd<0){
  16.         FATAL;
  17.     }   
  18. //    if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) FATAL;
  19. //    printf("/dev/mem opened.\n");
  20. //    fflush(stdout);

  21.     /* Map one page */
  22.     map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~MAP_MASK);
  23.     if(map_base == (void *) -1) FATAL;
  24. //    printf("Memory mapped at address %p.\n", map_base);
  25. //    fflush(stdout);
  26.    
  27.     virt_addr = map_base + (target & MAP_MASK);
  28.    
  29.     read_result = *((unsigned long *) virt_addr);
  30.    
  31. //    printf("Value at address 0x%X (%p): 0x%X\n", target, virt_addr, read_result);
  32. //    fflush(stdout);
  33.    

  34. //    printf("bitsize:%d;value:%d\n",bitsize,value);
  35.     if(value==0){
  36.        read_result&=~(1<<bitsize);
  37.     }else{
  38.         read_result|=1<<bitsize;
  39.     }

  40.     writeval=read_result;
  41.     *((unsigned long *) virt_addr)=writeval;
  42.     read_result=*((unsigned long *) virt_addr);
  43.    
  44. //    printf("Written 0x%X; readback 0x%X\n", writeval, read_result);
  45. //    fflush(stdout);
  46.    
  47.     if(munmap(map_base, MAP_SIZE) == -1) FATAL;
  48.     close(fd);
  49. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2020-4-7 08:48:52 | 显示全部楼层
还用了纯c语言的mmap方式,速度稍微有点提升,但还是有扫描感。难道linux上操作gpio真么慢

出0入89汤圆

发表于 2020-4-7 09:28:55 | 显示全部楼层
FireBrain 发表于 2020-4-7 08:48
还用了纯c语言的mmap方式,速度稍微有点提升,但还是有扫描感。难道linux上操作gpio真么慢 ...

我认为是应用进行系统调用的效率问题,如果要提高效率还是需要写驱动,当然,linux其实我也不是很懂!以上是我猜的.

出0入0汤圆

 楼主| 发表于 2020-4-7 09:40:54 | 显示全部楼层
youkebing 发表于 2020-4-7 09:28
我认为是应用进行系统调用的效率问题,如果要提高效率还是需要写驱动,当然,linux其实我也不是很懂!以 ...

谢谢回复,从大佬确认,你猜对了,内核态和用户态交互是毫秒级的延迟。
下一步的玩法是:
1:f1c100s硬件spi的4线方式
2. spi软件模式做成驱动集成到内核
3. 最终做成spi软硬件兼容的驱动集成到内核

通过这个小demo系统的学习一下linux的驱动开发

出0入89汤圆

发表于 2020-4-7 09:44:15 | 显示全部楼层
FireBrain 发表于 2020-4-7 09:40
谢谢回复,从大佬确认,你猜对了,内核态和用户态交互是毫秒级的延迟。
下一步的玩法是:
1:f1c100s硬件 ...

期待你分享最新成果!

出870入263汤圆

发表于 2020-4-15 19:12:45 | 显示全部楼层
本帖最后由 armstrong 于 2020-4-15 19:17 编辑

技术总是在无尽的折腾中进步,这个我深有体会。
之前玩过几次linux,总是拿裸机开发做对比;感觉裸机很直接暴力的做法,在linux总是要拐弯抹角才能实现。
我很不愿意用拐弯抹角的方法实现本来直接能解决的问题,所以我永远学不会linux;也就是我没有不怕折腾的精神。

出0入36汤圆

发表于 2020-4-25 09:14:01 来自手机 | 显示全部楼层
armstrong 发表于 2020-4-15 19:12
技术总是在无尽的折腾中进步,这个我深有体会。
之前玩过几次linux,总是拿裸机开发做对比;感觉裸机很直接 ...

linux也不是拐弯抹角,那是一层层的封装,裸机的话一层层封装后会变成rtos,也会有驱动框架。上了操作系统,能实现更强大的软件功能。
在linux上搞开发,思维方式和知识都不同。如果只会裸机开发,开发思维和知识面,只能停留在一个很狭窄的区域。

出870入263汤圆

发表于 2020-4-25 12:17:31 | 显示全部楼层
redworlf007 发表于 2020-4-25 09:14
linux也不是拐弯抹角,那是一层层的封装,裸机的话一层层封装后会变成rtos,也会有驱动框架。上了操作系 ...

对的,是这么回事。所以新开发者建议从linux入手嵌入式开发,尽早培养完整的嵌入式思维方式。
我是感觉自己老了,思维方式顽固不化

出0入36汤圆

发表于 2020-4-25 20:24:45 | 显示全部楼层
armstrong 发表于 2020-4-25 12:17
对的,是这么回事。所以新开发者建议从linux入手嵌入式开发,尽早培养完整的嵌入式思维方式。
我是感觉自 ...

你玩玩新塘这种nuc972的片子,搞几天你会发现,和玩ucos差不多,写应用程序和裸机上差不多,都是瞎搞,哈哈。

出0入0汤圆

发表于 2020-4-25 21:57:23 来自手机 | 显示全部楼层
我觉得是你的代码问题,每操作一个bit都要调用一堆系统调用。其实应该分成3个函数:初始化,writebit,关闭。初始化在整个程序启动时调用一次,包括打开文件,mmap等,最终得到一个虚拟基地址。writebi函数多加一个参数,就是前面得到的虚基地址,writebit里面只有指针操作,不会再有任何系统调用。关闭函数ummap和close,在程序退出前执行一次。

出0入0汤圆

 楼主| 发表于 2020-4-25 22:20:46 | 显示全部楼层
at90s 发表于 2020-4-25 21:57
我觉得是你的代码问题,每操作一个bit都要调用一堆系统调用。其实应该分成3个函数:初始化,writebit,关闭 ...

感谢回复,想到过这个问题。由于改动比较多,人比较懒,当时没有改。有时间我会试一下。不知道这样操作虚拟地址,和在裸奔中直接操作寄存器速度差多少
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 23:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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