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

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

3天内不再提示

嵌入式系统中的优化技巧

电子工程师 来源:单片机匠人 作者:黄忠老师 2021-08-13 15:41 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

嵌入式系统中由于资源比较有限,特别是内存资源,因此对程序运行的性能要求比较高。对执行效率高的程序段所占用的空间和运行效率进行全方位的优化,可以对程序运行的整体效率将产生可观的提升。

1、循环缓冲区

在一些嵌入式的系统中,常常需要开辟一块缓冲区保存数据。例如:对于数据采集系统,需要将一定时间段内的数据放入一个内存区域中。这个内存区域的放置方法是从低地址开始放置,如果放满了(到达了最高的地址),则需要从头部的低地址开始重新放置。这样的内存结构就组成了一个循环缓冲区。

在一般的嵌入式处理器中没有硬件自动完成循环放置的功能,通常的做法是在程序的每次循环中都判断缓冲区是否放满了,显然这样的开销很大。

如果要在程序中执行缓冲区类型的操作,这些操作一般需要占用一块连续的内存。在栈上分配的内存,一般只能在函数内部使用,函数退出的时候就会被释放,因此不适合作为缓冲区使用。而在堆上的内存和静态内存都可以作为缓冲区内存使用。

我们举例来看下:

#define BUFFERSIZE 256

int x[BUFFERSIZE];

unsigned int k;

unsigned int i;

while(1)

{

k = i & (BUFFERSIZE-1);

x[k] = ImputData();

/*……*/

i++;

}

从程序中可见,数组x[]是作为程序的缓冲区使用的,而由于开始并没有进行数组的初始化,x[]是一个建立在BSS段上的数组,其大小由BUFFERSIZE确定。

我们看循环内的操作,可以完成自动循环的过程,这个例程中,当i增加到256的时候,k作为数组下标,又会返回为0,i本身增加到最大值的时候也会变为0。

那么大家很容易看出来,由于不需要使用if做判断,可以节省几条程序指令的时间。对于这几条指令看似节省的时间不多,但是由于上述语句执行的频率非常高,所以这些时间的节省占程序总运行时间的权重还是比较大的。尤其对于实时采样处理问题,程序必须在指定时间内完成一系列的操作。所以对于执行效率比较高的指令,哪怕只节省一条指令,对运行效率的提高都是很有意义的。

从以上的例子中可以看出,当进行程序优化的时候,不仅需要考虑程序段运行的绝对时间,还应该考虑程序段运行的频率。对于运行频率非常高的程序,对其进行优化会在很大的程度上提高系统的性能。

2、查表法

由于资源有限,程序的运行效率在嵌入式系统上比在PC上的程序开发更为重要。程序的运行速度和所占用的存储器空间这两个效率问题都是必须考虑的。嵌入式系统程序的运行速度与处理器频率有关系;而程序所能占用的存储器空间与ROMRAM的大小有关系。

在当前的嵌入式系统中,程序的运行速度比程序所占用的存储器空间显得更重要,一是存储器方便扩展,二是存储器的容量是比较容易控制,程序运行占用的处理器时间比较难控制。

在设计过程中,程序的容量和速度在很多时候是有些矛盾的,在程序中牺牲一定的存储容量换取程序的运行速度,这对于嵌入式系统来说是有一定好处的。典型的例子就是查表法。

例如:在一个4位的二进制数中,确定有几位为1,也就是要统计0x0~0xf中的任何一个数,中间有几个1。

典型的思路就是使用循环的方法让程序在这个4位的数中依次查找各个位是否为1,最后累加得出1的数目。那么在实现这个简单的功能的过程中,需要进行4次循环、4次判断,这是有一定开销的,占用了不少处理器的时间。从程序需要实现的功能考虑,输入是一个4位的数,范围是0x0~0xf,输出数的范围是0~4,这实际上是完成了一种映射功能,可以换成第二种查表法的思路,就是构造一个16个元素的数组,可以通过数组得到结果。实际上数组的下标就是输入的数值,而数组的元素就是输出的数值。

那么很容易看出来,这种做法的优点是每个数值的获取非常快,代价则是增加了一个有16个元素的数组。数组是预先固化好的常量,而不是程序动态生成的,这种利用静态空间换取程序执行时间的方式转换后的程序执行效率非常高。如果把它应用在使用频率很高的程序中,就可以节省很多的系统开销。

同样,大家可以考虑一下如果是查找8位数中的1的个数怎么做?16位呢?如果变通。

3、针对循环执行效率的优化

循环是C语言程序中的常用语法功能,由于循环执行的次数较多,占程序执行时间的权重大,所以对循环的优化是提高程序效率的关键点。

例如,

void change_list_value()

{

int i,count;

POSITION pos;

CPtrList* plist;

plist = get_start(pos);

for(i = 0; i < get_count(); i++)     count = get_count();      

{ for(i = 0; i < count ; i++)

plist = get_next(pos); {}

set_val (plist);

}

return 0;

}

上面这个循环代码左边是原始写法,右边是改进的。可以发现循环中执行的函数减少了,原来的get_count()函数从原来的内部转移到了循环外部,也就是说这个循环函数改进后只执行一次,如果这个链表中的元素有几千个至几万个,那么第一段代码比第二段代码多执行了几千条几万条的语句,这样会导致时间上巨大的开销。

总结:在循环系统中,针对于循环条件,应该尽可能地使用临时变量来替代函数调用,这样可以在循环次数较多的情况下,减少大量不必要的函数调用。

你有没有更好的优化技巧也分享出

责任编辑:haq

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

    关注

    5186

    文章

    20148

    浏览量

    328841
  • 程序
    +关注

    关注

    117

    文章

    3836

    浏览量

    84762

原文标题:程序的优化技巧

文章出处:【微信号:CanaanTech,微信公众号:嘉楠科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    嵌入式系统的定义和应用领域

    嵌入式系统,简而言之,就是一种专为特定设备或装置设计的计算机系统。它们通常配备一个嵌入式处理器,其控制程序被存储在ROM。这些
    发表于 11-17 06:49

    嵌入式开发的关键点介绍

    嵌入式开发在现代科技扮演着非常重要的角色。随着物联网的发展,嵌入式系统的需求也越来越大。嵌入式开发不仅需要开发人员具备深入的硬件知识和编程
    发表于 11-13 08:12

    嵌入式实时操作系统的特点

    、VxWorks 和 QNX Neutrino 等,它们被广泛应用于汽车电子、工业自动化、医疗设备、消费电子和物联网等领域的嵌入式系统
    发表于 11-13 06:30

    运行在嵌入式系统上的emApps

    在当今快节奏的嵌入式系统世界,灵活性和适应性是嵌入式系统实现的关键。SEGGER推出了其最新创新:Embedded apps(emApps
    的头像 发表于 06-18 09:53 620次阅读
    运行在<b class='flag-5'>嵌入式</b><b class='flag-5'>系统</b>上的emApps

    Python在嵌入式系统的应用场景

    你想把你的职业生涯提升到一个新的水平?Python在嵌入式系统中正在成为一股不可缺少的新力量。尽管传统上嵌入式开发更多地依赖于C和C++语言,Python的优势在于其简洁的语法、丰富的库和快速的开发周期,这使得它在某些
    的头像 发表于 03-19 14:10 1191次阅读

    嵌入式系统存储的软件优化策略

    嵌入式系统开发领域,存储器作为信息交互的核心载体,其技术特性直接影响着系统性能与稳定性。然而,有些人在面对Linux、安卓等复杂操作系统环境时,理解其存储机制尚存局限,为突破这些技术
    发表于 02-28 14:17

    嵌入式系统的代码优化与压缩技术

    在当今数字化时代,嵌入式系统广泛应用于各个领域,从智能家居设备到工业控制系统,从汽车电子到可穿戴设备,它们无处不在。而在嵌入式系统开发
    发表于 02-26 15:00

    如何提高嵌入式代码质量?

    的错误和改进点,提高代码的可读性和健壮性。 4. 版本控制:使用版本控制系统如Git,可以追踪代码变更并轻松进行团队协作,确保每个版本都是可控和可重现的。 优化性能和资源利用率 在嵌入式
    发表于 01-15 10:48

    嵌入式主板的概述与发展

    随着科技的迅猛发展,嵌入式系统在现代电子产品扮演着越来越重要的角色。嵌入式主板作为嵌入式系统
    的头像 发表于 01-13 16:30 1185次阅读
    <b class='flag-5'>嵌入式</b>主板的概述与发展

    MPU在嵌入式系统的应用

    一、MPU的基本功能 微处理器单元(MPU)是嵌入式系统的大脑,负责执行程序指令、处理数据和控制其他硬件设备。MPU的基本功能包括: 指令执行:MPU能够从存储器读取指令,解码这些
    的头像 发表于 01-08 09:26 1500次阅读

    如何优化EEPROM的数据存储策略

    。它广泛应用于需要存储少量数据的场合,如微控制器、传感器和嵌入式系统优化EEPROM的数据存储策略可以提高数据的可靠性、延长存储器的使用寿命,并提高数据访问效率。以下是一些
    的头像 发表于 12-16 17:21 2029次阅读

    LDO在嵌入式系统的应用 常见LDO故障及解决方法

    LDO在嵌入式系统的应用 LDO(Low Dropout Regulator,低降压线性稳压器)是一种常用的电源管理集成电路,它在嵌入式系统
    的头像 发表于 12-13 09:08 3081次阅读

    新手怎么学嵌入式?

    基本的概念。嵌入式系统是一种将计算机技术嵌入到特定设备系统,它通常具有特定的功能和有限的资源。你需要学习一些计算机基础知识,如数据结构、
    发表于 12-12 10:51

    什么是嵌入式人工智能

    嵌入式人工智能是指将人工智能技术应用于嵌入式系统的一种技术。嵌入式系统
    的头像 发表于 12-11 09:23 1519次阅读
    什么是<b class='flag-5'>嵌入式</b>人工智能

    嵌入式系统开发与硬件的关系 嵌入式系统开发常见问题解决

    嵌入式系统开发与硬件的关系 嵌入式系统是专为特定应用设计的计算机系统,它们通常嵌入在所控制的设备
    的头像 发表于 12-09 09:38 1467次阅读