Matlab練習:timer(定時器3)
前言
同學畢設做訊號辨識,需要嚴格設計時鐘訊號,對於訊號的精確產生有很高的需求,因此使用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';
end
使用起始延遲函式允許定時器在沒有指引你立即休息的情況下啟動計時器。
將執行模式設定為固定空間,因此在一個時間函式執行完後將是一個固定的耗散週期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])
end
增加一個區域性函式來處理和執行和任務相關的定時器。定義的定時任務回撥函式應該告訴你應該休息30秒。
function takeBreak(mTimer,~)
disp('Take a 30 second break.')
end
增加一個區域性函式來處理和計時器停止相關的任務。
function ergoTimerCleanup(mTimer,~)
disp('Stopping Ergonomic Break Timer.')
delete(mTimer)
end
從記憶體中刪除計時器任務。
在命令列輸入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官方文件