前言
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中传感器的演变并展望了未来传感器发展的前景。
高带宽传感器
高带宽传感器是指具有较高数据传输速率的传感器。它们能够以更快的速度获取和传输数据。具体而言,高带宽传感器可以通过以下几种方式定义:
无论是样本数还是字节数,高带宽传感器的数据管道都不会成为瓶颈。这意味着传感器的数据获取和传输速率不会限制数据流动的速度。
传统传感器
何类型输入设备的事件、向后兼容kscan、提供可扩展性框架。具体实现了以下内容:

在传统的传感器中,数据的传输过程通常遵循以下步骤:
应用程序调用获取命令:应用程序通过调用获取命令来请求传感器数据。这个命令告诉驱动程序需要获取哪些数据。
驱动程序执行总线事务:驱动程序通过总线与传感器进行通信,执行必要的总线事务来获取传感器数据。这可能涉及读取传感器寄存器、发送控制命令或执行其他与传感器通信相关的操作。
应用程序从驱动程序缓存中读取数据通道:一旦驱动程序成功获取传感器数据,它会将数据存储在自己的缓存中。应用程序可以通过读取驱动程序缓存中的数据通道来获取传感器数据。这样做可以避免频繁访问传感器,提高数据读取效率。
这种数据传输过程的好处是,驱动程序缓存可以提供快速的数据访问,减少了对传感器的直接访问次数,从而提高了系统的效率。同时,应用程序可以根据自己的需求选择读取哪些数据通道,以满足特定的应用场景。然而,在实际应用中,可能会遇到以下问题:
应用程序在I/O期间阻塞:当应用程序调用传感器获取数据时,可能会发生阻塞,导致应用程序无法执行其他任务。
数据处理假设驱动程序已锁定:数据处理过程可能假设传感器驱动程序已经锁定,但事实上驱动程序可能仍在进行数据传输,导致数据处理错误。
驱动程序占用固定内存:传感器驱动程序可能占用固定内存用于缓存数据,这可能限制了系统的可扩展性和灵活性。
异步传感器

异步传感器采用了一些特定的策略和机制,以解决上述问题并提供更好的性能和灵活性。
无阻塞的总线I/O:异步传感器系统采用异步的总线I/O方式,这意味着应用程序在调用传感器获取数据时不会被阻塞。相反,它会立即返回并允许应用程序继续执行其他任务。这样可以提高系统的并发性和响应性。
异步数据处理:异步传感器系统的数据处理过程不依赖于传感器驱动程序的锁定状态。相反,数据处理可以在数据传输的同时进行,而不会对传感器的数据获取造成干扰。这样可以避免数据处理错误,并提高系统的处理效率。
-
灵活的内存使用:异步传感器系统通过使用内存池的方式来管理内存。内存池是一种预先分配的内存资源,应用程序可以根据需要从内存池中动态分配和释放内存。这样可以提供灵活的内存管理,避免固定内存的占用,从而提高系统的可扩展性和灵活性。
一次性数据


在运行时获取解码器

-

-
数据可视化

通过以上流程,我们可以对一次性数据进行处理,并使用解码器将其转换为可用的格式。内存池的使用可以延迟处理,提供灵活的内存管理,并通过解码器实现批量处理和静态获取的功能。最终,我们可以将处理后的数据进行可视化展示。
流数据
流(streams)是指任何基于中断驱动的事件,可以替代触发器的功能。它可以包括步数、重要动作、轻击事件等等。有些流可能会包含数据,例如FIFO watermark。
传感器对流数据的处理流程如下:



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