欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
為什么盡量在單片機中斷函數中不要使用延時?
[打印本頁]
作者:
vhantes
時間:
2018-5-15 19:04
標題:
為什么盡量在單片機中斷函數中不要使用延時?
為什么盡量在單片機的中斷函數中不要使用延時 ,我們老師這樣說了,但還沒告訴我們原因
我們現在開始接觸單片機,還不清楚后面的知識。為什么盡量不要用延時呢 求問各位大佬
作者:
jim.zhu
時間:
2018-8-31 08:38
使用延時導致整體的效率變低,相當于機器在空轉,沒有做任何事,空轉的這段時間可以去干其他的事情
作者:
藍天清野
時間:
2018-8-31 11:07
CPU利用率降低,代碼執行周期較長!
作者:
大盤雞
時間:
2018-8-31 16:08
中斷等級比較高,CPU會優先處理中斷,延時有點浪費資源
作者:
gpzmvp
時間:
2018-8-31 16:36
中斷其實就是讓你mcu臨時干一下別的工作,中斷函數越精簡,程序理論效率越高。以后接觸到操作系統你就會有深入的體會。
作者:
somayboy
時間:
2018-8-31 17:19
51黑電子是個好的學習網站,幫助了我很多 謝謝
作者:
admin
時間:
2018-8-31 17:21
somayboy 發表于 2018-8-31 17:19
51黑電子是個好的學習網站,幫助了我很多 謝謝
不要發與提問無關的內容,這樣會影響到
作者:
scbin
時間:
2018-8-31 18:17
中斷觸發時會跳進中斷中執行,而主函數中的程序會壓入堆棧中停止執行。如果主函數中程序很短,中斷執行的時間可以長。具體的需要根據所要實現的具體功能而定,機器是死的,人是活的。
作者:
angmall
時間:
2018-8-31 18:53
通常在中斷子程序中是不調用延時子程序的,這樣會增加中斷處理時間,如果有其它低級中斷了,就會延誤響應中斷了。
所以,中斷子程序中不要寫調用延時子程序,中斷子程序也不要寫得過長,處理過多的任務,要盡快處理后及時返回,如果中斷一次有很多任務需要執行完全,可以在中斷子程序中設置一個標志位,在主程序中查這個標志位,當標志為1時,就在主程序中完成這些任務,這樣就不會影響其它中斷源的中斷,也不會使中斷產生混亂。
作者:
昆明路口賣提莫
時間:
2018-8-31 19:27
杜絕純延時 ,如果代碼多的話 完全是浪費時間,小的程序或許不明顯,但是假如你將來做大一點的程序的話 弊病就顯示出來了,浪費cpu 用定時器中斷就比較好了
作者:
angmall
時間:
2018-8-31 19:32
盡量在單片機中斷函數中不要使用延時,如果調用延時函數。 如果延時函數時間過長,則下次中斷有可能不會被觸發,類似按鍵不靈敏,還有可能因為中斷和主程序都在使用延時函數,而和此相關的寄存器的值沒有保存,導致延時時間出錯。
作者:
sgj511285515
時間:
2018-8-31 22:28
不光是中斷,就是任務中,一般都不要用過長的delay,時間長 可以用定時器,在定時器中設置變量,在程序中查詢,用了過多delay,這個叫阻塞了,而且中斷有優先級,如果高優先級的中斷中,使用了延時函數,低中斷可能會遺漏
作者:
psuxaog
時間:
2018-10-21 11:27
本帖最后由 psuxaog 于 2018-10-21 11:42 編輯
如果你用定時中斷置標志位,主程序查詢標志位的情況,如果中斷中有延時,且大于定時時間,此時會出現主程序無法執行的情況,如果有用到看門狗,單片機會重復復位,即使沒有看門狗,主程序中的程序不運行也是要命的。
中斷中用的變量也是有講究的,比如以下情況:
下面的代碼中gValTmp是16位變量,TMP_Process是主循環中的程序,51單片機是8位機,給gValTmp賦值的時候是一個字節是個字節處理的,16位是兩個字節,如果已經處理了第一個字節的時候發生了中斷,那中斷中的gValTmp的值就不是正常的值(另一個字節沒有刷新呀),會導致數據錯亂。
u16 gValTmp = 0;
void TIM0_IRQ interrupt IRQ_T0
{
TL0 = XXX;
TH0 = XXX;
TMP_SendData(gValTmp);
}
void TMP_Process(void)
{
gValTmp = TMP_GetValue();
}
復制代碼
將以上代碼稍作修改,這個問題就可以解決了:
u16 gValTmp = 0;
bit gFlagUpdated = 0;
void TIM0_IRQ interrupt IRQ_T0
{
TL0 = XXX;
TH0 = XXX;
if(gFlagUpdated)
{
gFlagUpdated = 0;
TMP_SendData(gValTmp1);
}
}
void TMP_Process(void)
{
gValTmp = TMP_GetValue();
gFlagUpdated = 1;
}
復制代碼
除了以上兩種方式,也可以在賦值前關中斷,賦值后開中斷的方式,不會不推薦這樣方式,容易導致時基不準。
作者:
bxulaoshu123
時間:
2018-10-21 12:50
中斷里面加了延時的話,會導致下一個中斷不能及時響應
作者:
xieyuhang66666
時間:
2018-10-21 13:48
因為沒有必要,反而增加了系統負擔,增加了處理時間。
作者:
296474491
時間:
2018-10-21 13:58
中斷子程序中不要寫調用延時子程序,中斷子程序也不要寫得過長,處理過多的任務,要盡快處理后及時返回,如果中斷一次有很多任務需要執行完全,可以在中斷子程序中設置一個標志位,在主程序中查這個標志位,當標志為1時,就在主程序中完成這些任務,這樣就不會影響其它中斷源的中斷,也不會使中斷產生混亂。
作者:
虛幻大千
時間:
2018-10-21 16:48
中斷容易產生混亂
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1