Skip to content

Commit e994051

Browse files
committed
实现3.06版本中新增的OSTmrSet函数
1 parent 9b83a9a commit e994051

File tree

3 files changed

+55
-17
lines changed

3 files changed

+55
-17
lines changed

changelog.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@
235235
### 2020-8-23
236236

237237
- 修改`OS_TMR`结构体`.Remain``.Match`成员变量赋值的bug
238+
- 实现3.06版本中新增的`OSTmrSet`函数
238239

239240

240241

@@ -387,6 +388,8 @@
387388

388389
**[bug fix]** 修改`OS_TMR`结构体`.Remain``.Match`成员变量赋值的bug
389390

391+
**[add 3.08]** 实现3.06版本中新增的`OSTmrSet`函数
392+
390393

391394

392395
# TODO
@@ -399,5 +402,3 @@
399402
OS_OPT FlagsOpt; /* Options (See OS_OPT_FLAG_xxx) */
400403
```
401404

402-
2. 3.08版本中多出一个`OSTmrSet`函数
403-
3. 调整注释排版

uCOS-III_Wrapper/examples/timer_example.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ static void AppTask1 (void *param)
4545
(void *)0,/*参数为0*/
4646
(OS_ERR *)&err);/*返回的错误码*/
4747

48-
OSTmrStart(&CPUUsageTimer,&err);/*开启定时器*/
49-
48+
OSTmrStart(&CPUUsageTimer,&err);/*开启定时器*/
49+
5050
while(1)
5151
{
5252
OSTaskStkChk(RT_NULL,&free,&used,&err);/*获取当前任务堆栈信息*/

uCOS-III_Wrapper/uCOS-III/os_tmr.c

Lines changed: 50 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)