我有几个水流传感器,我想为其使用硬件中断。我不知道该怎么做。
为了避免多次编写相同的代码,我必须编写一个用于处理传感器的类,然后在应用程序环境中创建多个实例以分别处理每个传感器。要么我需要在中断处理程序中创建一个类的实例,用内存中某处的某些数据初始化它,因为我需要存储值(例如升计数器,当前水流量值)。
我还没有尝试过 Espressif SDK,只有 Arduino,但即使在那里我也遇到了这个问题:必须使用静态方法作为硬件中断的处理程序,但在这种情况下,我无法访问变量和实例方法。
请告诉我,这个问题是如何解决的,也许我应该阅读什么?我不太了解C++。这可能很简单,但不适合我。
为此创建 FreeRTOS 任务可能更容易。任务等待信号量或队列,然后处理传感器。您的中断或您的普通代码可以引发信号量或将某些东西放入队列并让任务处理这件事。
通常的方法是创建一个或多个类的实例作为全局变量,这意味着它们被分配和初始化一次,然后它们的成员函数可以从 ISR 或任何其他代码中调用。这样,ISR 不必每次都分配/初始化一个新实例,并且实例可以独立于 ISR 的范围维护其数据。
“C”方法代替面向对象的特性,将创建一个或多个函数,这些函数接收作为参数的“上下文”,它们在这些函数上运行。这个“上下文”参数通常是指向保存数据的某些结构(ure)的指针,例如要处理哪个传感器实例。事实上,这正是 C++ 和其他 OO 语言“在幕后”为您所做的。等价于 C++“sensorInstance.doSomething(x)”的 C 语言类似于“flowsensor_doSomething(&sensorInstance, x)”。