diff options
| author | Bernard Xiong <[email protected]> | 2019-11-12 22:47:18 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2019-11-12 22:47:18 +0800 |
| commit | da7751c044491b85e2c3f9eebdaa1c4e7e5d153b (patch) | |
| tree | f4dedd76c88102b66e0bb2e684b9af4fb2c6f99b /src | |
| parent | e8a864c7c871d3c5b166fd671805bec0a386fe03 (diff) | |
| parent | e03ac83ad3d22c578e367550d2ff714b53e79799 (diff) | |
Merge pull request #3129 from jesven/fix_same_prio
修正相同优先级任务切换太频繁的问题
Diffstat (limited to 'src')
| -rw-r--r-- | src/clock.c | 2 | ||||
| -rw-r--r-- | src/scheduler.c | 15 |
2 files changed, 17 insertions, 0 deletions
diff --git a/src/clock.c b/src/clock.c index a652282b6e..9b54101363 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->stat |= RT_THREAD_STAT_YIELD; + /* yield */ rt_thread_yield(); } diff --git a/src/scheduler.c b/src/scheduler.c index f671a49623..edcf11dba5 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->stat & RT_THREAD_STAT_YIELD_MASK) == 0) + { + to_thread = current_thread; + } else { + current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK; rt_schedule_insert_thread(current_thread); } } @@ -435,8 +440,13 @@ void rt_schedule(void) { to_thread = rt_current_thread; } + 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->stat &= ~RT_THREAD_STAT_YIELD_MASK; 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->stat & RT_THREAD_STAT_YIELD_MASK) == 0) + { + to_thread = current_thread; + } else { + current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK; rt_schedule_insert_thread(current_thread); } } |
