summaryrefslogtreecommitdiff
path: root/firmware/thread.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/thread.c')
-rw-r--r--firmware/thread.c32
1 files changed, 31 insertions, 1 deletions
diff --git a/firmware/thread.c b/firmware/thread.c
index 205375a44d..6a94a52333 100644
--- a/firmware/thread.c
+++ b/firmware/thread.c
@@ -35,6 +35,9 @@ struct core_entry cores[NUM_CORES] IBSS_ATTR;
35#ifdef HAVE_PRIORITY_SCHEDULING 35#ifdef HAVE_PRIORITY_SCHEDULING
36static unsigned short highest_priority IBSS_ATTR; 36static unsigned short highest_priority IBSS_ATTR;
37#endif 37#endif
38#ifdef HAVE_SCHEDULER_BOOSTCTRL
39static bool cpu_boosted IBSS_ATTR;
40#endif
38 41
39/* Define to enable additional checks for blocking violations etc. */ 42/* Define to enable additional checks for blocking violations etc. */
40// #define THREAD_EXTRA_CHECKS 43// #define THREAD_EXTRA_CHECKS
@@ -332,6 +335,14 @@ static inline void sleep_core(void)
332 if (cores[CURRENT_CORE].running != NULL) 335 if (cores[CURRENT_CORE].running != NULL)
333 break; 336 break;
334 337
338#ifdef HAVE_SCHEDULER_BOOSTCTRL
339 if (cpu_boosted)
340 {
341 cpu_boost(false);
342 cpu_boosted = false;
343 }
344#endif
345
335 /* Enter sleep mode to reduce power usage, woken up on interrupt */ 346 /* Enter sleep mode to reduce power usage, woken up on interrupt */
336#ifdef CPU_COLDFIRE 347#ifdef CPU_COLDFIRE
337 asm volatile ("stop #0x2000"); 348 asm volatile ("stop #0x2000");
@@ -646,6 +657,17 @@ struct thread_entry*
646 return thread; 657 return thread;
647} 658}
648 659
660#ifdef HAVE_SCHEDULER_BOOSTCTRL
661void trigger_cpu_boost(void)
662{
663 if (!cpu_boosted)
664 {
665 cpu_boost(true);
666 cpu_boosted = true;
667 }
668}
669#endif
670
649/*--------------------------------------------------------------------------- 671/*---------------------------------------------------------------------------
650 * Remove a thread on the current core from the scheduler. 672 * Remove a thread on the current core from the scheduler.
651 * Parameter is the ID as returned from create_thread(). 673 * Parameter is the ID as returned from create_thread().
@@ -676,13 +698,18 @@ void remove_thread(struct thread_entry *thread)
676} 698}
677 699
678#ifdef HAVE_PRIORITY_SCHEDULING 700#ifdef HAVE_PRIORITY_SCHEDULING
679void thread_set_priority(struct thread_entry *thread, int priority) 701int thread_set_priority(struct thread_entry *thread, int priority)
680{ 702{
703 int old_priority;
704
681 if (thread == NULL) 705 if (thread == NULL)
682 thread = cores[CURRENT_CORE].running; 706 thread = cores[CURRENT_CORE].running;
683 707
708 old_priority = thread->priority;
684 thread->priority = priority; 709 thread->priority = priority;
685 highest_priority = 100; 710 highest_priority = 100;
711
712 return old_priority;
686} 713}
687#endif 714#endif
688 715
@@ -699,6 +726,9 @@ void init_threads(void)
699 cores[core].threads[0].priority = PRIORITY_USER_INTERFACE; 726 cores[core].threads[0].priority = PRIORITY_USER_INTERFACE;
700 highest_priority = 100; 727 highest_priority = 100;
701#endif 728#endif
729#ifdef HAVE_SCHEDULER_BOOSTCTRL
730 cpu_boosted = false;
731#endif
702 add_to_list(&cores[core].running, &cores[core].threads[0]); 732 add_to_list(&cores[core].running, &cores[core].threads[0]);
703 733
704 /* In multiple core setups, each core has a different stack. There is probably 734 /* In multiple core setups, each core has a different stack. There is probably