17 Optimization in embedded systems

嵌入式应用中使用的微控制器比标准个人计算机拥有更少的计算资源。时钟频率可能低于标准个人计算机的百倍甚至千倍,RAM内存的数量甚至可能少于个人计算机的百万分之一。然而,如果避免使用大型图形框架、解释器、即时编译器、系统数据库以及其他在较大系统上常用的额外软件层和框架,就有可能在这些小型设备上运行相当快速的软件。系统越小,选择使用少量资源的软件框架就越重要。在最小的设备上,甚至没有操作系统。
如果选择一种可以在个人计算机上进行交叉编译,然后作为机器码传输到设备的编程语言,则可以获得最佳性能。任何需要在设备上进行编译或解释的语言都是对资源的浪费。因此,首选的语言通常是C或C++,关键设备驱动程序可能需要汇编语言。
如果遵循下面的准则,C++所需的资源仅比C略多一些。根据所需的程序结构选择C或C++都是可以的。
节省使用RAM内存非常重要。大数组应该在使用它们的函数内部声明,这样当函数返回时它们将被释放。或者,您可以将同一个数组用于多个目的。
应该避免使用new/delete或malloc/free进行任何动态内存分配,因为管理内存堆的开销非常大。堆管理器有一个垃圾回收器,可能会在不可预测的间隔时间内消耗时间,可能会干扰实时应用程序。
请记住,标准C++容器类使用new和delete进行动态内存分配,并且通常过度使用。除非您拥有足够的资源,否则应该明确避免使用这些容器。例如,FIFO队列应该以固定大小的循环缓冲区实现,以避免动态内存分配。不要使用链表(参见第97页)。
所有常见的字符串类实现都使用动态内存分配。您应该避免使用这些类,并以传统的C风格处理文本字符串,即字符数组。请注意,C风格的字符串函数没有对数组溢出进行检查。程序员有责任确保数组足够大,可以处理包括终止零在内的字符串,并在必要时进行溢出检查(参见第105页)。
在C++中,虚函数比非虚函数所需的资源更多。如果可能的话,应该避免使用虚函数。
较小的微处理器没有本地浮点执行单元。在这些处理器上进行任何浮点操作都需要一个庞大的浮点库,非常耗时。因此,应该避免使用任何浮点表达式。例如,a = b * 2.5 可以改为 a = b * 5 / 2(注意可能对中间表达式 b * 5 进行溢出检查)。一旦程序中有一个带小数点的常量,就会加载整个浮点库。如果想要计算一个具有两位小数的数字,例如,应该将其乘以100,以便表示为整数。
整数变量可以是8位、16位或32位(很少是64位)。如果需要,在特定应用中使用不会造成溢出的最小整数大小可以节省RAM空间。整数大小在不同平台上并没有标准化。请参阅编译器文档以了解每种整数类型的大小。
中断服务例程和设备驱动程序特别关键,因为它们可以阻塞其他所有操作的执行。这通常属于系统编程领域,但在没有操作系统的应用程序中,这是应用程序员的工作。当没有操作系统时,程序员更容易忘记系统代码的重要性,因此系统代码与应用程序代码没有分离。中断服务例程应该尽可能少地进行工作。通常情况下,它应该将接收到的一个数据单元保存在静态缓冲区中或从缓冲区发送数据。它不应该响应命令或进行与正在处理的特定事件无关的输入/输出操作。由中断接收的命令最好以较低优先级响应,通常在主程序的消息循环中处理。有关系统代码的进一步讨论,请参见第162页。
在本章中,我描述了在资源有限的小型设备上特别重要的一些考虑因素。本手册其他部分的大部分建议也适用于小型设备,但由于小型微控制器的设计存在一些差异:
- 较小的微控制器没有分支预测(参见第43页)。因此,在软件中不需要考虑分支预测。
- 较小的微控制器没有缓存(参见第91页)。因此,无需优化数据组织以实现缓存。
- 较小的微控制器没有乱序执行。因此,无需打破依赖链(参见第21页)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值