簡體   English   中英

簡單的中斷處理/多線程程序?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM