验证RA8875的硬件绘图与使用MCU软件绘图的速度差异
来源:互联网 发布:人脸识别算法 源代码 编辑:程序博客网 时间:2024/05/18 00:59
RA8875是一块LCD驱动芯片,支持RGB接口的LCD液晶屏,提供8080时序的MCU接口;
RA8875内置了2D硬件加速功能,可以实现硬件绘制矩形,直线等功能;
本次测试就是为了验证RA8875的硬件绘图与使用MCU软件绘图的速度差异。
硬件环境:
CPU:STM32F407VE@168MHz
LCD:480x272x16bpp
测试方法:
计算1秒内填充整个屏幕的次数(FPS)
测试结果:
填充方式
帧率(FPS)
速度(Pixel/s)
备注
软件逐点填充
6
783360
软件逐行填充
63
8225280
软件矩形填充
69
9008640
硬件逐行填充1
201
26242560
先绘图,等待空闲后退出函数
硬件逐行填充2
207
27025920
进入函数先等待空闲,再绘图
硬件矩形填充1
312
40734720
先绘图
硬件矩形填充2
315
41126400
先等待
emWin(5.30)
126
16441000
自带驱动,支持硬件加速
FastGUI
201
26242560
驱动为硬件逐行填充2
说明:RA8875的硬件绘制功能,需要读取状态寄存器的BIT7,
如果该位为1说明硬件绘制没有完成,不能进行其它绘制,否则屏幕会显示不正常。
“先绘图”是指先发送硬件绘图指令,然后读取状态寄存器,等待BIT7清0后退出函数;
“先等待”是指先读取状态寄存器,等待BIT7清0后,再发送绘图指令;
测试结论:
由此可见使用RA8875的硬件绘图有着非常明显的速度优势,比使用软件绘图快了3-4倍。
附上RA8875的2D加速代码:
static void lcd_set_rect(int x1, int y1, int x2, int y2){ //窗口起始位置 lcd_command(0x30, x1); lcd_command(0x31, (x1 >> 8) & 0x3); lcd_command(0x32, y1); lcd_command(0x33, (y1 >> 8) & 0x01); //窗口结束位置 lcd_command(0x34, x2); lcd_command(0x35, (x2 >> 8) & 0x03); lcd_command(0x36, y2); lcd_command(0x37, (y2 >> 8) & 0x01);}static void lcd_wseek(int x, int y){ lcd_command(0x46, x); lcd_command(0x47, x >> 8); lcd_command(0x48, y); lcd_command(0x49, y >> 8);}static void lcd_rseek(int x, int y){ lcd_command(0x4A, x); lcd_command(0x4B, x >> 8); lcd_command(0x4C, y); lcd_command(0x4D, y >> 8);}void lcd_set_pixel(int x, int y, int pixel){ lcd_wait_ram(); lcd_wseek(x, y); lcd_command(0x02, pixel);}int lcd_get_pixel(int x, int y){ int data; lcd_rseek(x, y); LCD_CMD = 0x02; data = LCD_DATA; //dummy read data = LCD_DATA; return data;}//BTEstatic void bte_set_rect(int x, int y, int w, int h){ lcd_command(0x58, x); lcd_command(0x59, (x >> 8) & 0x03); lcd_command(0x5A, y); lcd_command(0x5B, (y >> 8) & 0x01); lcd_command(0x5C, w); lcd_command(0x5D, (w >> 8) & 0x03); lcd_command(0x5E, h); lcd_command(0x5F, (h >> 8) & 0x03);}static void bte_set_bkcolor(int color){ lcd_command(0x60, (color >> 11) & 0x1F); lcd_command(0x61, (color >> 5) & 0x3F); lcd_command(0x62, color & 0x1F);}static void bte_set_fgcolor(int color){ lcd_command(0x63, (color >> 11) & 0x1F); lcd_command(0x64, (color >> 5) & 0x3F); lcd_command(0x65, color & 0x1F);}static void bte_set_colorkey(int color){ lcd_command(0x67, (color >> 11) & 0x1F); lcd_command(0x68, (color >> 5) & 0x3F); lcd_command(0x69, color & 0x1F);}static void bte_open(int mode){ lcd_command(0x51, lcd_rop_mask | mode); lcd_command(0x50, 0x80);}static void g2d_set_rect(int x, int y, int x2, int y2){ lcd_command(0x91, x&0xFF); lcd_command(0x92, (x>>8)&0xFF); lcd_command(0x93, y&0xFF); lcd_command(0x94, (y>>8)&0xFF); lcd_command(0x95, x2&0xFF); lcd_command(0x96, (x2>>8)&0xFF); lcd_command(0x97, y2&0xFF); lcd_command(0x98, (y2>>8)&0xFF);}static void g2d_command(uint8_t cmd){ lcd_command(0x90, cmd);}void lcd_set_rop(int mode){ lcd_rop_mask = (mode & 0x0F) << 4;}void bte_fill_rect(int x, int y, int w, int h, int color){ lcd_wait_bte(); bte_set_rect(x, y, w, h); bte_set_fgcolor(color); bte_open(0x0C);}void g2d_fill_rect(int x, int y, int x2, int y2, int color){ lcd_wait_ram(); bte_set_fgcolor(color); g2d_set_rect(x, y, x2, y2); g2d_command(0xB0);}
阅读全文
0 0
- 验证RA8875的硬件绘图与使用MCU软件绘图的速度差异
- c#GDI+绘图速度的一些差异不理解
- 浅谈GRADS气象绘图软件的使用
- 使用win32编写的二维绘图软件
- 数模中常使用的Matlab绘图与Excel绘图
- 基于MATLAB GUI界面的MCU串口实时绘图设计
- 基于MATLAB GUI界面的MCU串口实时绘图设计
- 绘图类的使用
- Graphviz绘图的安装与使用
- Ubuntu下的绘图软件
- 联机绘图软件的制作
- VB和API绘图的速度比较
- 使用surface提高绘图速度
- 电脑绘图软件有哪些可以简单使用的?
- GDI+ 绘图速度与 CImage 速度比较
- 基本绘图函数的使用
- 基本绘图函数的使用
- Quartz2D绘图的基本使用
- oraclecode常用语句大全
- 关于zookeeper集群的配置问题
- HDU 5137 How Many Maos Does the Guanxi Worth(枚举+最短路径)
- HDU-1950 Bridging signals (nlogn求LIS)
- 告别Dagger2模板代码:DaggerAndroid原理解析
- 验证RA8875的硬件绘图与使用MCU软件绘图的速度差异
- starUML初识
- Ubuntu 16.04开启SSH服务
- loj #2034. 「SDOI2016」排列计数(错排)
- IntelliJ IDEA配置多个JDK
- 数据库驱动类名
- UE4 playerController和GameMode是什么?
- POJ
- 实战项目巴巴运动网要点总结