會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





在ISR中只有一個中斷源
中級會員
註冊日期:
2014/09/29 12:04
所屬群組:
註冊會員
文章: 61
等級: 6; EXP: 69
HP : 0 / 142
MP : 20 / 1270
離線
嗨,各位好。
想請問一下,如果在ISR裡面只有一個中斷源(假設是TMR1),那我還需要在ISR裡面打if(TMR1F)這個判斷式嗎?

我是認為不用,因為中斷發生後Program Counter就自動跳到中斷向量,但想要確定一下自己的觀念是否正確,故上來請教各位前輩

9月28日 10:37:10
轉換PDF檔 列印


Re: 在ISR中只有一個中斷源
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14125
等級: 72; EXP: 47
HP : 1072 / 1786
MP : 4708 / 70329
離線
基本上只有一個中斷來源是可以不用檢查的。但為維持程式的易讀性及誤動作。

建議還是加入 TMR1IF 的判斷式,如不是 TMR1 的中斷就值得檢討一下程式及硬體上的設計是那裡發生了誤動作了,這時就需停下來檢查一下哪個周邊的中斷誤開了或昰被干擾了。

9月28日 11:55:14
轉換PDF檔 列印


Re: 在ISR中只有一個中斷源
資深會員
註冊日期:
2007/06/05 21:45
所屬群組:
註冊會員
文章: 942
等級: 27; EXP: 30
HP : 0 / 657
MP : 314 / 19928
離線
>> 我是認為不用...觀念是否正確...

理論上 是不用...

但這樣的觀念與實務上,是"不對的"...

Q: 為什麼?
A: 因為一開始就說了,是理論上...
實務上,人寫code不能保證沒有bug...
大家都不會遇到問題,也不需有這個論譠...

結論: 理論上 "不用"
但不能 保有 理論說不用,我就不用寫
實務上 還是要寫...

9月28日 13:15:19
_________________
程式是
依照寫出來(的code),跑出結果
不是依照你想出來的,得到結果

先有需求規格 後有解決方案
轉換PDF檔 列印


Re: 在ISR中只有一個中斷源
中級會員
註冊日期:
2014/09/29 12:04
所屬群組:
註冊會員
文章: 61
等級: 6; EXP: 69
HP : 0 / 142
MP : 20 / 1270
離線
謝謝版主與Jason大大的詳細解釋~
小的受益良多

9月28日 15:12:51
轉換PDF檔 列印


Re: 在ISR中只有一個中斷源
中級會員
註冊日期:
2014/09/29 12:04
所屬群組:
註冊會員
文章: 61
等級: 6; EXP: 69
HP : 0 / 142
MP : 20 / 1270
離線
想在請問一下,以下這個程式會不會有BUG?

void ISR(void)
{
if(TMR1IF){
TMR1IF=0;
flag = SSP1BUFl; //用I2C抓flag;
重新寫入timer;
while(flag = 1);
}
}

timer每一秒進入一次中斷,第一次進入時I2C抓到的flag為1,進入無限迴圈。

請問TIMER有辦法觸發第二次中斷嗎?
假如有辦法觸發,代表ISR這個function是re-reentrant嗎?

用這個方式寫的話,是不是馬上就stack overflow了?

9月29日 18:33:31
轉換PDF檔 列印


Re: 在ISR中只有一個中斷源
中級會員
註冊日期:
2015/05/27 22:04
所屬群組:
註冊會員
文章: 42
等級: 5; EXP: 27
HP : 0 / 106
MP : 14 / 748
離線
引用:

firststop0 寫道:
想在請問一下,以下這個程式會不會有BUG?

void ISR(void)
{
if(TMR1IF){
TMR1IF=0;
flag = SSP1BUFl; //用I2C抓flag;
重新寫入timer;
while(flag = 1);
}
}

timer每一秒進入一次中斷,第一次進入時I2C抓到的flag為1,進入無限迴圈。

請問TIMER有辦法觸發第二次中斷嗎?
假如有辦法觸發,代表ISR這個function是re-reentrant嗎?

用這個方式寫的話,是不是馬上就stack overflow了?

while (flag = 1);
會永遠卡住喔. 檢查flag應該擺到主程式那邊做.
while (flag==1); 在flag == 1 時,會卡住. 因為中斷ISR可能讓flag變回0, 這樣就會脫離 while (flag==1); 迴圈。繼續執行後續的指令。

9月29日 18:45:45
轉換PDF檔 列印


Re: 在ISR中只有一個中斷源
中級會員
註冊日期:
2014/09/29 12:04
所屬群組:
註冊會員
文章: 61
等級: 6; EXP: 69
HP : 0 / 142
MP : 20 / 1270
離線
謝謝a大,您的意思是,ISR沒辦法在執行到一半的時候,再呼叫自己囉?

9月30日 13:12:45
轉換PDF檔 列印


Re: 在ISR中只有一個中斷源
資深會員
註冊日期:
2004/07/23 16:25
所屬群組:
註冊會員
文章: 1170
等級: 29; EXP: 88
HP : 0 / 722
MP : 390 / 27930
離線
pic 沒這麼複雜,進中斷 gie =0 所以不會再 中斷

想讓他再中斷 gie=1 就會再中斷

然後程式就會超出『一般人』所能掌控、想像

至於
想請問一下,如果在ISR裡面只有一個中斷源(假設是TMR1),那我還需要在ISR裡面打if(TMR1F)這個判斷式嗎?

無論一個、兩個,甚至零個,都要加上個別的判斷

只有一個中斷源 時會動,

有兩個以上中斷源 時就要加了

沒有中斷源時,還是要加

所以加上去,只有好處,沒有壞處。

9月30日 23:20:54
轉換PDF檔 列印


Re: 在ISR中只有一個中斷源
中級會員
註冊日期:
2015/05/27 22:04
所屬群組:
註冊會員
文章: 42
等級: 5; EXP: 27
HP : 0 / 106
MP : 14 / 748
離線
引用:

firststop0 寫道:
謝謝a大,您的意思是,ISR沒辦法在執行到一半的時候,再呼叫自己囉?

即使沒看規格書,有時候自己的問題,也可以自己很快找到答案。
以此為例。
如果同一個ISR可以重複進入,
原本中斷A1沒結束,來了另一個中斷A2,這兩個都沒有結束,又來一個中斷A3,...那麼,多少系統資源可以使用呢?
很明顯,辦不到。
如果可以辦到,也會變成很奇怪。
有中斷優先權的,如PIC18,高低優先權的ISR是分開的。PIC24,各自周邊的中斷優先權可以設定不同,讓希望優先處理的先做。不管那一種,至少,"允許同一種中斷還沒結束,又讓同一種中斷插入執行" 這種怪異不合理的MCU,我沒看過。
如果你手邊有想測試驗證的MCU,直接寫程式,利用一個(或更多)LED的亮滅,來驗證流程。
Try.It.Yourself. 留在腦中的知識,經驗,通常會比論壇上發問得到的多,因為,別人的回答,他認為很重要的,也許你看不懂或忽視認為不重要。而他認為很基本,不需要多講的,也許是你當時會卡住的關鍵。所以,能夠自行驗證確認的,盡量自己做,我是覺得這樣比較好。供你參考。
(Google How to ask question. 好幾次,我曾想在論壇問問題,在整理問題的過程中,就找到解決的對策。而且,好的問題,通常會讓討論者都得到成長。)

10月01日 08:18:13
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
線上教學影片
網頁捷徑
2017 Summer Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project