在linux下实现定时器主要有如下方式
创新互联于2013年开始,先为田东等服务建站,田东等地企业,进行企业商务咨询服务。为田东企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
在这当中 基于时间轮方式实现的定时器 时间复杂度最小,效率最高,然而我们可以通过 优先队列 实现时间轮定时器。
优先队列的实现可以使用最大堆和最小堆,因此在队列中所有的数据都可以定义排序规则自动排序。我们直接通过队列中 pop 函数获取数据,就是我们按照自定义排序规则想要的数据。
在 Golang 中实现一个优先队列异常简单,在 container/head 包中已经帮我们封装了,实现的细节,我们只需要实现特定的接口就可以。
下面是官方提供的例子
因为优先队列底层数据结构是由二叉树构建的,所以我们可以通过数组来保存二叉树上的每一个节点。
改数组需要实现 Go 预先定义的接口 Len , Less , Swap , Push , Pop 和 update 。
timerType结构是定时任务抽象结构
首先的 start 函数,当创建一个 TimeingWheel 时,通过一个 goroutine 来执行 start ,在start中for循环和select来监控不同的channel的状态
通过for循环从队列中取数据,直到该队列为空或者是遇见第一个当前时间比任务开始时间大的任务, append 到 expired 中。因为优先队列中是根据 expiration 来排序的,
所以当取到第一个定时任务未到的任务时,表示该定时任务以后的任务都未到时间。
当 getExpired 函数取出队列中要执行的任务时,当有的定时任务需要不断执行,所以就需要判断是否该定时任务需要重新放回优先队列中。 isRepeat 是通过判断任务中 interval 是否大于 0 判断,
如果大于0 则,表示永久就生效。
防止外部滥用,阻塞定时器协程,框架又一次封装了timer这个包,名为 timer_wapper 这个包,它提供了两种调用方式。
参数和上面的参数一样,只是在第三个参数中使用了任务池,将定时任务放入了任务池中。定时任务的本身执行就是一个 put 操作。
至于put以后,那就是 workers 这个包管理的了。在 worker 包中, 也就是维护了一个任务池,任务池中的任务会有序的执行,方便管理。
func startTimer(f func()) {
go func() {
for {
f()
now := time.Now()
// 计算下一个零点
next := now.Add(time.Hour * 24)
next = time.Date(next.Year(), next.Month(), next.Day(), 0, 0, 0, 0, next.Location())
t := time.NewTimer(next.Sub(now))
-t.C
}
}()
}
gxwork2可以根据上面写的数字来暂停。写着51,定时器0,暂停TR0=0,继续TR0=1,这是软件控制,若要外部中断电平启动,则需要在相应的引脚上加启动电平。
您好,51单片机计时器暂停键的编程实现,需要使用到51单片机的定时器模块,以及相关的中断机制。
首先,需要在51单片机的定时器模块中设置定时器的计数值,以及定时器的工作模式,以便实现定时器的计时功能。其次,需要在51单片机的中断机制中设置定时器的中断服务函数,以便在定时器计数值溢出时,可以触发定时器的中断服务函数,从而实现定时器的计时功能。
最后,需要在51单片机的暂停键中设置中断服务函数,以便在按下暂停键时,可以触发暂停键的中断服务函数,从而实现定时器的暂停功能。在暂停键的中断服务函数中,需要关闭定时器的计时功能,以及清除定时器的计数值,以便实现定时器的暂停功能。
综上所述,51单片机计时器暂停键的编程实现,需要使用到51单片机的定时器模块,以及相关的中断机制,具体步骤如下:
1. 在51单片机的定时器模块中设置定时器的计数值,以及定时器的工作模式,以便实现定时器的计时功能。
2. 在51单片机的中断机制中设置定时器的中断服务函数,以便在定时器计数值溢出时,可以触发定时器的中断服务函数,从而实现定时器的计时功能。
3. 在51单片机的暂停键中设置中断服务函数,以便在按下暂停键时,可以触发暂停键的中断服务函数,从而实现定时器的暂停功能。
4. 在暂停键的中断服务函数中,需要关闭定时器的计时功能,以及清除定时器的计数值,以便实现定时器的暂停功能。
以上就是51单片机计时器暂停键的编程实现,希望能够帮助您解决问题。