From 234af6aaa2ec2fd5c8c758a8f9fa29553ddeaf3f Mon Sep 17 00:00:00 2001 From: shaojinchun Date: Fri, 11 Oct 2019 09:13:40 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E7=9B=B8=E5=90=8C?= =?UTF-8?q?=E4=BC=98=E5=85=88=E7=BA=A7=E4=BB=BB=E5=8A=A1=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E5=A4=AA=E9=A2=91=E7=B9=81=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/rtdef.h | 1 + src/clock.c | 2 ++ src/scheduler.c | 15 +++++++++++++++ src/thread.c | 1 + 4 files changed, 19 insertions(+) diff --git a/include/rtdef.h b/include/rtdef.h index 3dc8a2a2a9..90604e9b1d 100644 --- a/include/rtdef.h +++ b/include/rtdef.h @@ -608,6 +608,7 @@ struct rt_thread rt_ubase_t init_tick; /**< thread's initialized tick */ rt_ubase_t remaining_tick; /**< remaining tick */ + rt_ubase_t can_yield; /**< indicate whether remaining_tick has been reloaded since last schedule */ struct rt_timer thread_timer; /**< built-in thread timer */ diff --git a/src/clock.c b/src/clock.c index a652282b6e..d56f4b00f3 100644 --- a/src/clock.c +++ b/src/clock.c @@ -89,6 +89,8 @@ void rt_tick_increase(void) /* change to initialized tick */ thread->remaining_tick = thread->init_tick; + thread->can_yield = 1; + /* yield */ rt_thread_yield(); } diff --git a/src/scheduler.c b/src/scheduler.c index f671a49623..a4b4800d76 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -344,8 +344,13 @@ void rt_schedule(void) { to_thread = current_thread; } + else if (current_thread->current_priority == highest_ready_priority && current_thread->can_yield == 0) + { + to_thread = current_thread; + } else { + current_thread->can_yield = 0; rt_schedule_insert_thread(current_thread); } } @@ -435,8 +440,13 @@ void rt_schedule(void) { to_thread = rt_current_thread; } + else if (current_thread->current_priority == highest_ready_priority && current_thread->can_yield == 0) + { + to_thread = current_thread; + } else { + current_thread->can_yield = 0; need_insert_from_thread = 1; } } @@ -578,8 +588,13 @@ void rt_scheduler_do_irq_switch(void *context) { to_thread = current_thread; } + else if (current_thread->current_priority == highest_ready_priority && current_thread->can_yield == 0) + { + to_thread = current_thread; + } else { + current_thread->can_yield = 0; rt_schedule_insert_thread(current_thread); } } diff --git a/src/thread.c b/src/thread.c index a88729e52c..cf42c72a1b 100644 --- a/src/thread.c +++ b/src/thread.c @@ -159,6 +159,7 @@ static rt_err_t _rt_thread_init(struct rt_thread *thread, /* tick init */ thread->init_tick = tick; thread->remaining_tick = tick; + thread->can_yield = 0; /* error and flags */ thread->error = RT_EOK; From fb4959bbbb5cc03dfe3e8fc761f160c7e1b08c16 Mon Sep 17 00:00:00 2001 From: shaojinchun Date: Sat, 12 Oct 2019 11:11:44 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=BF=AE=E6=AD=A3qemu-vexpress-a9=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0=E4=B8=8A=E7=AC=AC=E4=BA=8C=E6=A0=B8=E6=97=B6=E9=92=9F?= =?UTF-8?q?=E4=B8=8D=E5=AF=B9=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/qemu-vexpress-a9/drivers/secondary_cpu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bsp/qemu-vexpress-a9/drivers/secondary_cpu.c b/bsp/qemu-vexpress-a9/drivers/secondary_cpu.c index 9221ecee87..3b0428859f 100644 --- a/bsp/qemu-vexpress-a9/drivers/secondary_cpu.c +++ b/bsp/qemu-vexpress-a9/drivers/secondary_cpu.c @@ -44,7 +44,7 @@ void secondary_cpu_c_start(void) arm_gic_cpu_init(0, REALVIEW_GIC_CPU_BASE); arm_gic_set_cpu(0, IRQ_PBA8_TIMER0_1, 0x2); - timer_init(0, 1000); + timer_init(0, 10000); rt_hw_interrupt_install(IRQ_PBA8_TIMER0_1, rt_hw_timer2_isr, RT_NULL, "tick"); rt_hw_interrupt_umask(IRQ_PBA8_TIMER0_1); From b53bd79783bcb1f0d17b0709f4829a809d027cab Mon Sep 17 00:00:00 2001 From: shaojinchun Date: Sat, 12 Oct 2019 11:52:08 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=8D=95=E6=A0=B8?= =?UTF-8?q?=E6=97=B6=E7=9A=84=E5=90=8C=E4=BC=98=E5=85=88=E7=BA=A7=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/scheduler.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/scheduler.c b/src/scheduler.c index a4b4800d76..3adf430d70 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -440,13 +440,13 @@ void rt_schedule(void) { to_thread = rt_current_thread; } - else if (current_thread->current_priority == highest_ready_priority && current_thread->can_yield == 0) + else if (rt_current_thread->current_priority == highest_ready_priority && rt_current_thread->can_yield == 0) { - to_thread = current_thread; + to_thread = rt_current_thread; } else { - current_thread->can_yield = 0; + rt_current_thread->can_yield = 0; need_insert_from_thread = 1; } } From 9a38bba1689ff1e73500584023051cced977a5c5 Mon Sep 17 00:00:00 2001 From: shaojinchun Date: Sat, 12 Oct 2019 11:57:27 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BD=BFcan=5Fyield=E6=88=90=E5=91=98?= =?UTF-8?q?=E7=9A=84=E8=B5=8B=E5=80=BC=E6=9B=B4=E5=A5=BD=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clock.c | 2 +- src/scheduler.c | 12 ++++++------ src/thread.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/clock.c b/src/clock.c index d56f4b00f3..e288ff58a9 100644 --- a/src/clock.c +++ b/src/clock.c @@ -89,7 +89,7 @@ void rt_tick_increase(void) /* change to initialized tick */ thread->remaining_tick = thread->init_tick; - thread->can_yield = 1; + thread->can_yield = RT_TRUE; /* yield */ rt_thread_yield(); diff --git a/src/scheduler.c b/src/scheduler.c index 3adf430d70..c58ecf6209 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -344,13 +344,13 @@ void rt_schedule(void) { to_thread = current_thread; } - else if (current_thread->current_priority == highest_ready_priority && current_thread->can_yield == 0) + else if (current_thread->current_priority == highest_ready_priority && current_thread->can_yield == RT_FALSE) { to_thread = current_thread; } else { - current_thread->can_yield = 0; + current_thread->can_yield = RT_FALSE; rt_schedule_insert_thread(current_thread); } } @@ -440,13 +440,13 @@ void rt_schedule(void) { to_thread = rt_current_thread; } - else if (rt_current_thread->current_priority == highest_ready_priority && rt_current_thread->can_yield == 0) + else if (rt_current_thread->current_priority == highest_ready_priority && rt_current_thread->can_yield == RT_FALSE) { to_thread = rt_current_thread; } else { - rt_current_thread->can_yield = 0; + rt_current_thread->can_yield = RT_FALSE; need_insert_from_thread = 1; } } @@ -588,13 +588,13 @@ void rt_scheduler_do_irq_switch(void *context) { to_thread = current_thread; } - else if (current_thread->current_priority == highest_ready_priority && current_thread->can_yield == 0) + else if (current_thread->current_priority == highest_ready_priority && current_thread->can_yield == RT_FALSE) { to_thread = current_thread; } else { - current_thread->can_yield = 0; + current_thread->can_yield = RT_FALSE; rt_schedule_insert_thread(current_thread); } } diff --git a/src/thread.c b/src/thread.c index cf42c72a1b..6f6fa1029a 100644 --- a/src/thread.c +++ b/src/thread.c @@ -159,7 +159,7 @@ static rt_err_t _rt_thread_init(struct rt_thread *thread, /* tick init */ thread->init_tick = tick; thread->remaining_tick = tick; - thread->can_yield = 0; + thread->can_yield = RT_FALSE; /* error and flags */ thread->error = RT_EOK; From e03ac83ad3d22c578e367550d2ff714b53e79799 Mon Sep 17 00:00:00 2001 From: shaojinchun Date: Tue, 5 Nov 2019 08:41:38 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E5=B0=86yield=E7=8A=B6=E6=80=81=E7=BD=AE?= =?UTF-8?q?=E4=BA=8Etcb=E7=9A=84stat=E4=BD=8D=E5=9F=9F=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/rtdef.h | 6 ++++-- src/clock.c | 2 +- src/scheduler.c | 12 ++++++------ src/thread.c | 1 - 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/include/rtdef.h b/include/rtdef.h index 90604e9b1d..119e9d7893 100644 --- a/include/rtdef.h +++ b/include/rtdef.h @@ -491,7 +491,10 @@ typedef siginfo_t rt_siginfo_t; #define RT_THREAD_RUNNING 0x03 /**< Running status */ #define RT_THREAD_BLOCK RT_THREAD_SUSPEND /**< Blocked status */ #define RT_THREAD_CLOSE 0x04 /**< Closed status */ -#define RT_THREAD_STAT_MASK 0x0f +#define RT_THREAD_STAT_MASK 0x07 + +#define RT_THREAD_STAT_YIELD 0x08 /**< indicate whether remaining_tick has been reloaded since last schedule */ +#define RT_THREAD_STAT_YIELD_MASK RT_THREAD_STAT_YIELD #define RT_THREAD_STAT_SIGNAL 0x10 /**< task hold signals */ #define RT_THREAD_STAT_SIGNAL_READY (RT_THREAD_STAT_SIGNAL | RT_THREAD_READY) @@ -608,7 +611,6 @@ struct rt_thread rt_ubase_t init_tick; /**< thread's initialized tick */ rt_ubase_t remaining_tick; /**< remaining tick */ - rt_ubase_t can_yield; /**< indicate whether remaining_tick has been reloaded since last schedule */ struct rt_timer thread_timer; /**< built-in thread timer */ diff --git a/src/clock.c b/src/clock.c index e288ff58a9..9b54101363 100644 --- a/src/clock.c +++ b/src/clock.c @@ -89,7 +89,7 @@ void rt_tick_increase(void) /* change to initialized tick */ thread->remaining_tick = thread->init_tick; - thread->can_yield = RT_TRUE; + thread->stat |= RT_THREAD_STAT_YIELD; /* yield */ rt_thread_yield(); diff --git a/src/scheduler.c b/src/scheduler.c index c58ecf6209..edcf11dba5 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -344,13 +344,13 @@ void rt_schedule(void) { to_thread = current_thread; } - else if (current_thread->current_priority == highest_ready_priority && current_thread->can_yield == RT_FALSE) + else if (current_thread->current_priority == highest_ready_priority && (current_thread->stat & RT_THREAD_STAT_YIELD_MASK) == 0) { to_thread = current_thread; } else { - current_thread->can_yield = RT_FALSE; + current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK; rt_schedule_insert_thread(current_thread); } } @@ -440,13 +440,13 @@ void rt_schedule(void) { to_thread = rt_current_thread; } - else if (rt_current_thread->current_priority == highest_ready_priority && rt_current_thread->can_yield == RT_FALSE) + else if (rt_current_thread->current_priority == highest_ready_priority && (rt_current_thread->stat & RT_THREAD_STAT_YIELD_MASK) == 0) { to_thread = rt_current_thread; } else { - rt_current_thread->can_yield = RT_FALSE; + rt_current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK; need_insert_from_thread = 1; } } @@ -588,13 +588,13 @@ void rt_scheduler_do_irq_switch(void *context) { to_thread = current_thread; } - else if (current_thread->current_priority == highest_ready_priority && current_thread->can_yield == RT_FALSE) + else if (current_thread->current_priority == highest_ready_priority && (current_thread->stat & RT_THREAD_STAT_YIELD_MASK) == 0) { to_thread = current_thread; } else { - current_thread->can_yield = RT_FALSE; + current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK; rt_schedule_insert_thread(current_thread); } } diff --git a/src/thread.c b/src/thread.c index 6f6fa1029a..a88729e52c 100644 --- a/src/thread.c +++ b/src/thread.c @@ -159,7 +159,6 @@ static rt_err_t _rt_thread_init(struct rt_thread *thread, /* tick init */ thread->init_tick = tick; thread->remaining_tick = tick; - thread->can_yield = RT_FALSE; /* error and flags */ thread->error = RT_EOK;