目前的位置: 首页 学术信息 正文

ZDS 2023技术报告分享第60篇:Zephyr中的高带宽传感器


前言

2023年Zephyr开发者大会(ZDS)于6月27日至30日在捷克布拉格隆重举行。与以往两次不同,本次ZDS由Zephyr项目规划和管理,并作为首届嵌入式开源峰会(EOSS)的一部分进行。在这个令人期待已久的盛会中,全球Zephyr开发者们共同探讨了Zephyr实时操作系统(RTOS)的最新技术与发展趋势。作为一款开源、灵活和可扩展的嵌入式实时操作系统,Zephyr项目在2014年由英特尔发起,2016年作为Linux基金会项目正式面向公众启动,得到了全球范围内的广泛关注和采用。


ZDS 2023共70余个技术报告,涵盖了使用指导与展示、新功能与技术、架构修改与操作系统、多核异构与虚拟化、模拟器、测试、工业流程与代码管理、安全性、应用案例、工具与调试等丰富多样的内容。湖大嵌入式实验室的小伙伴们将对本次大会的所有技术报告进行逐一收集、整理与分享,尽最大努力为Zephyr开发者提供ZDS 2023技术报告的开发经验、实践成果以及解决方案的参考。


今天分享第60篇技术报告,由王中甲整理,题目为:

Zephyr中的高带宽传感器



作者简介

尤瓦尔·佩雷斯(Yuval Peress),以色列数学家,研究领域包括概率论、遍历理论、数学分析、理论计算机科学等。他在以色列耶路撒冷希伯来大学获得博士学位,随后前往美国读博士后。他先后在希伯来大学和加州大学伯克利分校任教,后来在位于华盛顿州雷德蒙德的微软研究院的担任首席研究员。目前,他在北京雁栖湖应用数学研究院工作。



文章简介

高带宽传感器具有快速数据获取、精确数据采集和大规模数据应用等优势,对于各种应用场景都非常重要。在Zephyr中,传感器技术不断发展,并提供了流式传感器数据的新功能,以满足不断变化的需求和挑战。本文介绍了Zephyr中传感器的演变并展望了未来传感器发展的前景。



高带宽传感器

高带宽传感器是指具有较高数据传输速率的传感器。它们能够以更快的速度获取和传输数据。具体而言,高带宽传感器可以通过以下几种方式定义:


  • 数据样本数每秒超过X个:高带宽传感器能够以每秒超过X个样本的速度获取数据。这意味着它们可以以更高的频率采集数据,提供更精确和详细的数据。

  • 数据字节数每秒超过X个:高带宽传感器能够以每秒超过X个字节的速率传输数据。这意味着它们可以以更高的速度将数据传输给接收端,实现快速的数据传输。

无论是样本数还是字节数,高带宽传感器的数据管道都不会成为瓶颈。这意味着传感器的数据获取和传输速率不会限制数据流动的速度。




传统传感器

何类型输入设备的事件、向后兼容kscan、提供可扩展性框架。具体实现了以下内容:

在传统的传感器中,数据的传输过程通常遵循以下步骤:

  1. 应用程序调用获取命令:应用程序通过调用获取命令来请求传感器数据。这个命令告诉驱动程序需要获取哪些数据。

  2. 驱动程序执行总线事务:驱动程序通过总线与传感器进行通信,执行必要的总线事务来获取传感器数据。这可能涉及读取传感器寄存器、发送控制命令或执行其他与传感器通信相关的操作。

  3. 应用程序从驱动程序缓存中读取数据通道:一旦驱动程序成功获取传感器数据,它会将数据存储在自己的缓存中。应用程序可以通过读取驱动程序缓存中的数据通道来获取传感器数据。这样做可以避免频繁访问传感器,提高数据读取效率。

这种数据传输过程的好处是,驱动程序缓存可以提供快速的数据访问,减少了对传感器的直接访问次数,从而提高了系统的效率。同时,应用程序可以根据自己的需求选择读取哪些数据通道,以满足特定的应用场景。然而,在实际应用中,可能会遇到以下问题:

  1. 应用程序在I/O期间阻塞:当应用程序调用传感器获取数据时,可能会发生阻塞,导致应用程序无法执行其他任务。

  2. 数据处理假设驱动程序已锁定:数据处理过程可能假设传感器驱动程序已经锁定,但事实上驱动程序可能仍在进行数据传输,导致数据处理错误。

  3. 驱动程序占用固定内存:传感器驱动程序可能占用固定内存用于缓存数据,这可能限制了系统的可扩展性和灵活性。



异步传感器

异步传感器采用了一些特定的策略和机制,以解决上述问题并提供更好的性能和灵活性。

  1. 无阻塞的总线I/O:异步传感器系统采用异步的总线I/O方式,这意味着应用程序在调用传感器获取数据时不会被阻塞。相反,它会立即返回并允许应用程序继续执行其他任务。这样可以提高系统的并发性和响应性。

  2. 异步数据处理:异步传感器系统的数据处理过程不依赖于传感器驱动程序的锁定状态。相反,数据处理可以在数据传输的同时进行,而不会对传感器的数据获取造成干扰。这样可以避免数据处理错误,并提高系统的处理效率。

  3. 灵活的内存使用:异步传感器系统通过使用内存池的方式来管理内存。内存池是一种预先分配的内存资源,应用程序可以根据需要从内存池中动态分配和释放内存。这样可以提供灵活的内存管理,避免固定内存的占用,从而提高系统的可扩展性和灵活性。


一次性数据


一次性数据处理流程如下:

  • 设置读取器:首先,需要进行读取器的设置,以准备接收传感器的数据。这可以包括初始化读取器的参数、配置数据格式等操作。

  • 为什么使用内存池(mempools)?

    • 延迟处理:内存池允许我们延迟数据的处理。这意味着我们可以在获取到数据后,将其存储在内存池中,等待后续的处理操作。

    • 控制内存管理:内存池允许我们灵活地管理内存。我们可以根据需要,为不同的处理方式分配不同大小的内存块。

      • 对于一次性读取的处理,可以使用较小的内存块;

      • 对于流式传感器的快速读取,可以使用较大的内存块;

      • 对于混合使用,可以使用多个较小的内存块。


  • 将读取的数据放入队列中:我们将读取到的数据放入队列中,以便后续的处理程序能够按顺序处理数据。

  • 处理数据:从队列中获取数据,并进行相应的处理操作。这可能包括解码、计算等。

  • 未来的改进:

    • 添加更多辅助函数以补充sensor_processing_with_callback();

    • 提供常见的API测试,以验证解码器是否符合指南。

  • 为什么需要解码器?

    • 当我们获取到数据后,数据会存储在RTIO内存池中。

    • 解码器允许批量处理多个样本。

    • 我们可以在没有关联struct device *的情况下静态获取解码器。

  • 在运行时获取解码器

  • 获取样本的时间戳

  • 数据可视化

通过以上流程,我们可以对一次性数据进行处理,并使用解码器将其转换为可用的格式。内存池的使用可以延迟处理,提供灵活的内存管理,并通过解码器实现批量处理和静态获取的功能。最终,我们可以将处理后的数据进行可视化展示。



流数据

流(streams)是指任何基于中断驱动的事件,可以替代触发器的功能。它可以包括步数、重要动作、轻击事件等等。有些流可能会包含数据,例如FIFO watermark。

传感器对流数据的处理流程如下:

  • 设置流读取器:首先,需要初始化和配置流读取器,以接收传感器流中的数据。这涉及设置参数,如数据格式、采样率、缓冲区大小等。

  • 启动流:在设置好流读取器后,可以通过启动流来开始接收传感器数据。此时,流读取器会开始监听传感器发送的数据,并将其存储在缓冲区中。

  • 停止流:当不再需要接收传感器数据时,可以停止流。停止流操作会终止流读取器的监听,并清空缓冲区中的数据。

  • 解码触发信号:在流数据中,可能包含触发信号。解码触发信号是对流数据进行分析和处理的过程,以识别特定的触发事件,例如步数、重要动作等。这可以通过应用特定的解码算法或触发检测器来实现。

通过以上流程,可以有效地处理传感器流数据。设置流读取器、启动和停止流以及解码触发信号是传感器流数据处理的关键步骤。这使得我们能够有效地接收和分析传感器产生的实时数据,并提取有用的触发信息。



总结

使用RTIO内存池可以实现内存的粒度控制。消除传感器的中断处理,避免每个传感器线程的浪费,同时也不再需要使用系统工作队列,解决了配置困难和时间不可靠的问题。一次性数据和流数据的处理路径相同,简化了代码结构和逻辑。在触发事件检测时具有更精细的控制,可以灵活定制处理方式。通过使用RTIO内存池,我们能够更好地控制内存粒度,并消除传感器的中断处理和系统工作队列的需要。同时,一次性数据和流数据的处理路径相同,使得代码更加简洁。此外,我们还可以更细致地控制触发事件的处理方式,提供更灵活的处理选项。


上一条:ZDS 2023技术报告分享第61篇:使用Zephyr操作系统在不同硬件上运行 下一条:ZDS 2023技术报告分享第59篇:基于RPC的灵活系统设计-Zephyr中采用分布式计算

关闭

嵌入式与网络计算湖南省重点实验室
版权所有 © 2023 湖南大学