gpt4 book ai didi

c - 简单的中断处理/多线程程序?

转载 作者:太空宇宙 更新时间:2023-11-04 07:08:22 25 4
gpt4 key购买 nike

我是嵌入式编程和多线程的新手,我想了解中断处理程序如何在不同的上下文/场景中工作。对于当前的问题,我只想知道中断处理程序在以下情况下如何工作。

我们有一个来自 RS232 接口(interface)的数据流,由一些微 Controller 处理。中断处理程序(void 类型)有一个 read() 函数,它读取传入的数据字节。如果检测到一个字符,则中断处理程序调用一个名为 detectString() 的函数,如果该字符串与“ON”的引用字符串匹配,该函数将返回 TRUE。如果 detectString() 返回 boolean TRUE,它会调用一个名为 LED_ON() 的函数,该函数应将 LED 点亮 1 分钟。如果它返回 false,它应该关闭 LED。假设微 Controller 的时钟频率为 20MHz,加法运算需要 5 个时钟周期。

我的问题如下

我们如何使用 FSM 解决这个问题?LED 亮起后,RS232 接口(interface)仍保持数据传输。那么我是否正确地假设中断处理程序应该与一个线程一起工作,而它调用的函数应该在不同的线程上工作?实现这个 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]

显然,您可以对细节进行大量修改,但这是总体思路。

关于c - 简单的中断处理/多线程程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30404718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com