同学毕设做信号辨识,需要严格设计时钟信号,对于信号的精确产生有很高的需求,因此使用matlab的timer对象来实现该需求,本着学一个技术就要学精的原则,深入了解了matlab timer背后的实现原理,现将学习成果分享给大家。
任务描述如下:
1多次执行回调函数:
显示这个事件和在计时器开始运作,运行,和结束时的日期/时间产出。计时器回调函数会以2秒的间隔执行三次。回调函数传递的前两条语句是定时器对象和事件结构的句柄。
事件结构有两个成员:类型定义了回调函数的来源,数据则是一个包含事件什么时候发生的日期时间的向量。
t = timer;
t.StartFcn = @(~,thisEvent)disp([thisEvent.Type ' executed '...
datestr(thisEvent.Data.time,'dd-mmm-yyyy HH:MM:SS.FFF')]);
t.TimerFcn = @(~,thisEvent)disp([thisEvent.Type ' executed '...
datestr(thisEvent.Data.time,'dd-mmm-yyyy HH:MM:SS.FFF')]);
t.StopFcn = @(~,thisEvent)disp([thisEvent.Type ' executed '...
datestr(thisEvent.Data.time,'dd-mmm-yyyy HH:MM:SS.FFF')]);
t.Period = 2;
t.TasksToExecute = 3;
t.ExecutionMode = 'fixedRate';
start(t)
输出如下:
StartFcn executed 25-May-2018 20:12:16.344
TimerFcn executed 25-May-2018 20:12:19.345
TimerFcn executed 25-May-2018 20:12:21.345
TimerFcn executed 25-May-2018 20:12:23.345
StopFcn executed 25-May-2018 20:12:23.351
同样记得删除这个定时器:
delete(t)
2定义一个通用的回调函数
创建一个定时器对象来提示你在接下来的8小时中每10分钟学习30秒。
在一个名为createErgoTimer.m的文件里面创建一个返回定时器的函数。
在这个文件里包含着三个局部函数来处理定时器开始,执行和结束任务。
代码如下:
function t = createErgoTimer()
secondsBreak = 30;
secondsBreakInterval = 600;
secondsPerHour = 60^2;
secondsWorkTime = 8*secondsPerHour;
t = timer;
t.UserData = secondsBreak;
t.StartFcn = @ergoTimerStart;
t.TimerFcn = @takeBreak;
t.StopFcn = @ergoTimerCleanup;
t.Period = secondsBreakInterval+secondsBreak;
t.StartDelay = t.Period-secondsBreak;
t.TasksToExecute = ceil(secondsWorkTime/t.Period);
t.ExecutionMode = 'fixedSpacing';
使用起始延迟函数允许定时器在没有指引你立即休息的情况下启动计时器。
将执行模式设置为固定空间,因此在一个时间函数执行完后将是一个固定的耗散周期10分钟30秒。这会允许你在下个10分钟的间隔之间有30秒的休息时间。
在之间新建的createErgo.m文件中,增加一个本地函数来处理对应与定时器开始的任务。作为默认,定时器对象将它自己和事件数据传递给回调函数。这个函数忽略事件数据
function ergoTimerStart(mTimer,~)
secondsPerMinute = 60;
secondsPerHour = 60*secondsPerMinute;
str1 = 'Starting Ergonomic Break Timer. ';
str2 = sprintf('For the next %d hours you will be notified',...
round(mTimer.TasksToExecute*(mTimer.Period + ...
mTimer.UserData)/secondsPerHour));
str3 = sprintf(' to take a %d second break every %d minutes.',...
mTimer.UserData, (mTimer.Period - ...
mTimer.UserData)/secondsPerMinute);
disp([str1 str2 str3])
增加一个局部函数来处理和执行和任务相关的定时器。定义的定时任务回调函数应该告诉你应该休息30秒。
function takeBreak(mTimer,~)
disp('Take a 30 second break.')
增加一个局部函数来处理和计时器停止相关的任务。
function ergoTimerCleanup(mTimer,~)
disp('Stopping Ergonomic Break Timer.')
delete(mTimer)
从内存中删除计时器任务。
在命令行输入createErgoTimer函数来创建和开始一个定时器。
t = createErgoTimer;
start(t)
Starting Ergonomic Break Timer.
For the next 8 hours you will be notified to take a 30 second break every 10 minutes.
Take a 30 second break.
周期休息定时器。
开始周期休息定时器。在接下来的八个小时中每10分钟你会被提醒一次休息30秒。
你可以让这个定时器运行八小时也可以手动停止它。包括在内存里面消除这个定时器。
stop(t)
停止周期间隔定时器。
mathwork官方文档
http://blog.sina.com.cn/s/blog_9183ba080101olx3.html
鉴于Matlab 中缺乏多线程机制,使用Timer 无疑是一个很重要的工具,Matlab 中Timer 是一个Java 对象。
(1) Timer 的定义
t=timer();
设置属性:
eg. set(t,‘Name’,‘your_timer_name’);
当然可以一次性设置完成:
TaskTimer=timer(…
‘Name’,‘FebirdTimer’,…
‘TimerFcn’,@
今天突然想实现个多线程功能,尼玛,被折磨透了。最终才找到了Timer对象和 Dynamic关于Timer的教程。感谢dynamic 大神的无私奉献。但由于原文应用实例写的比较特殊,因此单独写出一部分总结和一个实例做为自己的贡献吧。
看了上述资料相信大家对Timer对象的各个属性和其字段有一定了解,更多的信息可在帮助文件中获得。
这里再总结一下,仔细看Timer对象的句柄我们可以发现,Timer其实由两部分构成:
(一)对象本身的一些属性,如ExecutionMode等
(二)回调函数(Call Back F
定时器适用于对数据的实时处理,定时器对象由timer创建,创建的方式如下:
t = timer('PropertyName1', PropertyValue1, 'PropertyName2', PropertyValue2,...);
获取timer的属性如下:
>> get(timer)
前言前面讲了利用定时器3的查询方式来实现LED1的闪烁,那么我们怎么用中断方式控制呢?今天,我们主要来讨论这个话题。那么我们想想,应该怎么让定时器3产生中断呢?
无非也就这几步骤:分频、打开溢出中断、装数、使能定时器3中断,使能总中断、启动计数。
那么分频需要用到哪个寄存器呢?
前章博客也讲过了,需要用到定时器3的控制寄存器T3CTL T3CTL|=0XE0; //
硬件的资源总是紧张的,用这些有限的资源去做更多的事情,这大概就是每个硬件工程师一直在计较的事情了吧。定时器应该是很常用的一个功能了,很多地方都需要。然而硬定时器就那么几个。所以面对一些对时间精度要求没那么高的地方,软定时器就很有用了。
所谓软定时器,不过借助硬定时器产生一个累积计数值。然后以此为基准生出若干个不太准确的软定时器。为什么不准确呢 因为他可能被其他中断服务打断,因此存在一定...
T = timer[创建一个默认状态的定时器对象]
T = timer('PropertyName1', PropertyValue1, 'PropertyName2', P ropertyValue2,...)[创建一个拥有给定参数的定时器对象]
t = timer('TimerFcn',@mycallback, 'Period', 10.0);