久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4223|回復: 24
打印 上一主題 下一主題
收起左側

單片機定時器中斷里面的其它代碼指令,是定時器自己去執行的?還CPU執行的?

  [復制鏈接]
跳轉到指定樓層
樓主
ID:382454 發表于 2019-9-23 15:09 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
書上經常寫到的,單片機內部的定時器是單片機內部的獨立部門,與CPU完全隔開的,所以定時器工作時不受CPU的干預,也就是說定時器干的活完全由定時器自己完成。對吧!
那么在定時器中斷函數里寫的其它代碼,比如時基代碼,時,分,秒這些,是要CPU來執行?還是定時器自己去完成?
那問題來了,如果定時器中斷代碼要CPU停下來當前的工作去執行的話,那時基代碼執行是很頻繁的,這個頻繁的工作由CPU停下當前的工作去執行時基代碼,那定時器就不算是獨立的器件了。對吧?因為她經常要CPU停下來去執行定時器中斷代碼,并且是占用了CPU資源。
所以我想問,定時器中斷里的代碼是由定器內部執先完的呢?還是要由CPU停下當前的活,再跳過去執行的?

下面單片機定時器中斷代碼
  1. /***********************************************
  2. 函數名稱:Timer0_ISR
  3. 功 能:定時器0中斷服務函數
  4. 入口參數:無
  5. 返 回 值:無
  6. 備 注:
  7. ************************************************/
  8. void Timer0_ISR(void) interrupt TIMER0_VECTOR
  9. {
  10. static unsigned char T0_Cnt=0; //計數器 20ms毫秒

  11. T0_Cnt++; //計數器加1
  12. if(T0_Cnt==50) //定時20ms*50=1s秒 即(1000ms)到
  13. {
  14. T0_Cnt=0;
  15. T0_second++; //1秒自加1 到60秒下面自動清零
  16. sumsecond++; //定時秒到在這里可以調用1-6秒

  17. //*******************************//
  18. if( (sumsecond==4)&&(flag_pow==0) ) //定時4秒到
  19. {
  20. flag_pow=1;
  21. }
  22. //*******************************//
  23. if(sumsecond==6) //定時6秒到
  24. {
  25. sumsecond=0;
  26. }

  27. //******************************//
  28. if(Pow_watch_flag==1) //電源掉電計數位
  29. {
  30. Pow_watch_time++; //電源
  31. if(Pow_watch_time==3) //到3秒自動清零
  32. {
  33. Pow_watch_time=0;
  34. }
  35. }
  36. //*******************************//
  37. if(flag_speaker==1) //喇叭保護重計數標志位
  38. {
  39. sum_speaker++;
  40. if(sum_speaker==5)
  41. {
  42. sum_speaker=0;
  43. }
  44. }
  45. //*******************************//
  46. }

  47. if(T0_second==60) //定時1分到
  48. {
  49. T0_second=0; //秒清零
  50. T0_minute++; //分鐘自加1
  51. }

  52. if(T0_minute==10) //定時10分鐘到
  53. {
  54. T0_minute=0;
  55. T0_summinute++; //10分鐘累加
  56. }

  57. if(T0_summinute==6) //定時60分鐘到
  58. {
  59. T0_summinute=0;
  60. }

  61. }
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:332444 發表于 2019-9-23 15:47 | 只看該作者
以我對單片機粗淺的認知來理解,定時器只負責計數而已,其他的蝦米都不能作,那么,可想而知.
回復

使用道具 舉報

板凳
ID:235200 發表于 2019-9-23 15:49 | 只看該作者
定時器的代碼是由CPU執行的,只是定時是自己完成的
回復

使用道具 舉報

地板
ID:235200 發表于 2019-9-23 15:55 | 只看該作者
是要占用CPU的資源執行代碼,所指獨立是指計時部分是獨立的,計時(定時)不占用CPU時間
回復

使用道具 舉報

5#
ID:56665 發表于 2019-9-23 16:15 | 只看該作者
中斷里面除了變量加減外,其它都與CPU有關。
回復

使用道具 舉報

6#
ID:382454 發表于 2019-9-23 17:00 | 只看該作者
如果你們說的定時器中斷代碼里的加加,減減,和其它指令是要CPU停下前的工作,再跳過去執行的話,我認為我們寫的程序100%會亂套啊。
很單簡,我們寫程序時,經常用的一些幾us 和幾十個ms的精確延時呀,對吧。就象一些單總線的器件,對時序要求非常嚴的情況的。
比如CPU正在調用8us的精確延時,(很小的時間)正跑到2us時,定時器中斷來的,那CPU就馬上停下當前的工作去執行定時器中斷代碼,完成后再跳回來不知何年馬月了,之后回頭再跑到原位執行,怎么可能達到8us時間啊???對吧?

我們寫的程序,不會發生這樣的問題,比如定時器有時基代碼,主程序里有單總線元件的精確延時代碼,程序啟動后都可以得到準確無誤的執行,單總線延時也是OK的。

所以我認為,定時器中斷的加加,減減和其它代碼,是由單片機內部硬件自己完成的。不需要CPU去參于,如果是你們說的要CPU停下來再跳過去執行,那寫的程序肯定會亂套了。對吧???
回復

使用道具 舉報

7#
ID:401564 發表于 2019-9-23 17:11 | 只看該作者
你只要看到的代碼,不管是在在哪個位置,中斷也行,別的函數也行,都是要由CPU去執行的
定時器中斷也是一樣的
一個定時器中斷是這樣執行的:
1,響應中斷,2現場保護,3,執行中斷,4返回剛才主程序響應中斷的地方
整個過程都是要由CPU來完成的
定時器在整個過程中,只有它自己的那計數器一直在計數,如果你CPU有關閉的指令,它就關閉,沒有就以它自己的模式一直在不斷的運行著
告訴最想知道的:定時器的中斷程序是由CPU停下手中的活,先去執行定時器中斷里面的代碼,完了再返回CPU繼續執行

對于時基程序,那就得精確的計算了,比如你要一個1000uS的定時器中斷,那么你定時器的溢出肯定不能是1000uS的,你得把中斷程序中要執行的代碼的執行時間也計算在這1000uS內,假設你中斷代碼要執行的時間是100uS,那么,你就要把定時器的溢出設定成900uS,這樣你的時間才是準確的,這就是為什么會11.052MHZ這種古怪的頻率的晶振了
回復

使用道具 舉報

8#
ID:382454 發表于 2019-9-23 17:18 | 只看該作者
Y_G_G 發表于 2019-9-23 17:11
你只要看到的代碼,不管是在在哪個位置,中斷也行,別的函數也行,都是要由CPU去執行的
定時器中斷也是一 ...

當CPU在 “2現場保護”,后再跳回來,精確延時就不對了。這樣不是會亂套了,我上面說了。
回復

使用道具 舉報

9#
ID:7485 發表于 2019-9-23 19:41 | 只看該作者
定時器是不會運行代碼或指令的,當然是CPU停下手中的活,接手、運行中斷服務程序中的指令。
回復

使用道具 舉報

10#
ID:351097 發表于 2019-9-23 19:49 | 只看該作者
對于你所說的情況,要先減少定時誤差,最好在定時器中斷函數里面不要做過多操作。這樣,CPU響應中斷操作后,就可以立馬中斷返回。一般不是很多地方需要精確延時,允許有一點誤差。比如單總線通信、軟件模擬I2C通信等。另外,如果你的CPU執行指令的速度比較快的話,在定時器中斷函數里面占用的時間就少,定時器延時就更準確了。
回復

使用道具 舉報

11#
ID:235200 發表于 2019-9-23 20:02 | 只看該作者
精準的延時是要考慮進入中斷所占用CPU的時間的,但不保證絕對精準,特別是C語言編程,改用匯編語言編程效果會好一些
回復

使用道具 舉報

12#
ID:615387 發表于 2019-9-23 20:35 | 只看該作者
個人理解,應該是晶振在工作,中斷應該是cup在處理的
回復

使用道具 舉報

13#
ID:213173 發表于 2019-9-23 20:45 | 只看該作者
定時器不可以執行任何程序,只能按照預置的時間向CPU發出中斷請求,由CPU暫停正在執行的任務去執行定時器中斷任務,完成后回到暫停點繼續執行原來的任務。樓主擔心中斷任務對主循環任務的干擾是事實存在的,需要根據具體應用通過編程技巧避免這種干擾。對于主循環中不可暫停的任務可以暫時關閉總中斷,完成后再打開總中斷。
回復

使用道具 舉報

14#
ID:401564 發表于 2019-9-24 08:57 | 只看該作者
univers 發表于 2019-9-23 17:18
當CPU在 “2現場保護”,后再跳回來,精確延時就不對了。這樣不是會亂套了,我上面說了。

我后面那段話打的字白打了
如果你要一個1000uS的延時,16位定時器要工作在1模式,中斷程序的代碼執行時間是50uS,那么,設定16位定時器的溢出就是950
當中斷被觸發的時候延時開始,執行時間是50uS,中斷返回.950uS之后再次觸發中斷,這個過程不就是精確的1000uS了?
你告訴我,哪里不對了
對于你說的那些問題,是基于你對單片機的不了解產生的
比如,你說的:如果你延時的時間很短,只有8uS,但定時器執行代碼可能是50uS的長度,那么肯定是會出現問題的,像這種情況,在8051的8位定時器模式0就是可以自動加載延時時間的,它可以做到只有兩條指令,也就是兩個時鐘周期的中斷,對于12MHZ的晶振,所用的時間就是2uS
從你的話里,我認為你并沒有真正的編寫過一個嚴謹的定時器延時程序,甚至是中斷都不太了解是怎么一回事
編程是一門很嚴謹的技術,并不是你覺得它會亂或者太麻煩了就不會這樣執行了
C語言會由于編譯器的不同,編譯出來的效率也不同,所以,C語言在精確到幾個時鐘周期的精確度是很難做到的,所以,你會看到有的人在寫C的時候會嵌入匯編,匯編語言可以精確到一個時鐘周期
回復

使用道具 舉報

15#
ID:277448 發表于 2019-9-24 10:08 | 只看該作者
CPU 暫停下來處理中斷事務,完了會恢復現場。
回復

使用道具 舉報

16#
ID:332444 發表于 2019-9-24 10:22 | 只看該作者
應該去學一下單片機組成的硬件部分,計數器的電子元件組成只能是完成計數的功能,不能像CPU那樣可以自行指令的硬件組成.
回復

使用道具 舉報

17#
ID:332444 發表于 2019-9-24 10:23 | 只看該作者
單片機的硬件不需要精通,了解則是必須的,否則,就會出現誤解的情況發生.
回復

使用道具 舉報

18#
ID:382454 發表于 2019-9-24 11:19 | 只看該作者
謝謝老鳥們的科譜。。。謝謝!!!
回復

使用道具 舉報

19#
ID:429156 發表于 2019-9-26 14:32 | 只看該作者
定時器中斷就是強行打斷CPU正在干的活,轉而執行中斷安排的活
回復

使用道具 舉報

20#
ID:382454 發表于 2019-9-28 09:46 | 只看該作者
我認為單片機定時器中斷指令,要有獨立的小CPU來完成才更好,這樣定時器的代碼就不要一個CPU來執行了。這樣CPU干她自己的活。定時器有自己的門部處理,這們時效才快。你們說對不對???
回復

使用道具 舉報

21#
ID:560467 發表于 2019-10-2 12:36 | 只看該作者
定時器只是計數,定時器里面的函數是單片機來運行的,定時器的作用是按照你需要的時間間隔來使cpu運行一次你所需要運行的程序運行完了以后cpu在回到打斷之前運行的程序里,繼續運行
回復

使用道具 舉報

22#
ID:284583 發表于 2019-10-2 19:51 | 只看該作者
我的理解是,CPU執行程序的過程中,當出現中斷請求時,CPU會放下當前的程序,去執行中斷的程序,執行完后再回來繼續執行CPU剛才所放下的程序。
回復

使用道具 舉報

23#
ID:618842 發表于 2019-10-2 20:28 | 只看該作者
都是cpu來執行的 形象的形容一下 定時器就是要在特定的時間告訴 cpu 你應該做什莫  
回復

使用道具 舉報

24#
ID:382454 發表于 2021-12-23 16:59 | 只看該作者
Y_G_G 發表于 2019-9-23 17:11
你只要看到的代碼,不管是在在哪個位置,中斷也行,別的函數也行,都是要由CPU去執行的
定時器中斷也是一 ...

謝謝老大指點!!!
回復

使用道具 舉報

25#
ID:994053 發表于 2021-12-24 14:16 | 只看該作者
CPU 暫停下來處理
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩中文字幕在线 | 欧美精品一二三区 | 欧美综合久久 | 99久久精品一区二区毛片吞精 | 91免费看片| 丁香婷婷在线视频 | av超碰 | 国产精品国产三级国产aⅴ无密码 | 成人免费观看视频 | 青草青草久热精品视频在线观看 | 欧美一级黄色片 | 亚洲在线免费 | 国产传媒在线播放 | 91av视频在线播放 | 日本在线精品视频 | 夜夜av| 欧美极品一区二区 | 成人欧美日韩一区二区三区 | 一级黄色片在线免费观看 | 在线a视频 | 性色的免费视频 | 全免费a级毛片免费看视频免 | 成人av资源在线 | 美女黄色在线观看 | 天天天天天天天干 | 欧美一级免费观看 | 亚洲区一| 欧美午夜精品久久久久免费视 | 黄色一级大片在线免费看产 | 99精品免费视频 | 成人在线观看免费爱爱 | 日韩一区二区在线视频 | 日日日日日日bbbbb视频 | 成年人在线观看视频 | 久久久人 | 国产美女久久 | 成人高清在线 | 亚洲九色 | 国产一区二区三区四区三区四 | 日韩免费av | 金莲网 |