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

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

3天内不再提示

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

电子发烧友william hill官网 来源:未知 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寄存器,进一步优化速度。


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


版权说明:

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





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


更多热点文章阅读

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

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

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

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

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


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

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

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

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

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

收藏 人收藏

    评论

    相关推荐

    哪些专业适合学习嵌入式开发?

    哪些专业适合学习嵌入式开发? 在传统行业不断被取代的当下,对于大学生、从业者而言,选择一个热门主流的职业方向,是未来发展的关键因素之一。 嵌入式作为当下高薪岗位之一,转行、转专业的人群已经占据求职
    发表于 01-03 13:44

    嵌入式开发必备-RK3562演示Linux常用系统查询命令(上)触觉智能出品

    实用干货!嵌入式开发学习必备-RK3562演示Linux常用系统查询命令(上)关注触觉智能持续为大家带来更多嵌入式开发内容
    的头像 发表于 12-31 10:51 117次阅读
    <b class='flag-5'>嵌入式开发</b>必备-RK3562演示Linux常用系统查询命令(上)触觉智能出品

    Made with KiCad(九十四):M5Pi Linux嵌入式开发

    “ 波哥大作,必须优先安排!M5Pi 是一款开源 Linux 嵌入式开发板,使用全志 F1C200s CPU,拥有漂亮的外壳。”
    的头像 发表于 12-25 14:53 134次阅读
    Made with KiCad(九十四):M5Pi Linux<b class='flag-5'>嵌入式开发</b>板

    如何使用 RISC-V 进行嵌入式开发

    、准备开发环境 选择开发板 :RISC-V架构的嵌入式开发板有多种选择,如GD32VF103R-START、飞凌嵌入式OK113i-S等。选择时需要考虑
    的头像 发表于 12-11 17:32 565次阅读

    基于Xilinx ZYNQ7000 FPGA嵌入式开发实战指南

    电子发烧友网站提供《基于Xilinx ZYNQ7000 FPGA嵌入式开发实战指南.pdf》资料免费下载
    发表于 12-10 15:31 2次下载

    一文了解嵌入式软件开发的对象

    以前应用场景很单一,嵌入式开发可能谈不上面向对象开发。但现在,做嵌入式开发,没有面向对象开发,你就有点落伍了。 本文结合个人经验和周立功《抽象接口技术和组件
    的头像 发表于 11-15 10:31 365次阅读
    一文了解<b class='flag-5'>嵌入式</b>软件<b class='flag-5'>开发</b>的对象

    零基础嵌入式开发学习路线

    嵌入式开发”没有接触过的同学可能会不明觉厉,但是只要你了解了,感兴趣并且有一个正确的学习路线的话,零基础也能入门。给大家介绍一个简单易懂的学习路线,让你能够从零开始学习嵌入式开发。 第一步:掌握
    发表于 10-25 15:55

    嵌入式开发常见问题排查

    嵌入式开发问题排查很多人认为嵌入式开发很难,主要是因为在这个过程中常常会遇到各式各样的问题。这些问题的复杂性和多样性使得许多人感到困惑和无所适从。然而,如果将这些问题逐一拆解,实际上大部分都可以
    的头像 发表于 09-22 08:04 351次阅读
    <b class='flag-5'>嵌入式开发</b>常见问题排查

    嵌入式linux开发的基本步骤有哪些?

    之前,首先需要选择合适的硬件平台。硬件选择需要考虑以下几个方面: 1.1 处理器 嵌入式Linux开发需要一个处理器,常见的处理器有ARM、MIPS、PowerPC等。选择处理器时,需要考虑处理器的性能、功耗、成本等因素。 1.
    的头像 发表于 09-02 09:11 520次阅读

    聚焦嵌入式开发中的合规性工具、项目管理工具、版本迭代工具应用

    日前,龙智携嵌入式开发及管理解决方案亮相2024上海国际嵌入式展(embedded world China 2024)。展会期间,我们对话了多位龙智资深DevSecOps顾问及技术支持专家
    的头像 发表于 07-29 15:15 570次阅读

    嵌入式开发前景怎么样?

    嵌入式开发前景非常广阔,这主要得益于物联网、人工智能、大数据等技术的快速发展,以及嵌入式系统在各个领域的广泛应用。以下是对嵌入式开发前景的详细分析
    的头像 发表于 07-10 09:00 2755次阅读
    <b class='flag-5'>嵌入式开发</b>前景怎么样?

    嵌入式开发者的未来

    嵌入式系统的就业方向非常广泛,涵盖了许多不同的行业和领域。以下是一些常见的嵌入式系统就业方向:消费电子产品:这包括智能手机、平板电脑、智能电视、智能家居设备等。嵌入式系统工程师可以参与设计、
    的头像 发表于 06-23 08:10 385次阅读
    <b class='flag-5'>嵌入式开发</b>者的未来

    嵌入式开发就业前景怎么样?

    和医疗器械使用经验。 3)工业控制 工业控制是指通过各种控制设备和系统,对工业生产过程进行监测、控制和优化。随着工业自动化和智能化的发展,工业控制领域对嵌入式开发的需求也在不断增加。在工业控制领域
    发表于 06-07 14:51

    ARM Cortex-A53嵌入式开发平台Android手册

    电子发烧友网站提供《ARM Cortex-A53嵌入式开发平台Android手册.pdf》资料免费下载
    发表于 04-28 15:10 0次下载

    fpga是嵌入式开发

    FPGA(现场可编程门阵列)与嵌入式开发之间确实存在一定的关联,但它们在本质上是两个不同的领域。
    的头像 发表于 03-15 14:18 1063次阅读