Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wwsmg1
rt-thread
提交
13044b1e
R
rt-thread
项目概览
wwsmg1
/
rt-thread
与 Fork 源项目一致
Fork自
RT-Thread / rt-thread
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rt-thread
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
13044b1e
编写于
10月 11, 2020
作者:
B
Bernard Xiong
提交者:
GitHub
10月 11, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #3940 from RT-Thread/timer_issue
[kernel] fix the timer issue
上级
11ac3ac3
1c6700ac
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
58 addition
and
27 deletion
+58
-27
src/timer.c
src/timer.c
+58
-27
未找到文件。
src/timer.c
浏览文件 @
13044b1e
...
...
@@ -25,6 +25,10 @@
static
rt_list_t
rt_timer_list
[
RT_TIMER_SKIP_LIST_LEVEL
];
#ifdef RT_USING_TIMER_SOFT
#define RT_SOFT_TIMER_IDLE 1
#define RT_SOFT_TIMER_BUSY 0
#ifndef RT_TIMER_THREAD_STACK_SIZE
#define RT_TIMER_THREAD_STACK_SIZE 512
#endif
...
...
@@ -33,6 +37,8 @@ static rt_list_t rt_timer_list[RT_TIMER_SKIP_LIST_LEVEL];
#define RT_TIMER_THREAD_PRIO 0
#endif
/* soft timer status */
static
rt_uint8_t
soft_timer_status
=
RT_SOFT_TIMER_IDLE
;
/* soft timer list */
static
rt_list_t
rt_soft_timer_list
[
RT_TIMER_SKIP_LIST_LEVEL
];
static
struct
rt_thread
timer_thread
;
...
...
@@ -221,6 +227,8 @@ rt_err_t rt_timer_detach(rt_timer_t timer)
level
=
rt_hw_interrupt_disable
();
_rt_timer_remove
(
timer
);
/* stop timer */
timer
->
parent
.
flag
&=
~
RT_TIMER_FLAG_ACTIVATED
;
/* enable interrupt */
rt_hw_interrupt_enable
(
level
);
...
...
@@ -284,6 +292,8 @@ rt_err_t rt_timer_delete(rt_timer_t timer)
level
=
rt_hw_interrupt_disable
();
_rt_timer_remove
(
timer
);
/* stop timer */
timer
->
parent
.
flag
&=
~
RT_TIMER_FLAG_ACTIVATED
;
/* enable interrupt */
rt_hw_interrupt_enable
(
level
);
...
...
@@ -408,7 +418,8 @@ rt_err_t rt_timer_start(rt_timer_t timer)
if
(
timer
->
parent
.
flag
&
RT_TIMER_FLAG_SOFT_TIMER
)
{
/* check whether timer thread is ready */
if
((
timer_thread
.
stat
&
RT_THREAD_STAT_MASK
)
==
RT_THREAD_SUSPEND
)
if
((
soft_timer_status
==
RT_SOFT_TIMER_IDLE
)
&&
((
timer_thread
.
stat
&
RT_THREAD_STAT_MASK
)
==
RT_THREAD_SUSPEND
))
{
/* resume timer thread to check soft timer */
rt_thread_resume
(
&
timer_thread
);
...
...
@@ -445,13 +456,12 @@ rt_err_t rt_timer_stop(rt_timer_t timer)
level
=
rt_hw_interrupt_disable
();
_rt_timer_remove
(
timer
);
/* change status */
timer
->
parent
.
flag
&=
~
RT_TIMER_FLAG_ACTIVATED
;
/* enable interrupt */
rt_hw_interrupt_enable
(
level
);
/* change stat */
timer
->
parent
.
flag
&=
~
RT_TIMER_FLAG_ACTIVATED
;
return
RT_EOK
;
}
RTM_EXPORT
(
rt_timer_stop
);
...
...
@@ -467,10 +477,13 @@ RTM_EXPORT(rt_timer_stop);
*/
rt_err_t
rt_timer_control
(
rt_timer_t
timer
,
int
cmd
,
void
*
arg
)
{
register
rt_base_t
level
;
/* timer check */
RT_ASSERT
(
timer
!=
RT_NULL
);
RT_ASSERT
(
rt_object_get_type
(
&
timer
->
parent
)
==
RT_Object_Class_Timer
);
level
=
rt_hw_interrupt_disable
();
switch
(
cmd
)
{
case
RT_TIMER_CTRL_GET_TIME
:
...
...
@@ -505,6 +518,7 @@ rt_err_t rt_timer_control(rt_timer_t timer, int cmd, void *arg)
default:
break
;
}
rt_hw_interrupt_enable
(
level
);
return
RT_EOK
;
}
...
...
@@ -521,6 +535,7 @@ void rt_timer_check(void)
struct
rt_timer
*
t
;
rt_tick_t
current_tick
;
register
rt_base_t
level
;
rt_list_t
list
=
RT_LIST_OBJECT_INIT
(
list
);
RT_DEBUG_LOG
(
RT_DEBUG_TIMER
,
(
"timer check enter
\n
"
));
...
...
@@ -544,7 +559,12 @@ void rt_timer_check(void)
/* remove timer from timer list firstly */
_rt_timer_remove
(
t
);
if
(
!
(
t
->
parent
.
flag
&
RT_TIMER_FLAG_PERIODIC
))
{
t
->
parent
.
flag
&=
~
RT_TIMER_FLAG_ACTIVATED
;
}
/* add timer to temporary list */
rt_list_insert_after
(
&
list
,
&
(
t
->
row
[
RT_TIMER_SKIP_LIST_LEVEL
-
1
]));
/* call timeout function */
t
->
timeout_func
(
t
->
parameter
);
...
...
@@ -554,6 +574,12 @@ void rt_timer_check(void)
RT_OBJECT_HOOK_CALL
(
rt_timer_exit_hook
,
(
t
));
RT_DEBUG_LOG
(
RT_DEBUG_TIMER
,
(
"current tick: %d
\n
"
,
current_tick
));
/* Check whether the timer object is detached or started again */
if
(
rt_list_isempty
(
&
list
))
{
continue
;
}
if
((
t
->
parent
.
flag
&
RT_TIMER_FLAG_PERIODIC
)
&&
(
t
->
parent
.
flag
&
RT_TIMER_FLAG_ACTIVATED
))
{
...
...
@@ -561,14 +587,8 @@ void rt_timer_check(void)
t
->
parent
.
flag
&=
~
RT_TIMER_FLAG_ACTIVATED
;
rt_timer_start
(
t
);
}
else
{
/* stop timer */
t
->
parent
.
flag
&=
~
RT_TIMER_FLAG_ACTIVATED
;
}
}
else
break
;
else
break
;
}
/* enable interrupt */
...
...
@@ -589,18 +609,20 @@ rt_tick_t rt_timer_next_timeout_tick(void)
#ifdef RT_USING_TIMER_SOFT
/**
* This function will check timer list, if a timeout event happens, the
* This function will check
software-
timer list, if a timeout event happens, the
* corresponding timeout function will be invoked.
*/
void
rt_soft_timer_check
(
void
)
{
rt_tick_t
current_tick
;
struct
rt_timer
*
t
;
register
rt_base_t
level
;
rt_list_t
list
=
RT_LIST_OBJECT_INIT
(
list
);
RT_DEBUG_LOG
(
RT_DEBUG_TIMER
,
(
"software timer check enter
\n
"
));
/*
lock scheduler
*/
rt_enter_critical
();
/*
disable interrupt
*/
level
=
rt_hw_interrupt_disable
();
while
(
!
rt_list_isempty
(
&
rt_soft_timer_list
[
RT_TIMER_SKIP_LIST_LEVEL
-
1
]))
{
...
...
@@ -619,17 +641,32 @@ void rt_soft_timer_check(void)
/* remove timer from timer list firstly */
_rt_timer_remove
(
t
);
if
(
!
(
t
->
parent
.
flag
&
RT_TIMER_FLAG_PERIODIC
))
{
t
->
parent
.
flag
&=
~
RT_TIMER_FLAG_ACTIVATED
;
}
/* add timer to temporary list */
rt_list_insert_after
(
&
list
,
&
(
t
->
row
[
RT_TIMER_SKIP_LIST_LEVEL
-
1
]));
soft_timer_status
=
RT_SOFT_TIMER_BUSY
;
/* enable interrupt */
rt_hw_interrupt_enable
(
level
);
/* not lock scheduler when performing timeout function */
rt_exit_critical
();
/* call timeout function */
t
->
timeout_func
(
t
->
parameter
);
RT_OBJECT_HOOK_CALL
(
rt_timer_exit_hook
,
(
t
));
RT_DEBUG_LOG
(
RT_DEBUG_TIMER
,
(
"current tick: %d
\n
"
,
current_tick
));
/* lock scheduler */
rt_enter_critical
();
/* disable interrupt */
level
=
rt_hw_interrupt_disable
();
soft_timer_status
=
RT_SOFT_TIMER_IDLE
;
/* Check whether the timer object is detached or started again */
if
(
rt_list_isempty
(
&
list
))
{
continue
;
}
if
((
t
->
parent
.
flag
&
RT_TIMER_FLAG_PERIODIC
)
&&
(
t
->
parent
.
flag
&
RT_TIMER_FLAG_ACTIVATED
))
...
...
@@ -638,17 +675,11 @@ void rt_soft_timer_check(void)
t
->
parent
.
flag
&=
~
RT_TIMER_FLAG_ACTIVATED
;
rt_timer_start
(
t
);
}
else
{
/* stop timer */
t
->
parent
.
flag
&=
~
RT_TIMER_FLAG_ACTIVATED
;
}
}
else
break
;
/* not check anymore */
}
/* unlock scheduler */
rt_exit_critical
();
/* enable interrupt */
rt_hw_interrupt_enable
(
level
);
RT_DEBUG_LOG
(
RT_DEBUG_TIMER
,
(
"software timer check leave
\n
"
));
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录