如何在C程序(AVR)中编写程序集ISR?

时间:2011-04-16 01:42:56

标签: c assembly avr

继我的另一个问题 Help optimising this C (AVR) code? :) 之后,我才意识到我真的不知道如何在我的C程序中在汇编中实现ISR的机制。我用Google搜索,但我找不到任何有用的东西。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

汇编语言艺术(由Randall Hyde撰写)有两章关于ISR(第17和第18章,特别是第18.5和18.6节可能对你有所帮助)。不久:

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

    的pdf副本