@@ -1114,6 +1114,12 @@ void OS_TmrCallback(void *p_ara)
11141114{
11151115 OS_TMR * p_tmr ;
11161116 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 ;
11171123
11181124 CPU_SR_ALLOC ();
11191125
@@ -1135,31 +1141,62 @@ void OS_TmrCallback(void *p_ara)
11351141 p_tmr -> Tmr .init_tick = p_tmr -> Period * (1000 / OS_CFG_TMR_TASK_RATE_HZ );
11361142 p_tmr -> Tmr .timeout_tick = rt_tick_get () + p_tmr -> Tmr .init_tick ;
11371143 p_tmr -> Tmr .parent .flag |= RT_TIMER_FLAG_PERIODIC ;/*定时器设置为周期模式*/
1138- p_tmr -> Remain = p_tmr -> Period ;
11391144 CPU_CRITICAL_EXIT ();
11401145 rt_timer_start (& (p_tmr -> Tmr ));/*开启定时器*/
11411146 }
1142- else if (p_tmr -> Opt == OS_OPT_TMR_PERIODIC )
1147+
1148+ if (p_tmr -> Opt == OS_OPT_TMR_ONE_SHOT )
11431149 {
1144- /*若不是带有延迟的周期模式模式,而仅仅是周期模式*/
11451150 CPU_CRITICAL_ENTER ();
1146- p_tmr -> Remain = p_tmr -> Period ;
1151+ p_tmr -> State = OS_TMR_STATE_COMPLETED ;
1152+ p_tmr -> Remain = 0 ;
11471153 CPU_CRITICAL_EXIT ();
11481154 }
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 )
11521156 {
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 ();
11541162 }
1155- /*重新设定下一次定时器的.Match变量*/
1156- p_tmr -> Match = rt_tick_get () + p_tmr -> Tmr .init_tick ;
1157- CPU_CRITICAL_EXIT ();
1158-
1163+
11591164 /*调用真正uCOS-III的软件定时器回调函数*/
11601165 OSSchedLock (& err );
11611166 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+ }
11631200}
11641201
11651202#endif
0 commit comments