1066950103 发表于 2013-12-10 16:17:13

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

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

bigZ 发表于 2013-12-10 16:22:20

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

mq-life 发表于 2013-12-10 16:28:05

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

fengyuganyu 发表于 2013-12-10 19:37:51

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

bailangcn 发表于 2013-12-10 20:11:14

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

我一直都是这么干的

myflyer 发表于 2013-12-10 23:12:24

这个思路没有任何问题,rtos里面的软件定时器都是这么干的。维护一个定时器控制块列表,中断里面查找需要执行的定时器,然后立即或推迟执行。

creep 发表于 2013-12-11 08:14:18

uIP里面的定时器就是这样做的吧

1066950103 发表于 2015-12-3 08:57:05

mq-life 发表于 2013-12-10 16:28
STM32中用过类似的:
SystemTick中断中循环计数 STCnt++
定时时获取当前 STCnt 值并计算出时间T后的STCnt值 ...

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

avr_sz 发表于 2015-12-15 16:40:31

1066950103 发表于 2015-12-3 08:57
在取过去时间的时候用循环队列的思想 ,应该可以解决溢出问题。

如果后一个时间比前一个时间小,说明溢出了
页: [1]
查看完整版本: 虚拟定时器的思想不知道可否实现