Skip to content

Commit 09e98f1

Browse files
committed
修复OSTmrRemainGet()函数返回结果单位不一致的问题
1 parent d089471 commit 09e98f1

File tree

3 files changed

+18
-6
lines changed

3 files changed

+18
-6
lines changed

changelog.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,12 @@
366366
- 完善`.FlagsRdy`成员变量
367367
- 完善`p_grp->Flags`成员变量
368368

369+
### 2020-12-16
370+
371+
- 修复`OSTmrRemainGet()`函数返回结果单位不一致的问题
372+
- 修复`OS_TMR`结构体`.Remain`成员变量数值单位不一致的问题
373+
- 修复从RT-Thread到uCOS-III定时器换算公式没有考虑到Systick变化的问题
374+
369375

370376

371377

@@ -638,6 +644,12 @@
638644
639645
完善`p_grp->Flags`成员变量
640646
647+
**[fix]** 修复`OSTmrRemainGet()`函数返回结果单位不一致的问题
648+
649+
**[fix]** 修复`OS_TMR`结构体`.Remain`成员变量数值单位不一致的问题
650+
651+
**[fix]** 修复从RT-Thread到uCOS-III定时器换算公式没有考虑到Systick变化的问题
652+
641653
642654
643655
# TODO

readme.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ Keil工程路径:[rt-thread-3.1.3/bsp/stm32f103/Project.uvprojx](rt-thread-3.1
117117
```
118118
在原版μCOS-III中,该宏定义定义了软件定时器的时基信号,这与RT-Thread的软件定时器有本质的不同,在RT-Thread中,软件定时器的时基信号就等于OS Ticks。因此为了能够将μCOS-III软件定时器时间参数转为RT-Thread软件定时器的时间参数,需要用到该宏定义。请使该宏定义与原工程使用μCOS-III时的该宏定义参数一致。
119119
120-
需要注意的是,虽然在兼容层中定义了软件定时器的时基频率,但是在兼容层内部使用的RT-Thread软件定时器的时基频率等同于OS Ticks,因此`OS_TMR`结构体的`.Match`和`.Remain`成员变量其保存的数值是以OS Ticks频率来计算的。
120+
需要注意的是,虽然在兼容层中定义了软件定时器的时基频率,但是在兼容层内部使用的RT-Thread软件定时器的时基频率等同于OS Ticks,因此`OS_TMR`结构体的`.Match`成员变量其保存的数值是以OS Ticks频率来计算的。
121121
122122
123123

uCOS-III/os_tmr.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -210,12 +210,12 @@ void OSTmrCreate (OS_TMR *p_tmr,
210210
if(opt == OS_OPT_TMR_ONE_SHOT)
211211
{
212212
rt_flag = RT_TIMER_FLAG_ONE_SHOT|RT_TIMER_FLAG_SOFT_TIMER;
213-
time = dly * (1000 / OS_CFG_TMR_TASK_RATE_HZ); /* RTT和uCOS-III在定时器时钟源的设计不同,需要进行转换*/
213+
time = dly * (OS_CFG_TICK_RATE_HZ / OS_CFG_TMR_TASK_RATE_HZ); /* RTT和uCOS-III在定时器时钟源的设计不同,需要进行转换*/
214214
}
215215
else if(opt == OS_OPT_TMR_PERIODIC)
216216
{
217217
rt_flag = RT_TIMER_FLAG_PERIODIC|RT_TIMER_FLAG_SOFT_TIMER;
218-
time = period * (1000 / OS_CFG_TMR_TASK_RATE_HZ);
218+
time = period * (OS_CFG_TICK_RATE_HZ / OS_CFG_TMR_TASK_RATE_HZ);
219219
}
220220
else
221221
{
@@ -248,7 +248,7 @@ void OSTmrCreate (OS_TMR *p_tmr,
248248
if(p_tmr->Opt==OS_OPT_TMR_PERIODIC && p_tmr->_dly && p_tmr->Period)
249249
{
250250
/*带有延迟的周期延时,先延时一次延迟部分,该部分延时完毕后,周期部分由回调函数重新装填*/
251-
time2 = p_tmr->Dly * (1000 / OS_CFG_TMR_TASK_RATE_HZ);
251+
time2 = p_tmr->Dly * (OS_CFG_TICK_RATE_HZ / OS_CFG_TMR_TASK_RATE_HZ);
252252
rt_timer_init(&p_tmr->Tmr,
253253
(const char*)p_name,
254254
OS_TmrCallback,
@@ -467,7 +467,7 @@ OS_TICK OSTmrRemainGet (OS_TMR *p_tmr,
467467
switch (p_tmr->State) {
468468
case OS_TMR_STATE_RUNNING:
469469
*p_err = OS_ERR_NONE;
470-
remain = p_tmr->Tmr.timeout_tick - rt_tick_get();
470+
remain = (p_tmr->Tmr.timeout_tick - rt_tick_get()) / (OS_CFG_TICK_RATE_HZ / OS_CFG_TMR_TASK_RATE_HZ);
471471
#ifndef PKG_USING_UCOSIII_WRAPPER_TINY
472472
CPU_CRITICAL_ENTER();
473473
p_tmr->Remain = remain;
@@ -1153,7 +1153,7 @@ static void OS_TmrCallback(void *p_ara)
11531153
/*带有延迟的周期延时,延迟延时已经完毕,开始进行正常周期延时*/
11541154
CPU_CRITICAL_ENTER();
11551155
p_tmr->_dly = 0; /* 延迟部分清零,防止再进入本条件分支语句 */
1156-
p_tmr->Tmr.init_tick = p_tmr->Period * (1000 / OS_CFG_TMR_TASK_RATE_HZ);
1156+
p_tmr->Tmr.init_tick = p_tmr->Period * (OS_CFG_TICK_RATE_HZ / OS_CFG_TMR_TASK_RATE_HZ);
11571157
p_tmr->Tmr.timeout_tick = rt_tick_get() + p_tmr->Tmr.init_tick;
11581158
p_tmr->Tmr.parent.flag |= RT_TIMER_FLAG_PERIODIC; /* 定时器设置为周期模式 */
11591159
#ifndef PKG_USING_UCOSIII_WRAPPER_TINY

0 commit comments

Comments
 (0)