|
最近在重新認(rèn)識(shí)中斷的時(shí)候遇到這樣一個(gè)問(wèn)題,。我在仔細(xì)看了郭天祥老師的《51單片機(jī)c語(yǔ)言教程》書籍例3.5.1和例3.5.2后有個(gè)一直想不明白的問(wèn)題,,郭老師說(shuō),一般我們?cè)谥袛喾⻊?wù)程序中不要寫太多的處理語(yǔ)句,如果語(yǔ)句過(guò)多,中斷服務(wù)中的代碼還沒(méi)有執(zhí)行完畢,而下一次中斷又來(lái)臨,,這樣我們就失去這次中斷,,這個(gè)是不是說(shuō),當(dāng)中斷服務(wù)中的代碼還正在執(zhí)行,而下一次中斷又來(lái)臨了,那么就失去這次中斷,,是不是num就少加了一次值啦,就是說(shuō)在執(zhí)行中斷服務(wù)中的代碼時(shí),來(lái)不及響應(yīng)num++,是這樣嗎,但是聯(lián)想到例3.5.2的時(shí)候我就又不解了,,。。
void T0_time() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num++;
if(num==20)
{
num=0;
led1=~led1;
}
}
書里指出,不能把判斷發(fā)光管的時(shí)間是否到達(dá)的語(yǔ)句寫在主程序中,若寫在主程序中,有可能發(fā)生如下情況,,當(dāng)在主程序運(yùn)行在顯示數(shù)碼管語(yǔ)句當(dāng)中時(shí),此時(shí)恰好定時(shí)器0進(jìn)入中斷并且num1剛好也加到4,當(dāng)定時(shí)器0中斷再次進(jìn)入時(shí),主程序仍未退出數(shù)碼管顯示語(yǔ)句,那么此時(shí)num1的值便成了5,這樣的話,,num1=4這個(gè)點(diǎn)便永遠(yuǎn)檢測(cè)不到了。部分程序如下
void T0_time() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num1++;
if(num1==4)
{
num1=0;
led1=~led1;
}
}
仔細(xì)看了這幾個(gè)地方,我是這么理解的是不是上面 第一個(gè)程序中斷服務(wù)中的代碼還沒(méi)有執(zhí)行完畢,而下一次中斷又來(lái)臨時(shí)會(huì)丟失,而來(lái)不及響應(yīng)來(lái)不及響應(yīng)num++這個(gè)語(yǔ)句,,,而第二個(gè)程序中在執(zhí)行,定時(shí)器0進(jìn)入中斷并且num1剛好也加到4,數(shù)碼管的顯示語(yǔ)句也還沒(méi)有執(zhí)行完,當(dāng)定時(shí)器0中斷再次進(jìn)入時(shí),此時(shí)num1的值便成了5了,num1=4這個(gè)點(diǎn)便永遠(yuǎn)檢測(cè)不到了,,,看起來(lái)就沒(méi)有丟失這次中斷,,為什么第一個(gè)例子會(huì)丟失中斷,,而第二個(gè)確沒(méi)有丟失中斷啦,,但是我也想了一下,,如果真的num1的值便成了5,,,是不是可以把 if(num1==4)改寫成if(num1>=4),即便真的num1的值跑飛了,,大于4了,也可以將num1的值重新清零,控制發(fā)光管繼續(xù)運(yùn)行,。。。在線等待大家解答,謝謝。。
|
|