EEJournal

专题文章
现在就订阅

编程QuickLogic的传感器集线器

从软件的角度看硬件

看来是传感器集线器的季节了。一些有趣的事情正在酝酿。其中一个,尤其具有战略意义,我会的写下来一旦我有机会深入了解更多细节

今天,我们将从战术上而非战略上深入探讨QuickLogic的传感器集线器解决方案。我们要亲自动手了。如果你读过我之前的文章传感器集线器分区,您会想起QuickLogic有一个相当复杂的实现,它使用低级软件、状态机和直接硬件的组合,将许多传感器hub功能放在FPGA硬件中。他们声称,他们可以通过这种方式实现最低功耗——低于更常见的微控制器实现。

当然,这方面的挑战在于,传感器中心的功能主要是通过软件来表达的,大多数软件工程师不会轻易创建FPGA硬件。因此,QuickLogic必须做的是一场相当微妙的舞蹈,将硬件抽象成软件,并在必要时与客户携手合作。

他们最近发布了一些关于他们的中心解决方案的公告。首先是事实他们现在声称以满足Android KitKat发布的要求,我们最近覆盖。他们还宣布可用性他们称之为FFEAT(柔性融合引擎算法工具)的集线器解决方案,以及用于编写和调试传感器融合软件的开发板。

这似乎提供了一个很好的机会,可以更仔细地研究QuickLogic为软件工程师提供的环境,以进行本质上是硬件设计的工作。在我看来,这很重要,因为好的概念性想法往往会失败,因为它们没有在正确的水平上满足预期的受益者。即使是作为一名营销人员,我也看到过对解决方案感兴趣的人在他们必须经历的现实世界的具体过程中犹豫不决。当硬件和软件相遇时,这种风险尤其高,因为双方的假设和语言非常不同。

我也看到了QuickLogic解决方案之外的价值;希望讨论将阐明更一般的传感器中心问题。

传感器集线器101

让我们从架构层面开始。QuickLogic提供了以下简单的图像来说明传感器集线器的总体目标。左边是一个纯粹的老式传感器解决方案,其中所有传感器都通过应用程序处理器(AP)连接,在这种情况下,I2C.所有的传感器融合功能然后在传感器框架中实现,使得传感器数据在编程级别(通常是Java)可用。

Figure_1.png

图1。传感器集线器将AP的功能带走,使其可以休眠。(图片由QuickLogic提供)

相比之下,在右侧,传感器集线器承担了过去在AP上的传感器框架中完成的大部分工作。如果集线器成功地从AP中吸取所有内容,那么AP所要做的就是与集线器对话(在这种情况下,通过SPI总线),然后简单地将预先消化的数据传递到应用程序级别,绕过AP中的所有其他繁琐程序。

因此,AP可以睡眠,而不必在低水平处理所有电池燃烧传感器的阴谋。hub在AP休眠时执行低级工作,如果有有趣的事情发生,hub将唤醒AP并告知AP。有点像总统或总理和他/她的顾问之间的关系。

守护进程的域

Android硬件抽象层(HAL)为应用程序提供了一种方法来指示感兴趣的传感器事件。它通过将它们注册到管理这些事件的任何东西来做到这一点。QuickLogic的体系结构使用了来自Sensor Platforms的守护进程来管理各种传感器事件队列,因此它参与了这个注册过程。

您可以为简单的事件注册,比如,旋转(我们将在一分钟内查看旋转作为一个示例,所以不妨从这里开始)。或者,在理论上,您可以创建更复杂的事件,如“停止运行”。据推测,对于Android,您将限制您的注册事件,Android HAL理解。

事实上,如果您注册的只是旋转,那么无论传感器能够生成什么其他事件,应用程序都不会对这些事件感兴趣(否则它就会注册它们)。例如,如果一个“step”事件发生,中枢会决定,“好吧,哥们刚走了一步,但应用程序不关心这个,所以我不打算叫醒他。”传感器可能会有点不高兴,抱怨没人听他们的,但他们对此也无能为力。

对于已注册的事件,集线器将通过中断和“包”将事件和数据发布到守护进程。然后守护进程将对事件进行排队。守护进程实际上可以管理各种不同的队列来支持,例如,多个应用程序,所以当中断发生时,它只是意味着事件进入队列;这并不能保证立即做出反应。

一旦集线器将数据包交给守护进程,集线器就完成了任务,并返回到传感器级别监视世界。守护进程将在自己的时间内按照队列的要求提供到应用程序级别的数据。在这篇文章中,我们不会详细讨论守护进程的操作(主要是因为我不知道这些细节);我们将关注中心。

我在下面说明了这种关系。(请注意,这里剩下的数字看起来会有所不同,因为它们是我自己的;以防你或QuickLogic有什么问题,我想确保你对我大喊大叫,而不是对QuickLogic。)

Figure_2.png

图2。传感器集线器将事件包发送到守护进程管理的队列中。

然而,值得注意的是,在守护进程中可能会发生相当多的进一步计算——特别是不经常更新的上下文感知函数。因此,这个看起来无伤大雅的守护程序框可以隐藏相当多的功能。

作为一个快速题外话,QuickLogic看到了未来微控制器进入这里的可能性,进一步从AP中卸载一些守护进程功能。我对这个想法的立即反应是这样的:我们在这里使用基于硬件的集流器,因为它可以在比微控制器更低的功率下运行。如果你不得不重新添加一个微控制器,难道你没有放弃这个好处吗?

QuickLogic的答案当然是“不”。他们认为这是一种分层的方法:总是处于繁忙状态的事情仍然会发生在最低功耗的硬件上。中频的东西可以发生在微控制器比AP更低的功率下。所以当硬件认为发生了一些有趣的事情时,它会唤醒微控制器;然后微处理器做更多的工作,最终唤醒美联社,如果它认为事件值得关注。

在这种情况下,微处理器什么也不做,所以它可以睡觉和/或以一种更轻松的节奏运行,而不是一个负担过重的处理一切的微处理器,这意味着整体的能力仍然低于一个全微解决方案所涉及的能力。提醒一下,今天的事情不是这样的;我们将要讨论的解决方案中没有微控制器。

Figure_3.png

图3。投机的未来建筑。

注意,这里有不同的编程级别。在应用程序层面,我们谈论的是Java。如果有一个微,我们将讨论C/ c++。在硬件层面,这就是事情变得有趣的地方。

内核现在可以看到你了

让我们进入低层次的QuickLogic范例。我不打算担心实际的硬件结构(我在前一篇文章中概述过);相反,我将以设计师的方式看待事物。QuickLogic将许多粗陋的部分抽象了出来——这对吸引软件工程师至关重要。(这不是满贯;从事软件工作的人有不同的地方需要注意。)

例如,通过库和基本传感器定义文件提供与实际传感器的低级交互。这简化了用哪个寄存器以什么间隔读取一些原始数据的过程。

传感器数据的实际处理是通过引擎或内核(QuickLogic没有使用这个词来描述它,但我使用它是因为我觉得它很容易引起共鸣)进行的,它在一个保持清醒的小计时器的控制下唤醒和休眠(将计时器视为一个迷你守护进程)。当什么都没有发生时,计时器是唯一在运行的东西——其余硬件的时钟实际上是关闭的。只有当计时器说该做一些工作时,内核才会被唤醒并获取能量。

Figure_4.png

图4。QuickLogic传感器处理的概念图。

每次内核被唤醒时,都会完成一些工作。这通常意味着对一个或多个传感器进行采样以获得新值,然后运行某种算法来查看是否发生了感兴趣的事情。如果不是,那么内核将回到睡眠状态,直到被计时器重新唤醒。如果发生了一些有趣的事情,那么这些数据将在内核进入睡眠状态之前发送到AP。

注意,这里的“有趣”指的是应用程序已注册为有趣的事件。如果应用程序想知道旋转,那么,正如我们将看到的,当旋转发生变化时计算旋转并发送新数据。

Figure_5.png

图5。定时器如何管理内核中的算法的概念说明。

内核是设计人员施展低级魔法的地方。计时器,传感器访问-所有这些都被隐藏起来,远离犹豫或淘气的手。

(这里我要强调的是,这是我对它如何运作的解释。它不应该被误认为代表了QuickLogic如何具体描述它;你需要查阅他们的文档来了解官方用词。我对大致的情况很有信心;一些细节可能会有所不同——例如,我不会发誓流程图的字面准确性,但它说明了这一点。)

一些设置代码

算法就是我们现在要讲的内容。QuickLogic提供了一种简单的语言来编写算法;这是一种相对易读的方法,因此代码片段可以用作说明。我们将以旋转为例-这是QuickLogic的Tim Saxe带我做的。

为了提高可移植性,QuickLogic将代码分成两个部分:“传感器”部分和“算法”部分。这允许交换不同的特定传感器:任何特定于传感器的东西都发生在传感器段,而算法可以保持不变。这两个片段由一个“ffvariable”“连接”起来。这本质上是一个接收除法传感器端传感器数据的对象,并由算法端算法读取。

Figure_6.png

图6。传感器细节从算法中抽象出来,通过ffvariable传递

顺便说一下,ffvariable并没有什么固有的特性;它被定义为代码中的一个结构,由实际的传感器数据和缩放因子(因传感器而异)组成:

Figure_7.png

图7。定义ffvariable的代码片段。(代码由QuickLogic提供)

传感器端在很大程度上定义了特定于所连接的传感器的属性。这里展示了InvenSense陀螺仪的一些示例精简代码,说明了一些定义和行为。我就不深入讲了。

Figure_8.png
图8。传感器定义代码片段。
(点击图片放大。代码由QuickLogic提供。)

同时,在事物的后端,每个事件都会得到一个根据AP预期的数据定义的数据包。这里我展示了两个相关的数据包:一个用于原始陀螺仪数据,另一个用于旋转数据。第一个提供三个数据点(每个轴一个);另一个是一个完整的四元数。

Figure_9.png

图9。包定义(代码由QuickLogic提供)

管道填充

那么算法本身呢?在我们深入讨论之前,有一个关于引擎的重要特征需要注意——这类东西对硬件人员来说可能更明显。该发动机采用两级管道。

对于不熟悉管道的人来说,它们是提供并行行为的一种非常有用的方式,因为每个阶段都做一些简单的事情,并将结果传递到下一个阶段。当第二阶段开始处理刚刚得到的数据时,第一阶段可以开始处理一些新的数据。通过管道获得第一个数据需要几个周期,但是,一旦管道满了,每个周期都可以获得新数据。

QuickLogic的中心的工作方式是,在每个周期中,通过硬件并行的魔力,您可以同时进行读和写操作。具体来说,编译器将数据读取安排在赋值操作需要的前一个周期。虽然这可能会带来一些性能上的好处,但如果您试图同时读取和写入同一个位置,它偶尔会给您带来麻烦——编译器会报错。

好消息是,在大多数情况下,你不需要知道这些。您编写算法,然后编译器将其打包到管道中。但它不是完全透明的。在编译器报错的情况下,您可能不得不添加一个NOP操作来强制系统序列化一个读和一个写,而不是试图并行执行它们。或者,您可能需要明确地考虑指令排序。

在下面的图中,Var1涉及到对Var2的赋值。在第一个循环中,Var1被读取;分配给Var2是在下一个循环中。同时,Var4被读取,为下一个Var3作业做准备。然后,当Var3被赋值时,它也会尝试为Var5的赋值做准备,但这涉及到读取Var3,而Var3目前正在被写入。所以这将被编译器标记为一个问题,并且需要一个NOP来给写在读发生之前完成的机会。

Figure_10.png

图10。管道体系结构需要注意同步读/写。

有了这些背景知识,算法就相对简单了。我们将使用陀螺仪的数据来确定新的旋转位置基于自上次我们运行所有这些以来发生的任何旋转。这意味着我们需要知道新的陀螺数据以及距离上次签到有多久了。

  • 原始陀螺仪数据首先被缩放为MKS单位。
  • 然后我们计算出旋转的速率;
  • 从中我们可以得到旋转的绝对值
  • 将该旋转添加到旧位置就得到了新位置。(这里的“位置”使用不太严格,因为我们只讨论旋转,而不是线性平移。)
  • 然后我们将旋转归一化(将其缩放为1;这显然是标准的,有助于避免漂移最终导致溢流或溢流)。
  • 我们编写旋转包,然后
  • 把它作为中断发送出去。

执行此操作的代码如下所示。

Figure_11.png
图11。旋转算法代码。
(点击图片放大;代码由QuickLogic提供)

库添加

所有这些四元数函数都是在库中预先定义的,所以这已经为您完成了。他们如何决定图书馆里放什么?我们的理念是包括任何可能被一个或多个客户反复需要的东西。四元数数学当然属于这一类。

QuickLogic非常灵活。事实上,我亲眼目睹了他们的哲学。当他们向我展示这段代码时,使用下面的代码显式地展示了规范化。在讨论中,Saxe先生认为这是一个足够常见的函数,值得添加到库中。通过这种方式,他们可以优化它的工作方式(例如,它涉及多个nop),并提高程序员的抽象级别。上面所示的当前代码反映了这种改进。

Figure_12.png

图12。规范化四元数(代码由QuickLogic提供)

解决同时读写

时间计算为NOP提供了一个很好的例子。首先,确定currTime;接下来,根据currTime计算deltaTime。第一个是作业;第二种是阅读。如果它们只是一个接一个地执行,那么编译器就会不高兴,因为读操作将与写操作一起被调度。因此,为了将它们分离出来,插入NOP以迫使赋值首先发生。然后,读取操作就可以继续进行了。

Figure_13.png

图13。NOP提供了在读取值之前完成赋值的机会。

与此同时,接下来的两条指令看起来无关紧要,但顺序很重要。上面代码中的时间是以“滴答”为单位的,但最终,它必须以时间单位交付。我们需要缩放deltaTime变量。我们还需要更新prevTime。但是我们需要确保,当我们缩放deltaTime的时候,我们不会在之前的指令中干扰它的写入。

下图说明了两个deltaTime指令背对背时的问题。有两种解决方法:添加NOP或重新排序以下两条指令。分配deltaTime和更新prevTime之间没有冲突,更新prevTime和扩展deltaTime之间也没有冲突。因此,这种重新排序提供了一个更有效的解决方案,需要更少的周期。

Figure_14.png

图14。需要NOP或指令重排序来解决并发读/写。
(按图放大)

然后,所有这些代码都编译成QuickLogic体系结构中的各种硬件结构。除了NOP之外,它似乎在隐藏硬件方面做得相当不错。

这让你对它的工作原理有了一个大致的了解。我也可以在开发板上花费一些周期,但这是相对明显的,而且我已经让你在这里呆了太久了。

因此,总结一下,我们已经了解了QuickLogic如何向软件工程师展示其传感器集线器解决方案,尽管该解决方案本质上是一个硬件解决方案。它是否能在节省电力的同时达到适当的平衡将决定解决方案的成功。

更多信息:

QuickLogic传感器集线器

关于“QuickLogic传感器集线器编程”的8个想法

  1. 广播:todoindie
  2. 广播:三个指针
  3. 广播:ADME化验

留下回复

有特色的博客
2022年12月16日
RF团队“μWaveRiders”博客系列是一个Cadence AWR RF产品的展示。每个月的主题将不同于Cadence AWR设计环境发布的亮点、专题视频和焦点,以及软件技巧、技巧和定制。订阅接收…
2022年12月15日
看完这个视频后,我非常想创建我自己的电磁/水浴相控阵实现....
2022年12月15日
探索高性能计算的关键组件,并学习如何在HPC集群和系统中设计可靠性、可用性和可服务性(RAS)。关于高性能计算机的可靠性,可用性和可服务性,你需要知道什么…
2022年12月14日
随着每一个新的工艺节点的出现,都需要更复杂的要求来确保硅的工作。……

有特色的视频

TI隔离技术:设计不同

德州仪器公司

对隔离的需求正在增长,虽然机电继电器、光耦合器和离散变压器已广泛用于信号和电源隔离,但我们致力于进一步推动隔离技术。看看我们的电容性和磁性技术下一步将走向何方。

了解更多

特色粉笔谈话亚博里的电子竞技

电池管理系统简介

英飞凌

有效的电动汽车电池管理是当今工程师面临的一个关键设计元素。在本集Chalk Talk中,Amel亚博里的电子竞技ia Dalton与来自英飞凌的Marco Castellanos讨论了电动汽车电池管理的关键功能,电池平衡,电压测量和温度测量在电池管理ic中的作用,以及使用蓝牙低功耗的无线电池管理如何帮助您解决下一个设计中的各种电池管理挑战。

点击这里了解更多关于英飞凌电池管理ic的信息

Baidu