c++ - 爱特梅尔工作室7 : USART interrupt handler provided by ASF library works once only in case of encountering infinite loop in main()?

标签 c++ c atmelstudio

目前,我正在使用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,可以通过手动设置handler来解决这个问题,但我仍然想知道如何通过ASF提供的其他功能来解决这个问题。

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

最佳答案

感谢您的快速回复。

我正在编写的代码是 secret 的。因此,我只能与您分享 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 外设调用的命令后仍应随时工作,并执行一些重要的任务来解决问题,例如。

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

关于c++ - 爱特梅尔工作室7 : USART interrupt handler provided by ASF library works once only in case of encountering infinite loop in main()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45302441/

相关文章:

c++ - 使用 OpenCV 特征检测器匹配热成像/非热成像图像

c++ - 在 C++ 中使用 linux 系统调用获取我 child 的 pid

c - 如何在C中多次或连续地分割带有特殊字符的字符串

c - 不同文件中的相同函数返回不同的结果

c - 将宏定义传递给以引用作为参数的函数

c++ - 调用此函数时无法编译代码

c++ - c/c++编译时 "compatibility"检查

c - c中的函数指针声明

c# - 如何从 native C .dll 导出结构定义以在 C# 中使用

c++ - 未命名命名空间中 `using namespace` 的范围