X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fkern%2Fproc_p.h;h=2b6855497da888086d113da6569ff19a7c61b0af;hb=4278d44ef7681c56f4bd16615c3c4d9338112df4;hp=56c810819b56964d2d16c83fe29075fbde8f3e5b;hpb=77958b8e9d27594aa22e76132b4bbb8d0335bfc2;p=bertos.git diff --git a/bertos/kern/proc_p.h b/bertos/kern/proc_p.h index 56c81081..2b685549 100644 --- a/bertos/kern/proc_p.h +++ b/bertos/kern/proc_p.h @@ -33,7 +33,6 @@ * * \brief Internal scheduler structures and definitions for processes. * - * \version $Id$ * \author Bernie Innocenti */ @@ -50,19 +49,6 @@ #include // struct Process -/* - * Check if the process context switch can be performed directly by the - * architecture-dependent asm_switch_context() or if it must be delayed - * because we're in the middle of an ISR. - * - * Return true if asm_switch_context() can be executed, false - * otherwise. - * - * NOTE: if an architecture does not implement IRQ_RUNNING() this function - * always returns true. - */ -#define CONTEXT_SWITCH_FROM_ISR() (!IRQ_RUNNING()) - #ifndef asm_switch_context /** * CPU dependent context switching routines. @@ -73,23 +59,6 @@ EXTERN_C void asm_switch_context(cpu_stack_t **new_sp, cpu_stack_t **save_sp); #endif -/* - * Save context of old process and switch to new process. - */ -INLINE void proc_switchTo(Process *next, Process *prev) -{ - cpu_stack_t *dummy; - - if (UNLIKELY(next == prev)) - return; - /* - * If there is no old process, we save the old stack pointer into a - * dummy variable that we ignore. In fact, this happens only when the - * old process has just exited. - */ - asm_switch_context(&next->stack, prev ? &prev->stack : &dummy); -} - /** * \name Flags for Process.flags. * \{ @@ -109,6 +78,13 @@ extern REGISTER Process *current_process; extern REGISTER List proc_ready_list; #if CONFIG_KERN_PRI +# if CONFIG_KERN_PRI_INHERIT + #define __prio_orig(proc) (proc->orig_pri) + #define __prio_inh(proc) (LIST_EMPTY(&(proc)->inh_list) ? INT_MIN : \ + ((PriNode *)LIST_HEAD(&proc->inh_list))->pri) + #define __prio_proc(proc) (__prio_inh(proc) > __prio_orig(proc) ? \ + __prio_inh(proc) : __prio_orig(proc)) +# endif #define prio_next() (LIST_EMPTY(&proc_ready_list) ? INT_MIN : \ ((PriNode *)LIST_HEAD(&proc_ready_list))->pri) #define prio_proc(proc) (proc->link.pri) @@ -191,11 +167,8 @@ void proc_entry(void); /* Schedule another process *without* adding the current one to the ready list. */ void proc_switch(void); -/* Low level scheduling routine. */ -void proc_schedule(void); - -/* Low level context switch routine. */ -void proc_switchTo(Process *next, Process *prev); +/* Immediately schedule a particular process bypassing the scheduler. */ +void proc_wakeup(Process *proc); /* Initialize a scheduler class. */ void proc_schedInit(void); @@ -214,4 +187,43 @@ void proc_schedInit(void); void monitor_rename(Process *proc, const char *name); #endif /* CONFIG_KERN_MONITOR */ +/* + * Quantum related macros are used in the + * timer module and must be empty when + * kernel is disabled. + */ +#if (CONFIG_KERN && CONFIG_KERN_PREEMPT) +INLINE int preempt_quantum(void) +{ + extern int _proc_quantum; + return _proc_quantum; +} + +INLINE void proc_decQuantum(void) +{ + extern int _proc_quantum; + if (_proc_quantum > 0) + _proc_quantum--; +} + +INLINE void preempt_reset_quantum(void) +{ + extern int _proc_quantum; + _proc_quantum = CONFIG_KERN_QUANTUM; +} +#else /* !(CONFIG_KERN && CONFIG_KERN_PREEMPT) */ +INLINE int preempt_quantum(void) +{ + return 0; +} + +INLINE void proc_decQuantum(void) +{ +} + +INLINE void preempt_reset_quantum(void) +{ +} +#endif /* (CONFIG_KERN && CONFIG_KERN_PREEMPT) */ + #endif /* KERN_PROC_P_H */