2011-04-16 87 views
1

繼續從我的另一個問題,Help optimising this C (AVR) code? :),我只是意識到,我不知道如何在我的C程序中實現一個ISR程序集的機制。我使用Google搜索,但沒有發現任何有用的東西。基本上我想在我的C項目中設置其他所有項(包括寄存器來觸發中斷),但是我希望中斷執行一些我編寫的彙編代碼。如何在C程序(AVR)中編寫程序集ISR?

如果有幫助,我在Windows上使用AVR studio 6。我被告知我需要使用.s文件,但除此之外,我不確定要做什麼。基本結構只是以下幾點?

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

如果我要當TIMER1_COMPA_vect中斷髮射裝配運行(這是在C ISR的名稱)。或者我完全偏離軌道?什麼是我需要做的基本模板?或者如果這是一個愚蠢的問題,有沒有一個鏈接,我可以找到更多的信息?

+0

的PDF副本出於某種原因,我似乎不能回答我的問題,但我想我找到了我後:HTTP ://www.nongnu.org/avr-libc/user-manual/group__asmdemo.html – Sam 2011-04-16 01:54:32

回答

1

彙編語言藝術(Randall Hyde)有兩章關於ISR(17和18,特別是18.5和18.6節可能對你有所幫助)。不久:

  1. 轉到IVT(中斷向量表),並與你的ISR段修改和偏移,保存舊值
  2. 你應該做一個TSR(終止並駐留)程序,讓您的ISR保持駐留到內存中,即使用戶關閉窗口
  3. 記得撥打舊ISR你與工作完成後,(這就是所謂的中斷鏈接)
  4. 您的ISR應該重入(因此,如果當ISR仍在運行時,中斷再次被觸發,pc不會發生爆炸;))

順便說一句,你可以獲取偉大here