查看: 917|回复: 0

香蕉派5110显示系统信息

[复制链接]
  • TA的每日心情
    奋斗
    2022-9-16 05:52
  • 签到天数: 1368 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2014-10-17 09:07:04 | 显示全部楼层 |阅读模式
    分享到:
    很希望香蕉派在运行某些大程序的时候能够看到一些信息,但是又不想占用屏幕怎么办?自己做个程序来实现它。
    一般在linux上开发都用C之类的比较灵活,而python还要再装开发库才能操作IO口很不爽,而且最重要的是我不会,呵呵。用了十多年的Delphi,始终割舍不下对她的感情,所以这次用她的替代品Lazarus(free pascal)找一下原来的感觉。其实道理都是相通的,语法不同而已。
    这个程序完全工作在用户态,不需要内核开发的那些东西,所以很简单。
        需要的物品:
        软件:apt-get install lazarus
        硬件:LCD5110 + 杜邦线
    Nokia 5110 LCD的数据口只有5个,再加上供电和LED,一共才8个引脚,连接方便,且屏幕小刷新快,很适合显示一些实时信息。这些引脚分别是:
    RST: 复位引脚,初始化时使用
    SCE: 片选脚,低电平选中
    D/C: 数据/命令选择脚,1数据,0指令
    SDIN(MOSI): 数据接收线,用于接收主机发送的数据或指令
    SCLK: 时钟线,确定数据/指令高低电平的结束
    LED: 背光灯,可支持PWM调光
    VCC: 供电
    GND: 地
    看着是不是有点像SPI,我管它叫半SPI(自己瞎起的名字),只有接收没有发送。
    介绍完这些,再看看杜邦线是怎样连接的吧。
    RST - PI14 SCE - PI10
    D/C - PI16
    SDIN - PH21
    SCLK - PH20


    其实原理很简单,就是按照一定时间间隔去读取系统信息然后再显示出来。只不过CPU的使用率并不是一次能够得到的,而是需要一段时间(至少两次)的差值计算出来的。
        举个实际的例子:
        从系统中得到的数据
                user        nice        system        idle        iowait        irq        softirq        stealstonlen        guestcpu        38082        627        27594        893908        12256        581                895        0                0
    这个数据是某一次获取得到的,像这样的数据需要读取两次,用第二次的值减去第一次的值计算的半分比就是CPU的使用率,计算方法为:
        used:= user +nice + system + iowait + irq + softirq + stealstonlen + guest;
        totle:= user +nice + system + idle + iowait + irq + softirq + stealstonlen + guest;
        percent:= (used2 - used1) * 100 / (totle2 - totle1);
        内存就很简单了,直接获取当前的就可以了。
        获取这些数据的两个文件是:
        CPU: '/proc/stat'
        MEM: '/proc/meminfo'
        可以使用线程、定时器等来完成,哪怕是while+sleep都可以,只不过CPU占用就大了,所以还是推荐用线程。
        不过呢,为了体现出Lazarus快速开发的优势,我直接在窗体上放了个Timer,简单省事、资源占用低。
    既然是使用5110的屏幕来显示,就要对各个引脚进行IO操作。这里最重要的不是操作方法,而是确定寄存器在用户程序中的虚拟地址。
        A20手册中给定的GPIO的基地址为0x01C20800,而PageSize为4096,所以在用户态中的地址就是整页的位置+偏移量:
        GPIO:= ($01C20800 and $FFFFF000) div PageSize;
        Offset:= ($01C20800 and $00000FFF);
        那么用户态中的地址为:
        MEM_GPIO:= fpMmap(nil, PAGE_SIZE, PROT_READ or PROT_WRITE, MAP_SHARED, FMEM, MEM_GPIO);
        其他各个配置寄存器的地址就是 GPIO + Offset + 各个寄存器的偏移量。
        程序源代码附后,先看下运行的效果图吧

    系统中的界面

    屏幕上的界面,右边空白是为磁盘空间信息预留的地方,有兴趣的自己加上吧,饼图更好看

    整体效果
        这个程序其实包括了两个显示方式,可以根据自己的需要来选择从哪里显示。
    工程代码(有个小bug没来得及改,就是显示新数据时应该先清除原先显示的数据):
        https://pan.baidu.com/s/1eQrdoJo
    Lazarus另一点优势就是“一次编写,到处编译”,什么Windows、Linux、IOS、WinCE、ArmLinux、Android。。。。通吃,并且是原生代码(可不像java之类的虚拟机呀),而且继承了Delphi的即拷即用,不用安装一大堆的运行库。
        这个压缩包中已经包括了可以执行文件,直接运行就可以看到效果。由于包括了调试信息,这个文件比较大,可以在终端中执行一下strip SysInfo,去掉这些调试信息,体积可减少10倍。
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-4-25 05:14 , Processed in 0.125113 second(s), 17 queries , MemCache On.

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

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.