搜索
bottom↓
回复: 8

虚拟定时器的思想不知道可否实现

[复制链接]

出0入0汤圆

发表于 2013-12-10 16:17:13 来自手机 | 显示全部楼层 |阅读模式
当我们在编写延时程序时,通常采用软件延时,它具有的缺点是延时不准确,如果要想延时准确的话!必须使用定时器或者汇编,但是对于资源较少的单片机而言定时器也是比较珍贵的,我有中新的想法就是在定时器函数里面调用函数指针,只要在外部分别配上不同的定时值和不同的函数指针就达到了一个定时器可以虚拟成多个定时器了。但是我不确定在中断服务程序里面使用函数指针实现子函数调用是否有问题!(堆栈溢出相关问题)对我的想法是否可行和有意义!希望老鸟们多点评一下。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2013-12-10 16:22:20 | 显示全部楼层
其实很多时候并不需要非常精确的定时,这个时候我的做法是:
中断里Timer++,然后主程序不停查询 if( Timer >= 10) {},如果定时器每100us中断一次,那么就是1ms的延时;
这种做法可以作出N多个定时器

出0入0汤圆

发表于 2013-12-10 16:28:05 | 显示全部楼层
STM32中用过类似的:
SystemTick中断中循环计数 STCnt++
定时时获取当前 STCnt 值并计算出时间T后的STCnt值,在需要处查询是否时间到,想用多少个定时器就用多少。
这种方法 STCnt溢出会有问题,由于STM32的最大计数值已经很长,我的程序可以不考虑这种情况

出0入0汤圆

发表于 2013-12-10 19:37:51 | 显示全部楼层
可以参考时间触发那本书,里面的概念和你的思路相似。在中断服务中可以实现你的指针函数,你考虑到堆栈溢出的问题,这个前瞻性很好,堆栈在任何MCU编程中都需要设置好。如果你使用的MCU中的中断栈和用户栈是同一个,那么你要特别注意,在进出中断的入栈和出栈的保护,防止中断嵌套,这些都会导致栈出现问题。如果你的MCU有特权模式,那么堆栈的栈指针可以在初始化时将它和用户栈指针尽量分开,在中断入栈和出栈一定要配套否则入栈和出栈的地址不同,将会导致在某个时间就会死机乱飞。你的虚拟定时器,实际要时间触发机制,在操作系统称为软定时器任务,即用户自己封装的时间触发机制

出0入0汤圆

发表于 2013-12-10 20:11:14 | 显示全部楼层
bigZ 发表于 2013-12-10 16:22
其实很多时候并不需要非常精确的定时,这个时候我的做法是:
中断里Timer++,然后主程序不停查询 if( Timer ...

我一直都是这么干的

出0入0汤圆

发表于 2013-12-10 23:12:24 | 显示全部楼层
这个思路没有任何问题,rtos里面的软件定时器都是这么干的。维护一个定时器控制块列表,中断里面查找需要执行的定时器,然后立即或推迟执行。

出0入0汤圆

发表于 2013-12-11 08:14:18 来自手机 | 显示全部楼层
uIP里面的定时器就是这样做的吧

出0入0汤圆

 楼主| 发表于 2015-12-3 08:57:05 | 显示全部楼层
mq-life 发表于 2013-12-10 16:28
STM32中用过类似的:
SystemTick中断中循环计数 STCnt++
定时时获取当前 STCnt 值并计算出时间T后的STCnt值 ...

在取过去时间的时候用循环队列的思想 ,应该可以解决溢出问题。

出0入0汤圆

发表于 2015-12-15 16:40:31 | 显示全部楼层
1066950103 发表于 2015-12-3 08:57
在取过去时间的时候用循环队列的思想 ,应该可以解决溢出问题。

如果后一个时间比前一个时间小,说明溢出了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 00:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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