找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3142|回复: 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 单片机教程网

快速回复 返回顶部 返回列表