香蕉派5110显示系统信息

作者: tjcfeng
上传时间为: 2014-10-17 09:10 AM

很希望香蕉派在运行某些大程序的时候能够看到一些信息,但是又不想占用屏幕怎么办?自己做个程序来实现它。

一般在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没来得及改,就是显示新数据时应该先清除原先显示的数据):
http://pan.baidu.com/s/1eQrdoJo

Lazarus另一点优势就是“一次编写,到处编译”,什么Windows、Linux、IOS、WinCE、ArmLinux、Android。。。。通吃,并且是原生代码(可不像java之类的虚拟机呀),而且继承了Delphi的即拷即用,不用安装一大堆的运行库。
这个压缩包中已经包括了可以执行文件,直接运行就可以看到效果。由于包括了调试信息,这个文件比较大,可以在终端中执行一下strip SysInfo,去掉这些调试信息,体积可减少10倍。

全部评论 ()

创建讨论帖子

登录 后参与评论
系统提示