分享

谈谈MCUGUI(需求篇)

 guitarhua 2018-03-17

事实上,MCUGUI并不是一个专有名词,百度谷歌都搜不到,它指的是在MCU(为主控的)平台上实现GUI。我们之所以会有这个称呼,是因为它很特殊:

从业者都知道,图形图像是一个对时间对空间开销都很巨大的应用领域而MCU,却是一种资源紧缺型系统:相比于个人PC,内存在几个G,主频也同样高达G而言,MCUFLASH,RAM通常都不超过1M,主频也不过几十上百M

因此通常而言,MCU被认为并不适合做GUI,即便做,通常也只是一些简单的菜单图形而已。

以往,MCU设备,对GUI有较大需求的主要出现在工控系统中,例如专用仪表盘,工控自动化,而它们通常有专用的图形子系统,或者是采用组态王等组态软件界面(这一类属于工控PC,通常跑的是wince等裁剪型windows,已经不能算MCU了)。

但是随着智能穿戴等智能硬件的兴起,对GUI的要求越来越高。而安卓等系统,通常在功耗和成本方面,不如MCU有优势,这就对MCU做出高质量酷炫GUI提出了要求。

 

最后有一点必须说的是:GUI涉及的范围非常多(图形变换,渲染,2D/3D),要求的效果不同,支持的分辨率不同,则对其资源的需求也大不相同,因此,讨论MCUGUI不首先定义一个需求,可以说是耍流氓。

以下,我将以我日前在做的一个智能手表项目为案例,定义一个需求,并以此为例子,试图找出一套合适的GUI软硬件方案。

 

1.支持分辨率240x240

2.颜色空间:最少支持RGB565,满足RGB888,应可支持 RGBA32位格式;

3.刷屏帧数

4.支持的特效:

平移、抖动、旋转、矢量缩放、淡入淡出

5.其他要求:

低功耗 处理速度(尤其是完成上述特效的速度);

 

面对支持的分辨率和颜色空间要求,通常最大瓶颈会出现在对RAM的需求上(通常FLASH要比RAM大好几倍,因此,只要RAM能满足要求,FLASH通常不在话下。)

 

图形系统通常都要求能支持到三个图层。

一方面,这是参考大多数图形处理方面的软硬件方案的基本要求,而我们前期在自己预研摸索中也发现,要完成平移和图形裁剪拼接,的确需要三个图层。

按三个图层,240×240 最小rgb565,一个像素点2字节,115.2 k字节,三个图层就是 337.5kB

在实际应用中阿尔法通道对于制作透明和图片套色,非常重要,一旦没有,很多效果的实现会非常麻烦。

如果要完整支持rgba,一个像素点4个字节,要求翻倍。则三个图层共计需要 675kB。

综合考虑其他,以及存储器常见的规格,圆整为1MB。考虑到大多数MCU不太可能达到这个要求,因此这里需要外接 SRAM或者DRAM。

 

对于刷新帧数,为了显示流畅,实测发现,需要到达18fps以上。

 

在特效方面,具体来说,上面提到的效果里:

平移

基本要求:特定方向,如上下左右;后期延伸:沿特定路径移动;

我们的做法,是需要平移的图片在原来显示的图片基础上做一些裁剪,比如左移就是左边是新图片,右边还保留着原图。

这个算法的要求是,最少需要两个图层,但这种情况下,刷图片只能当即刷,如果要配合其他效果或者提高速度,则需要第三个图层做显存;

 

抖动

在我们的观察和认知里,抖动就是平移的一种变形,就是在短时间内实现 来回变向、移动幅度突变的 平移,因此,只要能实现平移,这个不在话下;

 

旋转

旋转需要大量的计算三角函数(sin cos)的运算,由于每个点都要做计算,因此这个操作对时间的消耗极大。至今尝试,用MCU(带浮点算法的 M4F)强行软解仍然很慢很慢。

事实上,旋转除了上述点的映射之外,还有一个麻烦的线性插补,否则就会出现难看的锯齿。

事实上,这个算法,目前,采用MCU软解,我们仍然没有找到合适的图形算法移植。(当前,我在考虑的两个2D算法库,一个是AGG,一个是SKIAgoogle开源的))。但仍未完成。

 

矢量缩放

这个算法与旋转类似,差别在于可以在sin cos前面加一个线性系数,但我们把它和旋转区分开来,原因在于我们在缩放的同时不需要做旋转,最多只有直线移动,因此,比起旋转算法,它免除了密集运算的三角函数,但同样需要线性插补。

 

淡入淡出

这个相对简单,只要在硬件上对背光LED施加PWM控制,改变亮度即可。

如果遇到不需要背光的OLED,则会更加简单,直接改写背光值即可。

 

总的来说,上述的图形变换算法,它们的主要要求是 涉及大量浮点,数学运算,所以需要找一个比较好的性能指标,来衡量这颗MCU的计算能力。

最后,是功耗。

对于大多数用到了复杂图形应用的设备来说,大多数时候,功耗是不要求的,比如前面提到的工控机,他们基本都是220V供电,但是到了智能穿戴,就不一样。

功耗往往是最最最重要的性能参数。

而功耗,实际上是两方面的考量:

一方面选择动态功耗尽可能低(在保证其性能计算力的情况下,比如带浮点的m4f内核)

另一方面是,与大多数低功耗MCU的策略是一样的,尽可能让图形部分快速完成处理运算工作,然后进入休眠低功耗状态。这又和前面的运算速度,主频的选择有密切关系。

文章版权归创易栈所有,转载需注明出处

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多