Atmel Studio 7:ASF 库提供的 USART 中断处理程序仅在 main() 中遇到无限循环时工作一次?



目前,我正在使用 ASF 库提供的usart_read_buffer_job函数。我将这个函数放在 while(1( 循环中,如下所示:

int main()
{
Some pieces of code for initialization;
while(1)
{
usart_read_buffer_job();
while(1) // The second infinite loop
{
Some other pieces of code;
}
}
}

它非常适合第一次中断处理程序调用。但是,从处理程序返回后,我无法再调用中断处理程序。程序在第二个无限循环中继续运行,无法再次执行 usart_read_buffer_job((。这可能是处理程序故障的原因。

在这种情况下,我的目的是跳转到 USART 中断处理程序,而不考虑在 main(( 中执行的无限循环的数量。当然,通过使用 ASF,可以通过手动设置处理程序来解决问题,但我仍然想知道如何通过 ASF 提供的其他功能解决此问题。

期待尽快得到社区的回应。 谢谢

感谢您的快速回复。

我正在处理的代码是机密。因此,我只能与您分享 ASF 库函数并简要解释它们的工作原理。

在 ASF 中,通常我们有两个函数来处理中断,即usart_read_buffer_jobusart_read_job

在使用这两个函数之前,处理程序调用由两个函数定义:

usart_register_callback:注册一个回调函数,由用户实现。

usart_enable_callback:当满足回调类型的条件时,将从中断处理程序调用回调函数。

而上面的这两个函数都放在初始化代码中,如问题所示。

然后,根据设计目的,每当通过UART外设分别使用usart_read_buffer_job/usart_read_job接收一个字符或一组字符时,都会调用处理程序。

usart_read_buffer_job:将驱动程序设置为从 USART 读取到给定缓冲区。如果注册并启用,将调用回调函数。

usart_read_job:设置驱动程序以将数据从 USART 模块读取到给定的数据指针。如果注册并启用,接收完成后将调用回调。

您可以在 http://asf.atmel.com/docs/latest/samd21/html/group__asfdoc__sam0__sercom__usart__group.html 上找到有关这些功能的更多详细信息

在这种情况下,假设主程序由于一些意外的无限循环而停止,处理程序在收到从UART外围设备调用的命令后仍应随时工作,并执行一些重要任务来解决问题,例如。

希望这个解释能让我之前的问题更清楚。而且,希望尽快得到大家的回应。

首先,不要在无限循环中放置无限循环!. 如果您发现自己这样做,则表明可能存在设计流程。请修改您的设计。 (我们称之为第一条规则(

其次,您似乎通过注册处理程序/回调来使用事件驱动的 I/O(而不是轮询(。 这是第二条规则,您永远不要自己调用处理程序。 注册要在事件发生时调用的回调函数(处理程序(。

如果正确执行初始化和配置,则代码应遵循以下方案工作:

void initialization()
{
/*Device and other initialization*/
...
usart_register_callback(...); /*Register usart_read_callback() here*/
usart_enable_callback(...);
}
int main()
{
initialization();
while(1)
{
/*Some other pieces of code*/
}
}
void usart_read_callback(...)
{
usart_write_buffer_job(...); /*Read data into your read data buffer*/
}

usart_read_buffer_job()只会调用回调一次,因此在处理完回调后,您必须再次调用usart_read_buffer_job()(如果处理完成,则可能在回调结束时(。

除非您有某种单独的任务(例如在 FreeRTOS 中(,否则只能运行一个无限循环,每个任务都有自己的循环。

相关内容

最新更新