计时器软件 源代码,计时器图片

创建定Timer1并且启动后,假如系统经过了50个tick,xTimeNow从0增长到50,与Timer1的xTicksToWait值相等,这时会触发与Timer1对应的回调函数,…

创建定Timer1并且启动后,假如系统经过了50个tick,xTimeNow从0增长到50,与Timer1的xTicksToWait值相等,这时会触发与Timer1对应的回调函数,从而转到回调函数中执行用户代码,同时将Timer1从软件定时器列表删除,如果软件定时器是周期性的,那么系统会根据Timer1下一次唤醒时间重新将Timer1添加到软件定时器列表中,按照xTicksToWait的升序进行排列。

计时器软件 源代码,计时器图片-飞速吧

计时器软件桌面显示

定时器任务的消息队列深度为configTIMER_QUEUE_LENGTH,设置定时器都是通过发送消息到该队列实现的

本源码示例提供了如何通过巧妙利用子窗体,结合简单的VBA代码编程,在一个窗体上实现多个计时器事件的功能,具体实现请参照附件。

计时器软件 源代码,计时器图片-飞速吧

多功能计时器

既然消息队列是用来处理软件定时器的一些操作指令的,那这些在哪里呢?其实就是软件定时器的一些API函数,如下。

手机悬浮秒表计时器

若大于则表示已经超时,定时器任务将会调用对应定时器的回调函数

计时器下载安装

那系统如何处理软件定时器列表?系统在不断运行,而xTimeNow(xTickCount)随着SysTick的触发一直在增长,在软件定时器任务运行的时候会获取下一个要唤醒的定时器:

在使用Access做开发的时候,我一向的观点都是,能够使用Access实现的功能,就尽量使用Access实现,最大限度的避免引入第三方内容(哪怕这个第三方内容也是微软自家的),减少依赖性。这样才能最大限度的少出问题,尤其是在你开发的软件需要在很多用户的电脑上使用,环境比较复杂的情况下。

当前定时器列表pxCurrentTimerList:系统新创建并激活的定时器都会以超时时间升序的方式插入到pxCurrentTimerList列表中。系统在定时器任务中扫描pxCurrentTimerList中的第一个定时器,看是否已超时,若已经超时了则调用软件定时器回调函数,否则将定时器任务挂起。

软件定时器的多种API函数,如启动、停止、删除、复位、改变周期等,实际是通过宏定义的方式提供:

回顾prvProcessTimerOrBlockTask()函数,定时器定时时间还没到,将当前任务挂起,直到定时器到期才唤醒或者收到命令的时候唤醒:

否则将软件定时器任务挂起,直至下一个要唤醒的软件定时器时间到来或者接收到命令消息

单次模式:当用户创建了定时器并启动了定时器后,定时时间到了,只执行一次回调函数之后就将该定时器删除,不再重新执行。

ppt计时器

这些API函数对应的宏定义,本质上又都是调用了xTimerGenericCommand函数来实现对消息的打包和发送。

下面来看一下当启动多个软件定时器时,软件定时器列表是如何来管理这些定时器的:

当系统时间xTimeNow为40的时候,用户创建并且启动了一个定时时间为50的定时器Timer3,那么此时Timer3的溢出时间xTicksToWait就为40+50=90,同样安装xTicksToWait的数值升序插入软件定时器列表中

软件定时器任务(Daemon任务)的创建是通过xTaskCreate方法来创建,在创建守护任务之前,还要先通过prvCheckForValidListAndQueue函数创建两个列表和一个消息队列:

首先是从定时器列表中获取下一次的溢出时间,因为各定时器的溢出时间是按照升序排列的,因此只需获取下一次的溢出时间。

例如:系统当前时间xTimeNow值为0,注意:xTimeNow其实是一个局部变量,是根据xTaskGetTickCount()函数获取的,实际它的值就是全局变量xTickCount的值,表示当前系统时间。

周期模式:这个定时器会按照设置的定时时间循环执行回调函数,直到用户将定时器删除

相关推荐

发表评论

邮箱地址不会被公开。 必填项已用*标注