[资料分享] 【转发自己写的】谈谈MCUGUI需求

辛昕   2017-12-6 09:50 楼主
转自创易栈:谈谈MCUGUI(需求篇)
事实上,MCUGUI并不是一个专有名词,百度谷歌都搜不到,它指的是在MCU(为主控的)平台上实现GUI。我们之所以会有这个称呼,是因为它很特殊:
从业者都知道,图形图像是一个对时间对空间开销都很巨大的应用领域而MCU,却是一种资源紧缺型系统:相比于个人PC,内存在几个G,主频也同样高达G而言,MCU的FLASH,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,一个是SKIA(google开源的))。但仍未完成。
矢量缩放
这个算法与旋转类似,差别在于可以在sin cos前面加一个线性系数,但我们把它和旋转区分开来,原因在于我们在缩放的同时不需要做旋转,最多只有直线移动,因此,比起旋转算法,它免除了密集运算的三角函数,但同样需要线性插补。
淡入淡出
这个相对简单,只要在硬件上对背光LED施加PWM控制,改变亮度即可。
如果遇到不需要背光的OLED,则会更加简单,直接改写背光值即可。
总的来说,上述的图形变换算法,它们的主要要求是 涉及大量浮点,数学运算,所以需要找一个比较好的性能指标,来衡量这颗MCU的计算能力。
最后,是功耗。
对于大多数用到了复杂图形应用的设备来说,大多数时候,功耗是不要求的,比如前面提到的工控机,他们基本都是220V供电,但是到了智能穿戴,就不一样。
功耗往往是最最最重要的性能参数。
而功耗,实际上是两方面的考量:
一方面选择动态功耗尽可能低(在保证其性能计算力的情况下,比如带浮点的m4f内核)
另一方面是,与大多数低功耗MCU的策略是一样的,尽可能让图形部分快速完成处理运算工作,然后进入休眠低功耗状态。这又和前面的运算速度,主频的选择有密切关系。
文章版权归创易栈所有,转载需注明出处
本帖最后由 辛昕 于 2017-12-6 09:55 编辑
强者为尊,弱者,死无葬身之地

回复评论 (1)

基本几何图形绘制:
1.圆/椭圆;
2.更快速的,带抗锯齿的旋转;
这是我目前最关心的。

另外,特别的,一定要可支持rgb16,这对于MCU,是一个显存上的巨大节省。或者,如果本身不支持,应可比较方便的修改为 支持。
强者为尊,弱者,死无葬身之地
点赞  2017-12-6 10:00
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复