定时器

Linux内核定时器

≡放荡痞女 提交于 2019-12-04 12:00:40
1、前言 Linux内核中的定时器是一个很常用的功能,某些需要周期性处理的工作都需要用到定时器。在Linux内核中,使用定时器功能比较简单,需要提供定时器的超时时间和超时后需要执行的处理函数。 2、API接口 在Linux内核中使用全局变量jiffies来记录系统从启动以来的系统节拍数,当系统内核启动的时候,会将该jiffies初始化为0,该定义在文件kernel/include/linux/jiffies.h文件中,如下: extern u64 __jiffy_data jiffies_64; extern unsigned long volatile __jiffy_data jiffies; #if (BITS_PER_LONG < 64) u64 get_jiffies_64(void); #else static inline u64 get_jiffies_64(void) { return (u64)jiffies; } #endif 在上面的代码中,jiffies_64与jiffies变量类似,jiffies_64用于64的系统,而jiffies用于32位系统,Linux内核使用HZ表示每秒的节拍数,使用jiffies/HZ可以获得系统已经运行的时间,单位为秒。 /* time_is_before_jiffies(a) return true if a is

java Spring定时器 每个季度执行一次

纵饮孤独 提交于 2019-12-04 10:46:51
@Scheduled(cron = " 0 00 00 1 4,7,10,1 ?")//每个季度的第一天零点进行统计此注解是每个季度结束后的下一天执行(因为Spring不识别字母(L---每月最后一天))所以只能采用下个月的第一天以下代码针对时间进行处理 Calendar cal = Calendar.getInstance();//当前时间int month = cal.get(Calendar.MONTH) + 1;//当前月份int year = cal.get(Calendar.YEAR);//当前年int quarter=0;//当前季度int stm = 1;//季度的起始月份int etm = 3;//季度的结束月份switch (month){ case 1: stm = 10; etm=12; quarter=3; year=year-1; break;//因为一月份进入方法是统计上一年第四季度的信息,所以处理年份信息 case 10: stm = 7; etm=9; quarter=2; break;//本年 case 7: stm = 4; etm=6; quarter=1; break;//本年 case 4: stm = 1; etm=3; quarter=0; break;//本年}最终得到 year---年份     quarter--季度    

Arduino PWM

旧街凉风 提交于 2019-12-04 08:47:54
因之前使用过飞思卡尔及瑞萨16位单片机,在PWM模块上使用很顺手,也没有产生任何疑惑,反倒是Arduino输出的PWM固定频率让人很是恼火。试想你的电机在490hz的PWM控制下捏着鼻子嗡嗡叫,这是一件多么叫人忧伤的事呀。 Arduino很好,但PWM很鸡肋。当我想要查datasheet来对底层操作时,无意发现了PWM frequency 库,感觉很好用,很省时间。那么,就翻出来造福大家喽。这是我第一个认真写并写完整的技术文档翻译,欢迎交流指正。 By Ray 翻译自 http://arduino.cc/forum/index.php?topic=117425.0 PWM frequency library 在目前与Arduino微控制器相关的项目中,我发现没有一种方法能不直接操作底层寄存器,而改变PWM频率的。就目前我所google到的,没有一种通用的库能改变arduino微控制器的PWM频率。网上有各种关于改变PWM频率的代码段,但是最终我还是决定参考400多页的ARV-Mega系列单片机的datasheet来实现这些功能。 据我推测,Arduino的编程人员没有发行任何关于改变PWM频率的方法是因为很难编写一个简单的,直观的硬件定时器封装程序,而不至使初学者困惑。硬件本身就有一些特殊的局限性,它们以一些奇怪的方式表现出来。 请允许我与大家分享一些:

定时器中断

南楼画角 提交于 2019-12-04 06:34:41
1.定时器介绍 STM32F1的定时器非常多,由2个基本定时器(TIM6、TIM7)、4个通 用定时器(TIM2-TIM5)和2个高级定时器(TIM1、TIM8)组成。基本定 时器的功能最为简单,类似于51单片机内定时器。通用定时器是在基本 定时器的基础上扩展而来,增加了输入捕获与输出比较等功能。高级定 时器又是在通用定时器基础上扩展而来,增加了可编程死区互补输出、 重复计数器、带刹车(断路)功能,这些功能主要针对工业电机控制方面 1.1 通用定时器简介 STM32F1的通用定时器包含一个 16 位自动重载计数器(CNT),该计数器由可编程预分频器(PSC)驱动。STM32F1的通用定时器可用于多种 用途,包括测量输入信号的脉冲宽度(输入捕获)或者生成输出波形(输出 比较和PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉 冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32F1 的每个 通用定时器都是完全独立的,没有互相共享的任何资源。 STM32F1的通用定时器TIMx (TIM2-TIM5 )具有如下功能: (1)16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。 (2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535之间的任意数值。 (3)4个独立通道(TIMx_CH1-4)

JavaScript线程机制与事件机制

房东的猫 提交于 2019-12-04 03:55:58
一、进程与线程 1.进程 进程是指程序的一次执行,它占有一片独有的内存空间,可以通过windows任务管理器查看进程 (如下图)。同一个时间里,同一个计算机系统中允许两个或两个以上的进程处于并行状态,这是多进程。比如电脑同时运行微信,QQ,以及各种浏览器等。 浏览器运行是有些是单进程,如firefox和老版IE,有些是多进程,如chrome和新版IE 。 2.线程 有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)。 线程是指CPU的基本调度单位,是程序执行的一个完整流程,是进程内的一个独立执行单元 。多线程是指在一个进程内, 同时有多个线程运行。 浏览器运行是多线程 。比如用浏览器一边下载,一边听歌,一边看视频。另外我们需要知道 JavaScript语言的一大特点就是单线程 ,为了利用多核CPU的计算能力, HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质 。 由于每个进程至少要干一件事,所以,一个进程至少有一个线程。当然,像Word这种复杂的进程可以有多个线程,多个线程可以同时执行

ALSA Timer

依然范特西╮ 提交于 2019-12-04 03:34:03
0. 前言 本文主要介绍alsa-timer相关代码的分析内容。 1. 介绍 官方文档可以参见下面的链接: ALSA Timer 官网上对Timer的介绍很简单,我根据自己的使用情况总结如下: Timer被设计为使用声卡内部的定时器,但是也可以被其它定时器驱动,比如内核中的 snd_timer.ko 就是一个基于系统定时器的Timer。 Timer使用循环Buffer来存储信息。 定时器最高精度是ns级,但实际的精度依赖于时钟源。 可以使用 NONBLOCK 或 BLOCK 的模式打开定时器。 如果需要查询Timer的状态,需要使用 timer_query 的接口。 我们后面主要是基于NONBLOCK模式进行分析。 2. Timer ID Timer ID主要由以下5个字段组成: 名称 值 说明 class 区分声卡类别 SNDRV_TIMER_CLASS_GLOBAL 全局声卡,也就是snd_timer.ko提供的默认Timer,只能有一个 SNDRV_TIMER_CLASS_CARD Card提供的声卡 SNDRV_TIMER_CLASS_PCM PCM提供的声卡 sclass 区分声卡子类 SNDRV_TIMER_SCLASS_APPLICATION 表明是应用程序使用 card 声卡ID - - device 区分时钟源 SNDRV_TIMER_GLOBAL_SYSTEM

浅谈单片机应用程序架构

落爺英雄遲暮 提交于 2019-12-04 01:29:52
对于单片机程序来说,大家都不陌生,但是真正使用架构,考虑架构的恐怕并不多,随着程序开发的不断增多,本人觉得架构是非常必要的。前不就发帖与大家一起讨论了一下《 谈谈怎样架构你的单片机程序 》,发现真正使用架构的并不都,而且这类书籍基本没有。 本人经过摸索实验,并总结,大致应用程序的架构有三种: 1. 简单的前后台顺序执行程序,这类写法是大多数人使用的方法,不需用思考程序的具体架构,直接通过执行顺序编写应用程序即可。 2. 时间片轮询法,此方法是介于顺序执行与操作系统之间的一种方法。 3. 操作系统,此法应该是应用程序编写的最高境界。 1. 顺序执行法: 这种方法,这应用程序比较简单,实时性,并行性要求不太高的情况下是不错的方法,程序设计简单,思路比较清晰。但是当应用程序比较复杂的时候,如果没有一个完整的流程图,恐怕别人很难看懂程序的运行状态,而且随着程序功能的增加,编写应用程序的工程师的大脑也开始混乱。即不利于升级维护,也不利于代码优化。本人写个几个比较复杂一点的应用程序,刚开始就是使用此法,最终虽然能够实现功能,但是自己的思维一直处于混乱状态。导致程序一直不能让自己满意。 这种方法大多数人都会采用,而且我们接受的教育也基本都是使用此法。对于我们这些基本没有学习过数据结构,程序架构的单片机工程师来说,无疑很难在应用程序的设计上有一个很大的提高

简单封装移动端长按事件

好久不见. 提交于 2019-12-03 20:32:56
var timeOutEvent=0;//定时器 //开始按 function gtouchstart(){ timeOutEvent = setTimeout("longPress()",500);//这里设置定时器,定义长按500毫秒触发长按事件 return false; }; //如果在500毫秒内就释放,则取消长按事件,此时可以执行onclick应该执行的事件 function gtouchend(){ clearTimeout(timeOutEvent);//清除定时器 return false; }; //滑动事件 function gtouchmove(){ clearTimeout(timeOutEvent);//清除定时器 timeOutEvent = 0; }; function longPress(){ timeOutEvent = 0; alert('触发了长按事件') } <div ontouchstart="gtouchstart()" ontouchmove="gtouchmove()" ontouchend="gtouchend()">长按我</div> 来源: CSDN 作者: AloneAsFoam 链接: https://blog.csdn.net/AloneAsFoam/article/details/80523804

定时器实现与分析

北慕城南 提交于 2019-12-03 17:35:24
定时器实现与分析 描述 服务器中,定时器是一个很重要的组件。最近在看自己项目中的定时器实现,参考了一些资料,也思考了一下几个可以优化的方向。为了简化下面对比的几个实现,首先抽象出定时器应该有的几个操作: 注册定时器 void schedule(const IEventPtr& handler, const DateTime beginDt, const Interval& interval); 停止定时器 void cancel(const IEventPtr& handler); 触发定时器 void expireTimer(); 其中注册的定时器分两种,一种只执行一次,注册时interval为0;另一种为可重复执行的定时器,interval为第一次启动后的执行间隔。 最原始直观的做法——链表实现 链表实现的定时器是最简单直观的做法,每一个定时器作为一个链表的节点,添加的时候就直接插入到链表末端,时间复杂度O(1),然而停止定时器的时候就需要遍历链表,最坏情况需要遍历整个链表,时间复杂度为O(n),而触发定时器同样需要用当前时间与所有定时器作比较,触发比当前时间小的定时器,时间复杂度也为O(n)。 以下为简化后的几个基础操作: 定时器节点: class TimeNode { public: TimeNode(const IEventPtr& handler, const

Timer定时器

断了今生、忘了曾经 提交于 2019-12-03 17:00:20
Timer 定时器+ mybatis 建立3个类:TimerManager 类(定时器的启动和定时执行); XXXTimerTask 类(定时任务类,即定时执行的服务); XXXTimeTaskListener类(定时器的监听器)。 1.TimerManager类 该类主要负责定时器的启动和执行。其中,PERIOD_DAY属性为定时任务的执行时间间隔(毫秒数)。我这里定的是2个小时。具体的方法中,先定义定时器第一次执行任务的时间,即下图中的date,然后new一个Timer(定时器)和TimerTask(定时任务),最后利用定时器的schedule方法,将定时任务、第一次执行时间和任务执行时间间隔传入定时器中。 其中要注意的一点,当项目启动时,启动时间若早于当日定时器第一次执行时间(下图中的date),定时任务不会立刻执行。 1 2 3 import java.util.Calendar; 4 import java.util.Date; 5 import java.util.Timer; 6 7 /* 8 * Service :需要定时器重复执行的服务 9 */ 10 public class TimerManager { 11 //时间间隔 12 private static final long PERIOD_DAY = 2 * 60 * 60 * 1000; 13 14