X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fkern%2Fproc_p.h;h=2b6855497da888086d113da6569ff19a7c61b0af;hb=1f49e719b93b94993073d3b4abf2108452f71d01;hp=3316594eb1feb2beeee634264378637526f19e64;hpb=20ee58861ef4b03b868eed377051dde27c8f23ef;p=bertos.git diff --git a/bertos/kern/proc_p.h b/bertos/kern/proc_p.h index 3316594e..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 */ @@ -41,7 +40,6 @@ #define KERN_PROC_P_H #include "cfg/cfg_proc.h" -#include "cfg/cfg_signal.h" #include "cfg/cfg_monitor.h" #include @@ -49,51 +47,18 @@ #include /* for cpu_stack_t */ #include // IRQ_ASSERT_DISABLED() -#include +#include // struct Process -#if CONFIG_KERN_PREEMPT - #include // XXX -#endif - -typedef struct Process -{ -#if CONFIG_KERN_PRI - PriNode link; /**< Link Process into scheduler lists */ -#else - Node link; /**< Link Process into scheduler lists */ -#endif - cpu_stack_t *stack; /**< Per-process SP */ - iptr_t user_data; /**< Custom data passed to the process */ - -#if CONFIG_KERN_SIGNALS - sigmask_t sig_wait; /**< Signals the process is waiting for */ - sigmask_t sig_recv; /**< Received signals */ -#endif - -#if CONFIG_KERN_HEAP - uint16_t flags; /**< Flags */ -#endif - -#if CONFIG_KERN_HEAP | CONFIG_KERN_MONITOR | (ARCH & ARCH_EMUL) - cpu_stack_t *stack_base; /**< Base of process stack */ - size_t stack_size; /**< Size of process stack */ -#endif - -#if CONFIG_KERN_PREEMPT - ucontext_t context; -#endif - -#if CONFIG_KERN_MONITOR - struct ProcMonitor - { - Node link; - const char *name; - } monitor; +#ifndef asm_switch_context +/** + * CPU dependent context switching routines. + * + * Saving and restoring the context on the stack is done by a CPU-dependent + * support routine which usually needs to be written in assembly. + */ +EXTERN_C void asm_switch_context(cpu_stack_t **new_sp, cpu_stack_t **save_sp); #endif -} Process; - - /** * \name Flags for Process.flags. * \{ @@ -103,19 +68,39 @@ typedef struct Process /** Track running processes. */ -extern REGISTER Process *CurrentProcess; +extern REGISTER Process *current_process; /** * Track ready processes. * * Access to this list must be performed with interrupts disabled */ -extern REGISTER List ProcReadyList; +extern REGISTER List proc_ready_list; #if CONFIG_KERN_PRI - #define SCHED_ENQUEUE_INTERNAL(proc) LIST_ENQUEUE(&ProcReadyList, &(proc)->link) +# 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) + #define prio_curr() prio_proc(current_process) + + #define SCHED_ENQUEUE_INTERNAL(proc) \ + LIST_ENQUEUE(&proc_ready_list, &(proc)->link) + #define SCHED_ENQUEUE_HEAD_INTERNAL(proc) \ + LIST_ENQUEUE_HEAD(&proc_ready_list, &(proc)->link) #else - #define SCHED_ENQUEUE_INTERNAL(proc) ADDTAIL(&ProcReadyList, &(proc)->link) + #define prio_next() 0 + #define prio_proc(proc) 0 + #define prio_curr() 0 + + #define SCHED_ENQUEUE_INTERNAL(proc) ADDTAIL(&proc_ready_list, &(proc)->link) + #define SCHED_ENQUEUE_HEAD_INTERNAL(proc) ADDHEAD(&proc_ready_list, &(proc)->link) #endif /** @@ -129,10 +114,17 @@ extern REGISTER List ProcReadyList; */ #define SCHED_ENQUEUE(proc) do { \ IRQ_ASSERT_DISABLED(); \ - LIST_ASSERT_VALID(&ProcReadyList); \ + LIST_ASSERT_VALID(&proc_ready_list); \ SCHED_ENQUEUE_INTERNAL(proc); \ } while (0) +#define SCHED_ENQUEUE_HEAD(proc) do { \ + IRQ_ASSERT_DISABLED(); \ + LIST_ASSERT_VALID(&proc_ready_list); \ + SCHED_ENQUEUE_HEAD_INTERNAL(proc); \ + } while (0) + + #if CONFIG_KERN_PRI /** * Changes the priority of an already enqueued process. @@ -144,13 +136,13 @@ extern REGISTER List ProcReadyList; * * \note Performance could be improved with a different implementation of priority list. */ -INLINE void SCHED_CHANGE_PRI(struct Process *proc) +INLINE void sched_reenqueue(struct Process *proc) { IRQ_ASSERT_DISABLED(); - LIST_ASSERT_VALID(&ProcReadyList); + LIST_ASSERT_VALID(&proc_ready_list); Node *n; PriNode *pos = NULL; - FOREACH_NODE(n, &ProcReadyList) + FOREACH_NODE(n, &proc_ready_list) { if (n == &proc->link.link) { @@ -164,18 +156,22 @@ INLINE void SCHED_CHANGE_PRI(struct Process *proc) if (pos) { REMOVE(&proc->link.link); - LIST_ENQUEUE(&ProcReadyList, &proc->link); + LIST_ENQUEUE(&proc_ready_list, &proc->link); } } #endif //CONFIG_KERN_PRI -/// Schedule another process *without* adding the current one to the ready list. +/* Process trampoline */ +void proc_entry(void); + +/* Schedule another process *without* adding the current one to the ready list. */ void proc_switch(void); -#if CONFIG_KERN_PREEMPT -void proc_entry(void (*user_entry)(void)); -void preempt_init(void); -#endif +/* Immediately schedule a particular process bypassing the scheduler. */ +void proc_wakeup(Process *proc); + +/* Initialize a scheduler class. */ +void proc_schedInit(void); #if CONFIG_KERN_MONITOR /** Initialize the monitor */ @@ -191,4 +187,43 @@ void preempt_init(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 */