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

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

3天内不再提示

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

电子发烧友论坛 来源:未知 2023-06-13 08:15 次阅读

电子发烧友技术探索官,分享你的原创电子行业文章!

本期为大家带来一篇嵌入式开发性能优化案例,感兴趣的小伙伴可以关注作者一起学习哦~

本期推

专栏作者嵌入式USB开发(点击查看作者主页)

介绍:本专栏介绍嵌入式USB开发,理论结合实践,不单纯讲USB协议,而是以具体的实例进行讲解

前言

我们之前进行了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


{


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%


-从上可以看出不管用什么编译器优化,经过上面方式人工优化后的代码都不差不多,660661,说明编译器已经无法对我们优化后的代码再进行优化

- 说明我们人工优化的代码不使用编译器优化也有很好的速度性能。

-不同的编译器优化对原来的代码影响较大-ofast执行时间从908变为了782。

-哪怕是采用-ofsat编译器优化,我们人工优化的代码依然还有比编译器优化的代码快15.6%,所以编译器优化无法替代人工优化。

-只有从设计角度去优化,避免依赖编译器优化才是根本方案。

总结

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

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

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


原文地址:https://www.elecfans.com/d/2101849.html


版权说明:

本内容为作者发布至电子发烧友平台原创文章,相关创作版权归原作者所有,如未经作者授权,禁止转载!





声明本文由电子发烧友社区发布,转载请注明以上来源。如需社区合作及入群交流,请添加微信EEFans0806,或者发邮箱liuyong@huaqiu.com。


更多热点文章阅读

  • 采用先进成熟工艺和自主产权体系结构,紫光同创FPGA开发板入门指导

  • 嵌入式Linux开发秘籍!工程师大佬亲历分享项目样例

  • RK3568!四核64位ARMv8.2A架构,汇聚编译源码及实战样例

  • 尺寸仅有21mm*51mm,板边采用邮票孔设计,合宙 Air105 核心板开发总结

  • 基于Cortex-M3内核的32位微控制器STM32项目实战分享!


原文标题:【专栏精选】嵌入式开发极致性能优化案例

文章出处:【微信公众号:电子发烧友论坛】欢迎添加关注!文章转载请注明出处。

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

原文标题:【专栏精选】嵌入式开发极致性能优化案例

文章出处:【微信号:gh_9b9470648b3c,微信公众号:电子发烧友论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式开发学习的十三法则分享

    嵌入式开发学习是一个不断积累和总结的过程,来自一个嵌入式开发高级工程师为我们总结的关于嵌入式开发学习的十三法则,大家不妨参考一下: 一、冗余度法则 在嵌入式系统具有足够的冗余度
    发表于 12-21 06:32

    嵌入式开发为什么需要输出调试信息?

    嵌入式开发为什么需要输出调试信息? 因为输出调试信息是嵌入式开发中一项非常重要的实践,它有助于保证软件的可靠性、稳定性和性能,也是故障排查的关键工具之一。 嵌入式开发输出调试信息主要
    发表于 11-28 16:46

    c语言嵌入式开发

    电子发烧友网站提供《c语言嵌入式开发.zip》资料免费下载
    发表于 11-17 14:11 2次下载
    c语言<b class='flag-5'>嵌入式开发</b>

    嵌入式开发系统基础知识

    电子发烧友网站提供《嵌入式开发系统基础知识.pdf》资料免费下载
    发表于 11-17 10:59 0次下载
    <b class='flag-5'>嵌入式开发</b>系统基础知识

    嵌入式开发学习路线

    电子发烧友网站提供《嵌入式开发学习路线.doc》资料免费下载
    发表于 11-17 10:13 12次下载
    <b class='flag-5'>嵌入式开发</b>学习路线

    嵌入式开发学习路线分享

    的实际应用范畴,可以说目前市场上对嵌入式开发人才的需求越来越大,很多小伙伴都想通过培训学习的方式走向嵌入式开发相关的岗位。下面,小编就给各位小伙伴介绍一个简单易懂的学
    的头像 发表于 11-15 11:51 657次阅读
    <b class='flag-5'>嵌入式开发</b>学习路线分享

    windows ce嵌入式开发入门-基本Xscale架构

    电子发烧友网站提供《windows ce嵌入式开发入门-基本Xscale架构.pdf》资料免费下载
    发表于 11-10 11:18 0次下载
    windows ce<b class='flag-5'>嵌入式开发</b>入门-基本Xscale架构

    嵌入式开发入门学习

    电子发烧友网站提供《嵌入式开发入门学习.doc》资料免费下载
    发表于 10-26 09:37 1次下载
    <b class='flag-5'>嵌入式开发</b>入门学习

    Linux系统的嵌入式开发是什么

    嵌入式开发听起来很高大上,但其实它就在我们身边。   嵌入式开发是指将操作系统、应用程序或数据存储在嵌入式设备中,如手机、平板电脑、智能家居等。   随着物联网时代的到来,嵌入式开
    的头像 发表于 10-12 15:40 1031次阅读

    什么是嵌入式Linux?

    发展需要不断进化。随着芯片性能的增强和社会变革的需要,嵌入式系统越来越承接更多、更复杂的功能,所以嵌入式开发也以高薪稳定的状态稳坐在就业的顶端。(相较于其他行业,嵌入式工程师的工资在同
    发表于 10-11 13:47

    STM32嵌入式开发中的RTOS,你用过哪些?

    STM32嵌入式开发中的RTOS,你用过哪些?
    的头像 发表于 09-18 16:21 821次阅读
    STM32<b class='flag-5'>嵌入式开发</b>中的RTOS,你用过哪些?

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

    我们之前进行了TFT刷屏测试确认了基本功能。刷屏速度是决定GUI显示帧率最根本的一环,只有优化极致的刷屏速度,才能有基础实现更好效果的GUI。本篇就进行刷屏的优化,其实其思想是通用的,对于其他代码也可以参考。
    的头像 发表于 06-08 11:06 940次阅读
    <b class='flag-5'>嵌入式开发</b><b class='flag-5'>极致</b><b class='flag-5'>性能</b><b class='flag-5'>优化</b>案例

    什么人适合学习嵌入式开发

    到底什么专业的人适合学嵌入式?或从事过自动化相关工作的人员,适合参加嵌入式学习吗?等等系列问题,接下来就问大家一一解答:究竟什么样的人才适合学习嵌入式开发嵌入式简单来讲,就是软硬
    发表于 06-07 15:55

    嵌入式开发成本高的原因有哪些

    这里先问下大家:你觉得嵌入式开发成本高吗? 答案:是的,对于普通人来说,很高。当然,部分富豪除外。 下面给大家罗列一下嵌入式开发成本高的几点原因。
    的头像 发表于 06-02 10:24 611次阅读
    <b class='flag-5'>嵌入式开发</b>成本高的原因有哪些

    专栏精选】Cortex-M 的反编译入门

    查看作者主页) 介绍:该专栏主要介绍嵌入式开发相关的知识,与大家一起交流学习。    我们在写 单片机 裸机程序时,在主函数之前,会有一段启动代码,而启动代码是用 汇编 写的,有些朋友可能看到汇编头都大了,当时要想深入研究底层
    的头像 发表于 05-16 09:35 903次阅读