X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fkern%2Fproc_p.h;h=5469dfcdf0408c5d63ef6e13bdbfe6dd4286dbad;hb=d6f66b0496d96877fbcaea3751d4865729ad2aaa;hp=5d106242de54a482a16f76f46b352fa626174a9f;hpb=ae8a609173e4490fd03875f96e388038053b9288;p=bertos.git diff --git a/bertos/kern/proc_p.h b/bertos/kern/proc_p.h index 5d106242..5469dfcd 100644 --- a/bertos/kern/proc_p.h +++ b/bertos/kern/proc_p.h @@ -49,8 +49,16 @@ #include // IRQ_ASSERT_DISABLED() #include // struct Process -#include // idle_proc +#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 /** * \name Flags for Process.flags. @@ -71,9 +79,10 @@ extern REGISTER Process *current_process; extern REGISTER List proc_ready_list; #if CONFIG_KERN_PRI - #define prio_next() (LIST_EMPTY(&proc_ready_list) ? idle_proc->link.pri : \ + #define prio_next() (LIST_EMPTY(&proc_ready_list) ? INT_MIN : \ ((PriNode *)LIST_HEAD(&proc_ready_list))->pri) - #define prio_curr() (current_process->link.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) @@ -81,6 +90,7 @@ extern REGISTER List proc_ready_list; LIST_ENQUEUE_HEAD(&proc_ready_list, &(proc)->link) #else #define prio_next() 0 + #define prio_proc(proc) 0 #define prio_curr() 0 #define SCHED_ENQUEUE_INTERNAL(proc) ADDTAIL(&proc_ready_list, &(proc)->link) @@ -151,6 +161,9 @@ void proc_entry(void); /* Schedule another process *without* adding the current one to the ready list. */ void proc_switch(void); +/* Immediately schedule a particular process bypassing the scheduler. */ +void proc_wakeup(Process *proc); + /* Initialize a scheduler class. */ void proc_schedInit(void); @@ -168,4 +181,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 */