【发布时间】:2013-03-12 08:48:01
【问题描述】:
我编写了一些 haskell 代码来切换树莓派上的一个引脚,这取决于我从树莓派上的另一个引脚获得的中断。在不知道先前的切换状态的情况下,我根本不知道如何切换引脚的状态。程序本身非常简单。
import Control.Concurrent
import Data.IORef
import HasberryPi
main = do wiringPiSetup
pinMode 0 output
pinMode 7 input
pullUpDnControl 7 pull_down
wiringPiISR 7 edge_both onoff
threadDelay (15*(10^6))
onoff s = do a <- readIORef s -- This is wrong
digitalWrite 0 (if b then pinhigh else pinlow) -- This is wrong
所以基本上这里发生的是引脚 7 被注册为中断。只要引脚 7 从高电平变为低电平或从低电平变为高电平,就会触发中断。并且每当触发中断时,它都会调用onoff 函数来切换引脚0 的状态。
main 函数是正确的。它的onoff 函数就是问题所在。 onoff 函数的预期行为是在引脚 0 为低电平时使引脚 0 为高电平,并在引脚为高电平时将引脚切换为低电平。但要做到这一点,我需要在上一次对onoff 的调用中存储引脚的先前状态。
我尝试了状态单子。但问题是状态单子基于初始状态值传递状态。但在随后对onoff 的调用中,似乎不可能更改初始状态值。我想到了 IORef ,似乎没有什么不同。看起来它正在做状态正在做的事情..但仅限于 IO 内部。
我可以清楚地看到我非常缺少将状态存储在全局变量中的能力。而且我很高兴我无法做到这一点,因为我知道还有其他一些惯用的方法可以实现相同的目标。
非常感谢任何正确方向的帮助。
干杯和问候。
【问题讨论】:
-
程序开始时pin 0是高还是低?你怎么知道的?如果你能回答这个问题,那么你就可以使用 State。如果没有办法知道,我想您需要在开始时自己将其设置为高或低并相应地初始化 State。
-
pin 0 将在程序开始时为低电平