【问题标题】:Interrupts in AT89S52 using C code [closed]使用 C 代码中断 AT89S52 [关闭]
【发布时间】:2017-03-25 08:16:53
【问题描述】:

我可以在 ISR 之外调用函数吗,从 ISR 内部调用,该 ISR 由 AT89S52 中的其他函数(例如,来自 MAIN)使用 C 调用?

【问题讨论】:

  • 你能用一些伪代码解释一下吗?

标签: c embedded isr


【解决方案1】:

在任何架构中从 ISR 调用函数都是合法的 - 尽管并不总是可取的。

您需要考虑所讨论的函数是否适合在中断和多线程上下文中执行;例如,它需要是可重入的,并且必须以原子方式或以确保一致性的方式访问共享资源,当然不应该无限期地阻塞或忙等待。

您可能还需要考虑调用函数的堆栈要求以及函数调用本身在中断处理时间方面的开销。可以考虑内联函数。

【讨论】:

  • 请注意,8051 不太喜欢可重入/递归函数,因为架构的限制性堆栈和指针算术 C 编译器通常更喜欢静态分配的覆盖,而不是用于局部变量的真正堆栈存储。因此,可能需要特别标记被调用者树以使用可重入调用约定,具体取决于特定的编译器及其设置。
  • @doynax :所有优点 - 我确实提到了考虑堆栈要求的必要性,并建议它并不总是可取的 - 即使在可能的情况下也是如此。在这种受限制的环境中尤其如此,并且您已经详细说明了一些架构特定的注意事项。谢谢。
猜你喜欢
  • 1970-01-01
  • 2022-01-16
  • 2017-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
相关资源
最近更新 更多