0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式开发极致性能优化案例

嵌入式USB开发 来源:嵌入式USB开发 作者:嵌入式USB开发 2023-06-08 11:06 次阅读

本文转自公众号,欢迎关注

嵌入式开发极致性能优化案例

前言

我们之前进行了TFT刷屏测试确认了基本功能。刷屏速度是决定GUI显示帧率最根本的一环,只有优化到极致的刷屏速度,才能有基础实现更好效果的GUI。本篇就进行刷屏的优化,其实其思想是通用的,对于其他代码也可以参考。

1. 减少if条件判断

if等条件判断会导致分支处理,一方面会增加指令,尤其是跳转指令一般执行时间比一般指令长,另外也会影响流水线和cache。

if(Data&0x80)


  LCD_SDA_SET; //输出数据


else LCD_SDA_CLR;

改为串行操作

#define LCD_SDA_SET_VAL(val) LCD_CTRLB- >BSRR=val;LCD_CTRLB- >BRR=val^LCD_SDA

2. 使用寄存器变量

频繁操作的局部变量尽量使用寄存器进行缓存,避免反复从内存去加载,寄存器直接操作速度快很多。

register unsigned int data;

3. 空间换时间 8次for循环改为 直接8次操作

其实在memcpy等处理中也是类似操作,比如连续8次读写组合一起,再循环。以减少for判断次数,也利于内部cache流水线处理,有一些cpu还有burst处理,这也是有利的。

inline void SPI_WriteDataF(unsigned char Data)


{


#if 0


unsigned char i=0;


for(i=8;i >0;i--)


{


if(Data&0x80)


  LCD_SDA_SET; //输出数据


else LCD_SDA_CLR;





LCD_SCL_CLR;       


LCD_SCL_SET;


Data< <=1;


}


#else


//LCD_SDA_LOCK;


register unsigned int data = (Data & 0x80) < < 0;


LCD_SDA_SET_VAL(data);


LCD_SCL_CLR;       


LCD_SCL_SET;




data = (Data & 0x40) < < 1;


LCD_SDA_SET_VAL(data);


LCD_SCL_CLR;       


LCD_SCL_SET;




data = (Data & 0x20) < < 2;


LCD_SDA_SET_VAL(data);


LCD_SCL_CLR;       


LCD_SCL_SET;




data = (Data & 0x10) < < 3;


LCD_SDA_SET_VAL(data);


LCD_SCL_CLR;       


LCD_SCL_SET;




data = (Data & 0x08) < < 4;


LCD_SDA_SET_VAL(data);


LCD_SCL_CLR;       


LCD_SCL_SET;




data = (Data & 0x04) < < 5;


LCD_SDA_SET_VAL(data);


LCD_SCL_CLR;       


LCD_SCL_SET;




data = (Data & 0x02) < < 6;


LCD_SDA_SET_VAL(data);


LCD_SCL_CLR;       


LCD_SCL_SET;




data = (Data & 0x01) < < 7;


LCD_SDA_SET_VAL(data);


LCD_SCL_CLR;       


LCD_SCL_SET;


//LCD_SDA_UNLOCK;


#endif


}

4. 使用内联函数减少函数跳转时间

inline void SPI_WriteDataF(unsigned char Data)

函数跳转需要时间,减少函数调用即可节约时间,尤其频繁调用的函数效果明显,但是可能增加存储空间。

5. 减少for循环嵌套 双重for嵌套改为一层for

For嵌套导致多重循环嵌套判断,浪费时间,顺序执行一般是优于分支处理的。

void Lcd_ClearF(unsigned int Color) //刷新全屏           
{


unsigned int i,m;


Lcd_SetRegion(0,0,X_MAX_PIXEL-1,Y_MAX_PIXEL-1);


Lcd_WriteIndex(0x2C);


for(i=0;i< X_MAX_PIXEL*Y_MAX_PIXEL;i++)


{


 LCD_CS_CLR;


 LCD_RS_SET;


 SPI_WriteDataF(Color >>8); //写入高8位数据


 SPI_WriteDataF(Color); //写入低8位数据


 LCD_CS_SET;


 }


}

6. 减少函数调用层级

函数调用影响流水线,并且需要额外的上下文处理时间

Lcd_ClearF中直接调用SPI_WriteDataF不再调用函数LCD_WriteData_16Bit

7. 使用汇编进行优化

这个实际看情况建议先用其他方式进行优化,因为人工编写汇编代码不一定比编译器编写的好,除非非常熟悉汇编并且有明确的优化方向。

8. 速度测试

循环刷屏使用定时器记录执行多次刷屏的时间,代码见附件。

9. 编译器速度优化选项

编译器-Ofast优化

图片

执行时间分别是

660ms,782ms

我们优化后的代码快15.6%

编译器-O2优化

图片

执行时间分别是661ms,908ms

我们优化后的代码快快27.2%

  • 从上可以看出不管用什么编译器优化,经过上面方式人工优化后的代码都不差不多,660和661,说明编译器已经无法对我们优化后的代码再进行优化
  • 说明我们人工优化的代码不使用编译器优化也有很好的速度性能。
  • 不同的编译器优化对原来的代码影响较大-ofast执行时间从908变为了782。
  • 哪怕是采用-ofsat编译器优化,我们人工优化的代码依然还有比编译器优化的代码快15.6%,所以编译器优化无法替代人工优化。
  • 只有从设计角度去优化,避免依赖编译器优化才是根本方案。

总结

1.优化应该从设计上去优化而不是依赖编译器,应该先找大头,优先设计原理,算法上去优化,最后采取进行汇编等底层的优化,后者成本大效果不明显不具备可移植性等,前者成本小效果明显,不依赖于编译器。

2.建议寄存器名字和手册对应比如gpio的io锁定寄存器,头文件中是LOCK 手册里是LCKR

2.对于IO操作最好设置LOCK ODR寄存器,这样可以指定bit直接写值而其他位不修改,而不需要if else判断分别配置BRR 和BSRR,可以直接操作ODR寄存器,进一步优化速度。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5016

    文章

    18489

    浏览量

    293042
  • 嵌入式开发
    +关注

    关注

    18

    文章

    987

    浏览量

    47150
  • GUI
    GUI
    +关注

    关注

    3

    文章

    618

    浏览量

    39046
  • 性能优化
    +关注

    关注

    0

    文章

    17

    浏览量

    7412
收藏 人收藏

    评论

    相关推荐

    嵌入式开发

    本帖最后由 gk320830 于 2015-3-7 06:45 编辑 请问大家一下,我是嵌入式开发的菜鸟一枚,请问学习嵌入式开发的过程应该是怎样的?由单片机学起吗?谢谢
    发表于 12-04 22:37

    嵌入式开发的核心竞争力是什么

    的话,那ARM架构就是灵魂。在低功耗嵌入式领域,个人觉得ARM基本立于不败之地。ARM公司几乎将”标准“发挥到极致。对于工程师,嵌入式开发和CS开发有很大的不同。原因是
    发表于 05-07 15:52

    嵌入式开发要学什么内容 嵌入式开发学习路线介绍

     嵌入式开发技术曾经一直处于不温不火的状态,自物联网飞速发展之后,运用嵌入式系统的领域越发广阔。嵌入式开发技术人才也同样随着趋势需求加大。更多的年轻人选择嵌入式开发技术作为自身职场的核
    发表于 06-30 10:07

    嵌入式开发累不累?

    `嵌入式开发累不累?有人说做嵌入式开发太累,嵌入式工程师简直就是硬件工程师与软件工程师的合体!别问我是哪一类软件工程师,反正不是前端、后端、APP、测试、运维。也别问我是什么硬件工程师,电源、单片机
    发表于 09-15 16:04

    嵌入式开发是什么意思

    嵌入式开发就是指在嵌入式操作系统下进行开发,包括在系统化设计指导下的硬件和软件以及综合研发。除暂且分离硬件的EDA研发以外,侧重的就是在一定硬件条件下的系统化设计和软件研发。定义嵌入式开发
    发表于 10-28 08:35

    Java开发嵌入式开发

    首先,Java开发嵌入式开发都是目前IT行业内比较常见的开发岗位,也都有大量的从业人员,所以从就业的角度来看,学习Java开发嵌入式开发
    发表于 11-05 08:02

    嵌入式开发流程是怎样的?

    本篇文章整理下嵌入式开发中一些入门的基础技能,都是根据以往的工程经验整理,适用于之前没做过嵌入式开发的新手。嵌入式开发流程一般如下,一般是在PC机的Windows系统下安装Ubuntu虚拟机,搭建
    发表于 11-08 06:24

    究竟什么是嵌入式开发

    嵌入式开发早在10年之前笔者就读本科时,就炒得火热的概念,当时说嵌入式开发将是得到大力发展的行业。一直到最近又有物联网IoT,智能硬件的发展,嵌入式开发再次被推向风口浪尖。下面我们就简单说一下究竟
    发表于 11-08 06:13

    嵌入式开发就业方向的问题

    近几年来随着物联网的快速发展,嵌入式开发技术在我们的生活中随处可见,目前嵌入式开发工程师在市场上的需求量大,薪资也是水涨船高。上海尚观科技今天主要是想给一些嵌入式开发的初学者们,具体说说嵌入式
    发表于 11-08 07:58

    VScode嵌入式开发如何入门

    VScode嵌入式开发之入门教程1.VScode进行单片机嵌入式开发教程2.单片机开发环境的搭建3.相关技巧与设置 VScode嵌入式开发之入门教程
    发表于 11-08 08:13

    什么是嵌入式?单片机开发嵌入式开发的区别在哪

    一、初识嵌入式1.1 什么是嵌入式?1.1.1单片机开发:1.1.2嵌入式开发:1.2 单片机开发嵌入
    发表于 02-24 06:29

    基于ARM的嵌入式开发

    基于ARM的嵌入式开发:华清远见/孙天泽基于ARM的嵌入式开发内容有:ARM简介,基于ARM的嵌入式产品,ARM架构,基于ARM的嵌入式开发
    发表于 10-04 08:49 82次下载

    嵌入式开发

    嵌入式开发就是指在嵌入式操作系统下进行开发嵌入式Linux是以Linux为基础的嵌入式作业系统。这里提供了
    发表于 12-20 13:21
    <b class='flag-5'>嵌入式开发</b>

    嵌入式开发的产品有哪些_嵌入式开发的流程

    本文主要阐述了嵌入式开发的产品,其次介绍了嵌入式开发的流程。
    发表于 08-31 15:38 1.1w次阅读

    【专栏精选】嵌入式开发极致性能优化案例

    做电子发烧友技术探索官,分享你的原创电子行业文章! 本期为大家带来一篇嵌入式开发性能优化案例,感兴趣的小伙伴可以关注作者一起学习哦~ 本期推 荐 专栏作者 : 嵌入式USB开发 (点击
    的头像 发表于 06-13 08:15 466次阅读