Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
天中雨水
rt-thread
提交
83b6260b
R
rt-thread
项目概览
天中雨水
/
rt-thread
该项目与 Fork 源项目分叉
Fork自
RT-Thread / rt-thread
通知
2
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rt-thread
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
83b6260b
编写于
4月 22, 2019
作者:
E
EvalZero
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[components][workqueue]improve delayed work for reinit.
上级
12a07fb6
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
23 addition
and
7 deletion
+23
-7
components/drivers/include/ipc/workqueue.h
components/drivers/include/ipc/workqueue.h
+3
-3
components/drivers/src/workqueue.c
components/drivers/src/workqueue.c
+20
-4
未找到文件。
components/drivers/include/ipc/workqueue.h
浏览文件 @
83b6260b
...
...
@@ -13,7 +13,8 @@
enum
{
RT_WORK_STATE_PENDING
,
/* Work item pending state */
RT_WORK_STATE_PENDING
=
0x0001
,
/* Work item pending state */
RT_WORK_STATE_SUBMITTING
=
0x0002
,
/* Work item submitting state */
};
/**
...
...
@@ -21,7 +22,7 @@ enum
*/
enum
{
RT_WORK_TYPE_DELAYED
,
RT_WORK_TYPE_DELAYED
=
0x0001
,
};
/* workqueue implementation */
...
...
@@ -81,4 +82,3 @@ void rt_delayed_work_init(struct rt_delayed_work *work, void (*work_func)(struct
#endif
#endif
components/drivers/src/workqueue.c
浏览文件 @
83b6260b
...
...
@@ -14,6 +14,8 @@
#ifdef RT_USING_HEAP
static
void
_delayed_work_timeout_handler
(
void
*
parameter
);
rt_inline
rt_err_t
_workqueue_work_completion
(
struct
rt_workqueue
*
queue
)
{
rt_err_t
result
;
...
...
@@ -161,7 +163,14 @@ static rt_err_t _workqueue_cancel_delayed_work(struct rt_delayed_work *work)
}
else
{
rt_timer_stop
(
&
(
work
->
timer
));
if
(
work
->
work
.
flags
&
RT_WORK_STATE_SUBMITTING
)
{
level
=
rt_hw_interrupt_disable
();
rt_timer_stop
(
&
(
work
->
timer
));
rt_timer_detach
(
&
(
work
->
timer
));
work
->
work
.
flags
&=
~
RT_WORK_STATE_SUBMITTING
;
rt_hw_interrupt_enable
(
level
);
}
}
level
=
rt_hw_interrupt_disable
();
...
...
@@ -210,8 +219,12 @@ static rt_err_t _workqueue_submit_delayed_work(struct rt_workqueue *queue,
}
else
{
level
=
rt_hw_interrupt_disable
();
/* Add timeout */
rt_timer_control
(
&
(
work
->
timer
),
RT_TIMER_CTRL_SET_TIME
,
&
ticks
);
work
->
work
.
flags
|=
RT_WORK_STATE_SUBMITTING
;
rt_timer_init
(
&
(
work
->
timer
),
"work"
,
_delayed_work_timeout_handler
,
work
,
ticks
,
RT_TIMER_FLAG_ONE_SHOT
|
RT_TIMER_FLAG_SOFT_TIMER
);
rt_hw_interrupt_enable
(
level
);
rt_timer_start
(
&
(
work
->
timer
));
}
...
...
@@ -222,9 +235,14 @@ __exit:
static
void
_delayed_work_timeout_handler
(
void
*
parameter
)
{
struct
rt_delayed_work
*
delayed_work
;
rt_base_t
level
;
delayed_work
=
(
struct
rt_delayed_work
*
)
parameter
;
level
=
rt_hw_interrupt_disable
();
rt_timer_stop
(
&
(
delayed_work
->
timer
));
rt_timer_detach
(
&
(
delayed_work
->
timer
));
delayed_work
->
work
.
flags
&=
~
RT_WORK_STATE_SUBMITTING
;
rt_hw_interrupt_enable
(
level
);
_workqueue_submit_work
(
delayed_work
->
workqueue
,
&
(
delayed_work
->
work
));
}
...
...
@@ -375,8 +393,6 @@ void rt_delayed_work_init(struct rt_delayed_work *work, void (*work_func)(struct
{
rt_work_init
(
&
(
work
->
work
),
work_func
,
work_data
);
work
->
work
.
type
=
RT_WORK_TYPE_DELAYED
;
rt_timer_init
(
&
(
work
->
timer
),
"work"
,
_delayed_work_timeout_handler
,
work
,
0
,
RT_TIMER_FLAG_ONE_SHOT
|
RT_TIMER_FLAG_SOFT_TIMER
);
}
#ifdef RT_USING_SYSTEM_WORKQUEUE
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录