C++性能优化笔记-16-嵌入式系统中的优化

嵌入式系统中的优化


小型嵌入式应用中使用的微控制器的计算资源少于标准PC。时钟频率可能比标准PC低一百倍甚至一千倍;内存量甚至可能比PC机少一百万倍。然而,如果您避免大型图形框架、解释器、即时编译器、系统数据库和其他通常在大型系统上使用的额外软件层和框架,就有可能使软件在如此小的设备上运行得相当快。

系统越小,选择使用很少资源的软件框架就越重要。在最小的设备上,您甚至没有操作系统。

最好的性能是通过选择一种可以在PC机上交叉编译的编程语言,然后把机器代码传输到设备上。任何需要在设备上编译或解释的语言都是对资源的巨大浪费。由于这些原因,首选语言通常是C或C++。关键设备驱动程序可能需要汇编语言。

如果遵循下面的指导原则,C++只需要比C稍微多的资源。可以根据最适合的程序结构选择C或C++。

节约内存是很重要的。大数组应该在使用它们的函数中声明,以便在函数返回时释放它们。或者,可以将同一数组用于多种用途。

应避免使用new/deletemalloc/free进行动态内存分配,因为管理内存堆的开销很大。堆管理器有一个垃圾收集器,它可能以不可预测的时时间消耗,这可能会干扰实时应用程序。

请记住,STL(标准模板库)和其他容器类库中的容器类使用带有newdelete的动态内存分配,而且通常过于频繁。除非您有足够的资源,否则绝对应该避免使用这些容器。例如,FIFO队列应实现为具有固定大小的循环缓冲区,以避免动态内存分配。不要使用链表(参考优化存储访问)。

字符串类的所有常见实现都使用动态内存分配。应该避免这些,并以C风格进行字符数组处理。请注意,C的字符串函数没有检查数组是否溢出。程序员有责任确保数组足够大以处理字符串,包括终止零,并在必要时进行溢出检查(参见优化存储访问)。

C++中的虚拟函数比非虚函数占用更多的资源。尽可能避免使用虚拟函数。

较小的微处理器没有浮点执行单元。在这种处理器上的任何浮点操作都需要一个非常耗时的浮点库。因此,应该避免使用浮点表达式。例如,a=b*2.5可以更改为a=b*5/2(注意中间表达式b*5上可能存在溢出)。只要程序中有一个带小数点的常量,就需要加载整个浮点库。例如,如果你想用两个小数来计算一个数字,你应该把它乘以100,以便可以表示为一个整数。

整数变量可以是8、16或32位(很少是64位)。如有必要,您可以通过使用在特定应用程序中使用不会溢出的最小整数大小来节省RAM空间。整数大小没有跨平台标准化。有关每个整数类型的大小,请参阅编译器文档。

中断服务例程和设备驱动程序尤其重要,因为它们可以阻止其他所有操作的执行。这通常属于系统编程领域,但在没有操作系统的应用程序中,这是应用程序程序员的工作。在没有操作系统的情况下,程序员忘记系统代码是非常关键的风险更高,因为系统代码没有与应用程序代码分离。中断服务程序应尽可能少做工作。通常,它应该将一个单位的接收数据保存在静态缓冲区中,或者从缓冲区发送数据。它不应响应命令或执行其所服务的特定事件以外的其他输入/输出。中断接收的命令最好以较低的优先级响应,通常在主程序的消息循环中响应。有关系统代码的进一步讨论,请参见特殊优化主题

描述了一些在资源有限的小型设备上特别重要的注意事项。其他的大多数建议也与小型设备有关,但存在一些差异:

  • 较小的微控制器没有分支预测(参考分支)。软件中不需要考虑分支预测。
    •较小的微控制器没有缓存(参考存储访问)。无需组织数据来优化缓存。
    •较小的微控制器没有无序执行。没有必要打破依赖链(参考依赖链)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值