summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoraozima <[email protected]>2020-10-09 15:17:27 +0800
committeraozima <[email protected]>2020-10-09 15:17:27 +0800
commit05777266b9dffe30df0bef15b35b710f6de21710 (patch)
tree6453a68327fd2d7ffb3dcbf788bd5f6d8b209528 /src
parent79fd12842beeee5a653ba6f4bc2f08b21be7697a (diff)
parentaeff91b2a7fc846cf3724c01c28fbd7327bd2bac (diff)
Merge remote-tracking branch 'remotes/gitee/master' into gitee_master
Diffstat (limited to 'src')
-rw-r--r--src/clock.c3
-rw-r--r--src/scheduler.c8
-rw-r--r--src/thread.c20
-rw-r--r--src/timer.c17
4 files changed, 28 insertions, 20 deletions
diff --git a/src/clock.c b/src/clock.c
index 97a09ddeaf..a91cd829b6 100644
--- a/src/clock.c
+++ b/src/clock.c
@@ -91,8 +91,7 @@ void rt_tick_increase(void)
thread->stat |= RT_THREAD_STAT_YIELD;
- /* yield */
- rt_thread_yield();
+ rt_schedule();
}
/* check timer */
diff --git a/src/scheduler.c b/src/scheduler.c
index 0c1bf1e506..2250c4a006 100644
--- a/src/scheduler.c
+++ b/src/scheduler.c
@@ -346,9 +346,9 @@ void rt_schedule(void)
}
else
{
- current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK;
rt_schedule_insert_thread(current_thread);
}
+ current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK;
}
to_thread->oncpu = cpu_id;
if (to_thread != current_thread)
@@ -444,9 +444,9 @@ void rt_schedule(void)
}
else
{
- rt_current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK;
need_insert_from_thread = 1;
}
+ rt_current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK;
}
if (to_thread != rt_current_thread)
@@ -595,9 +595,9 @@ void rt_scheduler_do_irq_switch(void *context)
}
else
{
- current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK;
rt_schedule_insert_thread(current_thread);
}
+ current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK;
}
to_thread->oncpu = cpu_id;
if (to_thread != current_thread)
@@ -784,7 +784,7 @@ void rt_schedule_remove_thread(struct rt_thread *thread)
{
#if RT_THREAD_PRIORITY_MAX > 32
pcpu->ready_table[thread->number] &= ~thread->high_mask;
- if (rt_thread_ready_table[thread->number] == 0)
+ if (pcpu->ready_table[thread->number] == 0)
{
pcpu->priority_group &= ~thread->number_mask;
}
diff --git a/src/thread.c b/src/thread.c
index 715596b132..7a90e57f25 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -478,7 +478,15 @@ RTM_EXPORT(rt_thread_delete);
*/
rt_err_t rt_thread_yield(void)
{
+ struct rt_thread *thread;
+ rt_base_t lock;
+
+ thread = rt_thread_self();
+ lock = rt_hw_interrupt_disable();
+ thread->remaining_tick = thread->init_tick;
+ thread->stat |= RT_THREAD_STAT_YIELD;
rt_schedule();
+ rt_hw_interrupt_enable(lock);
return RT_EOK;
}
@@ -679,9 +687,17 @@ rt_err_t rt_thread_control(rt_thread_t thread, int cmd, void *arg)
case RT_THREAD_CTRL_STARTUP:
return rt_thread_startup(thread);
-#ifdef RT_USING_HEAP
case RT_THREAD_CTRL_CLOSE:
- return rt_thread_delete(thread);
+
+ if (rt_object_is_systemobject((rt_object_t)thread) == RT_TRUE)
+ {
+ return rt_thread_detach(thread);
+ }
+#ifdef RT_USING_HEAP
+ else
+ {
+ return rt_thread_delete(thread);
+ }
#endif
#ifdef RT_USING_SMP
diff --git a/src/timer.c b/src/timer.c
index 4d12c7ec78..52707f2306 100644
--- a/src/timer.c
+++ b/src/timer.c
@@ -595,20 +595,19 @@ rt_tick_t rt_timer_next_timeout_tick(void)
void rt_soft_timer_check(void)
{
rt_tick_t current_tick;
- rt_list_t *n;
struct rt_timer *t;
RT_DEBUG_LOG(RT_DEBUG_TIMER, ("software timer check enter\n"));
- current_tick = rt_tick_get();
-
/* lock scheduler */
rt_enter_critical();
- for (n = rt_soft_timer_list[RT_TIMER_SKIP_LIST_LEVEL - 1].next;
- n != &(rt_soft_timer_list[RT_TIMER_SKIP_LIST_LEVEL - 1]);)
+ while (!rt_list_isempty(&rt_soft_timer_list[RT_TIMER_SKIP_LIST_LEVEL - 1]))
{
- t = rt_list_entry(n, struct rt_timer, row[RT_TIMER_SKIP_LIST_LEVEL - 1]);
+ t = rt_list_entry(rt_soft_timer_list[RT_TIMER_SKIP_LIST_LEVEL - 1].next,
+ struct rt_timer, row[RT_TIMER_SKIP_LIST_LEVEL - 1]);
+
+ current_tick = rt_tick_get();
/*
* It supposes that the new tick shall less than the half duration of
@@ -618,9 +617,6 @@ void rt_soft_timer_check(void)
{
RT_OBJECT_HOOK_CALL(rt_timer_enter_hook, (t));
- /* move node to the next */
- n = n->next;
-
/* remove timer from timer list firstly */
_rt_timer_remove(t);
@@ -629,9 +625,6 @@ void rt_soft_timer_check(void)
/* call timeout function */
t->timeout_func(t->parameter);
- /* re-get tick */
- current_tick = rt_tick_get();
-
RT_OBJECT_HOOK_CALL(rt_timer_exit_hook, (t));
RT_DEBUG_LOG(RT_DEBUG_TIMER, ("current tick: %d\n", current_tick));