处理 gpio 中的多个事件

Handle multiple events in gpio

我是嵌入式编程的新手,对于任何混淆,我提前表示歉意。

我需要处理来自连接到 GPIO 的不同设备的多个事件。这些事件需要持续监控。这意味着在生成并处理一个事件后,代码需要继续监视设备的其他事件。

我理解 Linux 中中断和轮询的概念(内核获得中断并将其分派给处理程序,该处理程序继续到无限循环内的 epoll 的被调用者 while(1 )-像)。

这对于一次性、单一事件的玩具模型来说很好。在资源有限的嵌入式系统中,例如以 400mhz 运行并具有 128mb 内存的 AT91SAM9x5,我该怎么办?我相信类似于 while(1) 的模式不是最佳选择。我听说过有关线程池解决方案的好消息,但在每个线程的核心,我们没有找到 while(1) 吗?

解决这个问题我有哪些选择?

提前致谢!

这在很大程度上取决于您的应用程序是什么以及您的限制是什么,但这里有一些监视事件的 gpio 引脚的常用方法

  • 在许多较新的控制器中,所有 GPIO 引脚都能够生成组合中断。您可以使用它来触发 ISR 调用任何引脚上的任何更改,然后在 ISR 内部检测触发它的特定引脚。
  • 如果您的控制器不应该做任何其他事情,那么 while(1) 循环持续监控所有端口引脚并触发相关操作就没有问题
  • 如果上述 none 解决方案都可以接受,您或许可以尝试在您的控制器上加载像 FreeRTOS 这样的小型 OS,然后使用不同的任务来监控端口引脚
  • 上述方法的简化版本是配置定时器中断并轮询其中的所有端口引脚。然后,您可以将引脚状态保存在全局变量中,并在主循环中使用它来执行相关操作。

对于嵌入式系统,AT91SAM 实际上相当 "resource rich" 而不是资源有限。这个想法与使用 Linux 编写它的想法相同:设置一个引脚中断,并在中断处理程序中进行一些最小处理,并可能设置一些全局数据,以便主循环 "while (1)" 可以检测到情况,然后处理 non-interrupt 上下文中的信息。基本上你希望中断处理程序尽快完成,以便它可以处理下一个中断。

在大多数系统中,中断可以挂起或嵌套。对于允许嵌套中断的系统,您必须确保它不会破坏仍在执行的先前中断的上下文。

中断处理程序和主代码之间的实际通信方案取决于您的要求。您甚至可以使用支持此类要求的 RTOS。