处理GPIO中的多个事件

时间:2019-05-23 14:05:54

标签: c++ linux embedded gpio

我是嵌入式编程的新手,如有任何混淆,我预先致歉。

我需要处理来自连接到gpio的不同设备的多个事件。这些事件需要不断进行监视。这意味着在生成并处理了一个事件之后,代码需要继续监视设备是否存在其他事件。

我了解Linux中的中断和轮询的概念(内核获取中断并将其分配给处理程序,该处理程序将继续到达epoll的被调用方,而该epoll处于while(1)式无限循环内)。

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

我有什么解决这个问题的选择?

提前谢谢!

2 个答案:

答案 0 :(得分:1)

对于嵌入式系统,AT91SAM实际上是“资源丰富的”而不是资源有限的。这个想法和使用Linux编写代码的想法是一样的:您设置了pin中断,并在中断处理程序中进行了一些最少的处理,也许还设置了一些全局数据,以便主循环“ while(1)”可以检测情况,然后在不中断的情况下处理信息。基本上,您希望中​​断处理程序尽快完成,以便它可以处理下一个中断。

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

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

答案 1 :(得分:0)

这在很大程度上取决于您的应用程序和约束,但这是一些监视gpio引脚事件的常用方法

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