饿了么|嵌入式开发:最大限度地提高物联网项目的效率

饿了么|嵌入式开发:最大限度地提高物联网项目的效率

对于仔细阅读最新微控制器数据表的开发人员来说 , 很容易假设CPU资源的有效使用 , 包括内存和时钟周期 , 至多是当今硬件的一个次要问题 。 对于嵌入式开发人员来说 , 现在可能比以往任何时候都更重要的是确保他们的软件以最高效率运行并且他们自己的时间以一种有效的方式度过 。

在现代嵌入式系统上运行的软件往往来自多种来源 。 应用程序开发人员编写的代码通常与来自RTOS(实时操作系统)提供商的现成软件组件相结合 , 而这些组件又可能利用最初由半导体公司提供的驱动程序代码 。 可以编写每段代码来优化效率 , 但本文将重点关注现成软件组件的效率 。 特别是两个组件将作为此处给出的资源效率检查的基础:实时内核和事务文件系统 。
实时内核:高效系统的核心
实时内核是当今许多嵌入式系统中运行的软件的核心 。 简单来说 , 内核就是一个调度器;为基于内核的系统编写应用程序代码的开发人员将该代码划分为任务 , 内核负责调度任务 。 因此 , 内核是main()中无限循环的替代方案 , 它通常用作裸机嵌入式系统中的主要调度机制 。
使用实时内核可以带来很多好处 , 包括提高效率 。 选择将应用程序代码基于内核的嵌入式开发人员可以优化系统中处理器资源的使用 , 同时更有效地利用自己的时间 。 然而 , 并非所有的内核都是平等的 , 并且由于简单地决定为新项目采用内核而不能保证效率增益 。
内核可能不同以及CPU资源可以以不同程度的效率使用的关键领域是调度 。 通过提供允许任务响应事件运行的智能调度机制 , 内核帮助开发人员在无限循环中实现效率提升 , 其中任务(或函数)以固定顺序执行 。 基于内核的应用程序的确切效率部分取决于其调度程序的实现方式 。 内核的调度程序——它只是一段代码 , 负责决定何时运行每个任务——最终是开销 , 并且这种开销不能抵消通过远离裸机系统可以获得的好处 。

内核可以采用两种方法来分配多任务所需的基本资源:分配这些资源的责任可以留给应用程序代码 , 或者内核本身可以处理分配 。 在任何内核中都不可避免地存在某些变量和数据结构 , 因为它们对于多任务服务的实现至关重要 , 它们完全位于内核的范围内 。 但是 , 对于用于记录每个任务状态的TCB(或任务控制块)等数据结构 , 甚至对于在上下文切换期间存储CPU寄存器值的堆栈 , 内核提供者可以选择内部分配或依赖应用程序代码 。
文件系统效率
大多数设备需要存储数据和记录事件的选项 , 或者作为传输到云之前的临时休息场所 , 或者更永久地存储在设备上 。 任何为此目的设计的代码都是文件系统 , 无论是由嵌入式开发人员编写和测试 , 还是作为RTOS解决方案的一部分提供 。 文件系统还可以提供提高效率的选项 。 这些范围从简单(要保留多少内存缓冲区)到复杂(是否支持完整的POSIX 操作) 。
首先 , 一些RTOS 提供类似FAT的文件系统 。 这包括使用标准媒体格式(包括文件夹和文件)执行I/O的代码 。 通常 , 这不是非常可定制的 , 而且它很少能防止电源故障期间的数据丢失 。 另一种选择是Datalight 的RelianceEdge , 它使用事务点来提供电源故障安全环境 。 这里令人兴奋的是设计的灵活性如何提高效率 。
RelianceEdge 提供存储选项的自定义 。 在被称为“文件系统要点”的最小用例中 , 不使用文件夹甚至文件名 。 数据存储在编号的inode 中 。 这些位置的数量是在编译时确定的 , 但大小不是预先确定的 。 一个“文件”可以包含比其他“文件”更多的数据 , 并且仅当“文件”的总大小达到阈值时媒体才满 。 文件也可以自由截断、读取和写入 。