@@ -1114,6 +1114,12 @@ void OS_TmrCallback(void *p_ara)
1114
1114
{
1115
1115
OS_TMR * p_tmr ;
1116
1116
OS_ERR err ;
1117
+ char * nameptr ;
1118
+ OS_TMR_CALLBACK_PTR callback ;
1119
+ void * arg ;
1120
+ OS_OPT opt ;
1121
+ OS_TICK dly ;
1122
+ OS_TICK period ;
1117
1123
1118
1124
CPU_SR_ALLOC ();
1119
1125
@@ -1135,31 +1141,62 @@ void OS_TmrCallback(void *p_ara)
1135
1141
p_tmr -> Tmr .init_tick = p_tmr -> Period * (1000 / OS_CFG_TMR_TASK_RATE_HZ );
1136
1142
p_tmr -> Tmr .timeout_tick = rt_tick_get () + p_tmr -> Tmr .init_tick ;
1137
1143
p_tmr -> Tmr .parent .flag |= RT_TIMER_FLAG_PERIODIC ;/*定时器设置为周期模式*/
1138
- p_tmr -> Remain = p_tmr -> Period ;
1139
1144
CPU_CRITICAL_EXIT ();
1140
1145
rt_timer_start (& (p_tmr -> Tmr ));/*开启定时器*/
1141
1146
}
1142
- else if (p_tmr -> Opt == OS_OPT_TMR_PERIODIC )
1147
+
1148
+ if (p_tmr -> Opt == OS_OPT_TMR_ONE_SHOT )
1143
1149
{
1144
- /*若不是带有延迟的周期模式模式,而仅仅是周期模式*/
1145
1150
CPU_CRITICAL_ENTER ();
1146
- p_tmr -> Remain = p_tmr -> Period ;
1151
+ p_tmr -> State = OS_TMR_STATE_COMPLETED ;
1152
+ p_tmr -> Remain = 0 ;
1147
1153
CPU_CRITICAL_EXIT ();
1148
1154
}
1149
-
1150
- CPU_CRITICAL_ENTER ();
1151
- if (p_tmr -> Opt == OS_OPT_TMR_ONE_SHOT )
1155
+ else if (p_tmr -> Opt == OS_OPT_TMR_PERIODIC )
1152
1156
{
1153
- p_tmr -> State = OS_TMR_STATE_COMPLETED ;
1157
+ CPU_CRITICAL_ENTER ();
1158
+ /*重新设定下一次定时器的参数*/
1159
+ p_tmr -> Match = rt_tick_get () + p_tmr -> Tmr .init_tick ;
1160
+ p_tmr -> Remain = p_tmr -> Period ;
1161
+ CPU_CRITICAL_EXIT ();
1154
1162
}
1155
- /*重新设定下一次定时器的.Match变量*/
1156
- p_tmr -> Match = rt_tick_get () + p_tmr -> Tmr .init_tick ;
1157
- CPU_CRITICAL_EXIT ();
1158
-
1163
+
1159
1164
/*调用真正uCOS-III的软件定时器回调函数*/
1160
1165
OSSchedLock (& err );
1161
1166
p_tmr -> CallbackPtr ((void * )p_tmr , p_tmr -> CallbackPtrArg );
1162
- OSSchedUnlock (& err );
1167
+ OSSchedUnlock (& err );
1168
+
1169
+ /*-----处理OSTmrSet函数------*/
1170
+ if (p_tmr -> _set_dly || p_tmr -> _set_period ) /* 检查是否调用OSTmrSet函数 */
1171
+ {
1172
+ OSTmrStop (p_tmr ,OS_OPT_TMR_NONE ,0 ,& err ); /* 删除当前定时器 */
1173
+ /*将老定时器的参数保存*/
1174
+ nameptr = p_tmr -> NamePtr ;
1175
+ callback = p_tmr -> CallbackPtr ;
1176
+ arg = p_tmr -> CallbackPtrArg ;
1177
+ opt = p_tmr -> Opt ;
1178
+ dly = p_tmr -> _set_dly ;
1179
+ period = p_tmr -> _set_period ;
1180
+ OSTmrDel (p_tmr ,& err );
1181
+ if (err != OS_ERR_NONE )
1182
+ {
1183
+ return ;
1184
+ }
1185
+
1186
+ if (dly && period )
1187
+ {
1188
+ OSTmrCreate (p_tmr , nameptr , dly , period , opt , callback , arg , & err );
1189
+ }
1190
+ else if (dly )
1191
+ {
1192
+ OSTmrCreate (p_tmr , nameptr , dly , period , opt , callback , arg , & err );
1193
+ }
1194
+ else if (period )
1195
+ {
1196
+ OSTmrCreate (p_tmr , nameptr , dly , period , opt , callback , arg , & err );
1197
+ }
1198
+ OSTmrStart (p_tmr , & err ); /* 启动装填新参数的定时器 */
1199
+ }
1163
1200
}
1164
1201
1165
1202
#endif
0 commit comments