2

继我的另一个问题之后,帮助优化此 C (AVR) 代码?:),我刚刚意识到我并不真正了解如何在我的 C 程序中在汇编中实现 ISR 的机制。我用谷歌搜索,但我没有发现任何有用的东西。

基本上我想在我的 C 项目中设置其他所有内容(包括触发中断的寄存器),但我希望中断执行我编写的一些汇编代码。

如果有帮助,我在 Windows 上使用 AVR studio 6。有人告诉我我需要使用.s文件,但除此之外我不确定该怎么做。基本结构就是下面这样吗?

#include <avr\io.h> 
TIMER1_COMPA_vect:
    ; assembly instructions here

如果我希望程序集在触发 TIMER1_COMPA_vect 中断时运行(这是 C 中 ISR 的名称)。还是我完全偏离了轨道?我需要做什么的基本模板是什么?或者,如果这是一个愚蠢的问题,是否有链接可以找到更多信息?

4

1 回答 1

1

The Art of Assembly Language(作者 Randall Hyde)有两章关于 ISR(第 17 和 18 章,特别是第 18.5 和 18.6 节可能对您有所帮助)。不久:

  1. 转到 IVT(中断向量表)并使用您的 ISR 段和偏移量对其进行修改,保存旧值
  2. 你应该做一个 TSR(终止并保持驻留)程序,这样即使用户关闭窗口,你的 ISR 也会驻留在内存中
  3. 完成工作后记得调用旧的 ISR(这称为中断链接)
  4. 您的 ISR 应该是可重入的(这样如果在您的 ISR 仍在运行时再次触发中断,则 pc 不会爆炸;))

顺便说一句,您可以在此处获得那本好书的pdf 副本

于 2011-04-16T11:26:42.357 回答