[英]Simple Interrupt Handling/ Multi-threading program?
我是嵌入式编程和多线程技术的新手,我试图了解中断处理程序如何在不同的上下文/场景下工作。 对于当前问题,我只想知道在以下情况下中断处理程序将如何工作。
我们有来自RS232接口的数据流,该数据流由某些微控制器处理。 中断处理程序(无效类型)具有read()
函数,该函数读取传入的数据字节。 如果检测到字符,则中断处理程序将调用一个名为detectString()
的函数,如果该字符串与参考字符串“ ON”匹配,则该函数返回TRUE
。 如果detectString()
返回boolean TRUE
它将调用一个称为LED_ON()
的函数,该函数应将LED点亮1分钟。 如果返回假,则应关闭LED。 可以说微控制器的时钟频率为20MHz,加法运算需要5个时钟周期。
我的问题如下
我们如何使用FSM解决这个问题? 即使在LED指示灯亮起之后,RS232接口仍继续发送数据。 因此,我是否假设中断处理程序应该在一个线程中工作并且它调用的函数应该在不同的线程中工作是正确的? 实现此FSM的骨架程序是什么样的? (C伪代码可能确实有助于理解设计的基础)
如果您在中断处理程序中执行此操作,为什么需要其他线程? 只要启用了中断,您在做什么都不重要。
至于FSM,我不会称其为“ detect_string”。 RS232将一次给您一个字符。 UART可能仅在收到多个中断时才会打断您,但是通常还包含一个时间分量,因此依靠它是不明智的。 使您的FSM一次输入一个输入字符。 您的状态将类似于:
=> new state = [Init] (turn LED off if on)
Init: (Get 'O') => new state = [GotO]
Init: (Get anything else) => new state = [Init]
Init: (Timer expires) => who cares? new state = [Init]
GotO: (Get 'N') => new state = [GotON] (turn on LED, set timer)
GotO: (Get anything else) => new state = [Init]
GotO: (Timer expires) => who cares? new state = [GotO]
GotON: (Get anything) => who cares? new state = [GotON]
GotON: (Timer expires) => turn LED off, new state = [Init]
显然,您可以修改很多细节,但这是一般的想法。
抢占式内核通常会提供中断功能,以设置高优先级线程挂起的事件。
至于中断,实现类似状态机之类的一种方法是使用嵌套指针来执行功能,类似于异步回调,但具有可选的嵌套:例如:
typedef void (*PFUN)(void);
/* ... */
PFUN pFunInt = UnexpectedInt; /* ptr to function for interrupt */
PFUN pFunIntSeqDone;
/* ... */
void DoSeq(void)
{
pFunIntSeqDone = IntSeqDone;
pFunInt = IntStep0;
/* enable interrupt, start I/O */
}
void IntStep0(void)
{
pFunInt = IntStep1;
/* handle interrupt */
}
void IntStep1(void)
{
pFunInt = IntStep2;
/* handle interrupt */
}
void IntStep2(void)
{
/* done with sequence, disable interrupt */
pFunInt = UnexpectedInt;
pFunIntSeqDone(); /* call end action handler */
}
void IntSeqDone(void)
{
/* interrupt sequence done handling code */
/* set event for pending thread */
}
void UnexpectedInt(void)
{
/* ... error handling code */
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.