处理gpio中的多个事件[暂停]

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (44)

我是嵌入式编程的新手,我提前为任何困惑道歉。

我需要处理连接到gpio的不同设备的多个事件。需要不断监测这些事件。这意味着在生成并处理一个事件之后,代码需要继续监视设备以查找其他事件。

我理解Linux中的中断和轮询的概念(内核获得中断并将其分配给处理程序,该处理程序一直延伸到epoll的被调用者,该epoll位于无限循环内,而(1)-like)。

这适用于一次性单项目玩具模型。在资源有限的嵌入式系统中,例如AT91SAM9x5,运行速度为400mhz,内存为128mb,我该怎么办?我相信while(1)式的模式不是最好的选择。我听说过关于线程池解决方案的好处,但是每个线程的核心都没有找到一段时间(1)?

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

先感谢您 !

提问于
用户回答回答于

这取决于你的应用程序是什么以及你的约束是什么,但这里有一些监视事件的gpio引脚的常用方法

  • 在许多较新的控制器中,所有GPIO引脚都能够产生组合中断。您可以使用它在任何引脚上的任何更改时触发ISR调用,然后在ISR内部检测哪个特定引脚触发它。
  • 如果你的控制器没有其他任何东西可以做,那么while(1)循环连续监视所有端口引脚并触发相关动作没有错
  • 如果上述解决方案都不可接受,您可以尝试在控制器上加载FreeRTOS等小型操作系统,然后使用不同的任务来监控端口引脚
  • 上述方法的较轻版本是配置定时器中断并轮询其中的所有端口引脚。然后,您可以将引脚状态保存在全局变量中,并在主循环中使用它来执行相关操作。
用户回答回答于

对于嵌入式系统,AT91SAM实际上相当“资源丰富”而不是资源有限。这个想法与使用Linux编写它的想法相同:你设置了一个引脚中断,在你的中断处理程序中,你做了一些最小的处理,可能会设置一些全局数据,这样你的主循环“while(1)”就可以了检测情况,然后在非中断上下文中处理信息。基本上,您希望中​​断处理程序尽快完成,以便它可以处理下一个中断。

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

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

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励