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寄存器,进一步优化速度。

审核编辑:汤梓红

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

    关注

    5103

    文章

    19265

    浏览量

    309968
  • 嵌入式开发
    +关注

    关注

    18

    文章

    1046

    浏览量

    47897
  • GUI
    GUI
    +关注

    关注

    3

    文章

    666

    浏览量

    40140
  • 性能优化
    +关注

    关注

    0

    文章

    18

    浏览量

    7461
收藏 人收藏

    评论

    相关推荐

    嵌入式开发圣经

    嵌入式系统开发圣经:嵌入式开发圣经
    发表于 03-25 13:08 88次下载

    基于ARM的嵌入式开发

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

    嵌入式开发

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

    嵌入式开发之旅笔记

    嵌入式开发之旅笔记
    发表于 09-08 10:01 10次下载
    <b class='flag-5'>嵌入式开发</b>之旅笔记

    如何简化嵌入式开发项目

    如何简化嵌入式开发项目
    发表于 10-24 10:16 13次下载
    如何简化<b class='flag-5'>嵌入式开发</b>项目

    关于嵌入式开发杂谈

    关于嵌入式开发杂谈
    发表于 10-31 15:39 8次下载
    关于<b class='flag-5'>嵌入式开发</b>杂谈

    嵌入式开发入门_学嵌入式开发需要看哪些书籍

    现在嵌入式开发越来越吃香,很多人都想要学习却不知道要从何下手。本文分析了学习嵌入式软件开发需要具备哪些基本知识和技能,开发学习的基本步骤,并给出了各种参考资料及网站,同时小编还推荐了学
    的头像 发表于 04-04 10:25 2.9w次阅读

    嵌入式开发好学吗_嵌入式开发职业发展方向是什么

    本文首先来了解一下嵌入式前景及薪资待遇,其次解答了嵌入式开发好学不好学的问题,最后阐述了嵌入式开发必会知识以及嵌入式开发职业的四大发展方向,具体的跟随小编一起来了解一下。
    的头像 发表于 05-18 16:41 9307次阅读

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

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

    嵌入式开发(一):嵌入式开发新手入门

    本篇文章整理下嵌入式开发中一些入门的基础技能,都是根据以往的工程经验整理,适用于之前没做过嵌入式开发的新手。嵌入式开发流程一般如下,一般是在PC机的Windows系统下安装Ubuntu虚拟机,搭建
    发表于 10-14 10:58 79次下载
    <b class='flag-5'>嵌入式开发</b>(一):<b class='flag-5'>嵌入式开发</b>新手入门

    嵌入式开发资料免费分享

    嵌入式开发资料免费分享嵌入式工程师经验分享:如何学习嵌入式开发截取文档部分学习嵌入式工程师经验分享的资料分享给大家,文档上从、嵌入式系统的概
    发表于 10-21 11:07 47次下载
    <b class='flag-5'>嵌入式开发</b>资料免费分享

    python做嵌入式开发_Python和嵌入式的区别是什么?可以做嵌入式开发吗?

    从概念上来说,嵌入式和Python的区别还是比较明显的,嵌入式是一个开发领域,而Python则是一门编程语言。下面就来和大家说一说嵌入式和Python这两个之间的区别。
    发表于 11-02 20:21 14次下载
    python做<b class='flag-5'>嵌入式开发</b>_Python和<b class='flag-5'>嵌入式</b>的区别是什么?可以做<b class='flag-5'>嵌入式开发</b>吗?

    嵌入式开发培训学什么?嵌入式开发板知识讲解

    嵌入式开发就是指在嵌入式操作系统下进行开发,一般常用的系统有WinCE,ucos,vxworks,linux,android等。另外,用c,c++或汇编开发;用高级处理器,arm7,a
    发表于 11-02 20:21 16次下载
    <b class='flag-5'>嵌入式开发</b>培训学什么?<b class='flag-5'>嵌入式开发</b>板知识讲解

    嵌入式开发蜂鸣器代码

    嵌入式开发蜂鸣器代码
    发表于 03-29 17:04 3次下载

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

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