我有一个程序有2个定时器函数,如下所示(p_maj_input
和p_maj_output_motion
相等,因此两个定时器的周期相同):
maj_input = timer('ExecutionMode','fixedRate','Period',p_maj_input,'TasksToExecute', ...
floor(Tmeasurement/p_maj_input)-1,'TimerFcn',{@time_append,p_maj_input,HR_all,freq_HR, ...
BVP_all,freq_BVP,TEMP_all,freq_TEMP,ACC_x_all,ACC_y_all,ACC_z_all,freq_ACC,EDA_all,freq_EDA, ...
folder_all,all_dir,num_dir}); start(maj_input);
maj_output_motion=timer('ExecutionMode','fixedRate','Period',p_maj_output_motion,'TasksToExecute', ...
floor(Tmeasurement/p_maj_output_motion)-1,'TimerFcn',{@output_motion_append, ...
freq_MOTION,freq_mvt_score,freq_walk,p_maj_output_motion,p_maj_output_walk,folder_all,all_dir,num_dir});%,'StartDelay',min(5,p_maj_output_motion)); %startDelay must be min 5 for walk detection start(maj_output_motion);
在每个定时器回调函数中,都有一个在程序开始时选定的文件夹中包含的子文件夹的循环。
output_motion_append(obj,event,freq_MOTION,freq_mvt_score,freq_walk,p_maj_output_motion,p_maj_output_walk,folder_all,all_dir,num_dir)
fprintf('motion %d\n',obj.TasksExecuted)
toc
for folder_index=1:num_dir
[folder_original,folder_fictive] = subfolderFunction(all_dir, folder_all, folder_index);
fileName=strcat(folder_fictive,'\ACC.csv');
[ACC_time, ACC_x, ACC_y, ACC_z] = loadValuesE4_acc(fileName);
% Motion Amount
[agitation,agitation_ts] = identifyAgitation(ACC_x,ACC_y,ACC_z,ACC_time);
agitation=agitation';
len1=length(agitation);
if len1<=freq_MOTION*p_maj_output_motion
i_init1=1;
elseif len1>freq_MOTION*p_maj_output_motion
i_init1=len1-freq_MOTION*p_maj_output_motion+1;
end
writematrix([agitation(i_init1:len1)],strcat(folder_fictive,'\MOTION_output.csv'),'WriteMode','Append');
writematrix([mvt_score(i_init2:len2)],strcat(folder_fictive,'\neurologicScore_output.csv'),'WriteMode','Append');
end
end
如果子文件夹的数量小于4,则一切正常:正确的值出现在执行writematrix
函数的文件中。计时器回调函数是一个接一个调用的,因此两个计时器同时工作。但是,如果有5个或更多子文件夹,则不是正确的值,使用调试时我注意到第一个回调函数触发了“TasksToExecute”的数量,然后好像只有第二个回调函数被调用了,也就是说两个定时器不是同时工作的。
我已经尝试增加p_maj_input
和p_maj_output_motion
,看看问题是否是matlab无法在调用另一个计时器回调函数之前完成运行,但对于5个子文件夹,我仍然遇到相同的问题。
有人知道我的问题出在哪里吗?
1条答案
按热度按时间jqjz2hbq1#
发生此行为的原因是,一个计时器在再次触发时尚未完成执行,因此第二个计时器在第一个计时器完成之前永远没有机会执行。如果将ExecutionMode从“fixedRate”更改为“fixedSpacing”,则可以保证第二个计时器有时间执行。