X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fkern%2Fproc.c;h=acaf4220a1bdd3527f274762096b648f65ecac20;hb=4cedc580e66cca972b055b9002ccadada6d5da75;hp=18c89599eb689dcce8344ef5be7a9af626f669d2;hpb=e62f2f13f13bca63f05e8ce92c945dcadb0f712f;p=bertos.git diff --git a/bertos/kern/proc.c b/bertos/kern/proc.c index 18c89599..acaf4220 100644 --- a/bertos/kern/proc.c +++ b/bertos/kern/proc.c @@ -85,7 +85,7 @@ static struct Process main_process; /** * Local heap dedicated to allocate the memory used by the processes. */ -static HEAP_DEFINE_BUF(heap_buf, KERN_MINSTACKSIZE * 128); +static HEAP_DEFINE_BUF(heap_buf, CONFIG_KERN_HEAP_SIZE); static Heap proc_heap; /* @@ -139,11 +139,6 @@ void proc_init(void) monitor_init(); monitor_add(current_process, "main"); #endif - -#if CONFIG_KERN_PREEMPT - preempt_init(); -#endif - MOD_INIT(proc); } @@ -425,11 +420,40 @@ void proc_exit(void) ASSERT(0); } - /** - * Get the pointer to the user data of the current process + * Call the scheduler and eventually replace the current running process. */ -iptr_t proc_currentUserData(void) +void proc_schedule(void) { - return current_process->user_data; + Process *old_process = current_process; + + IRQ_ASSERT_DISABLED(); + + /* Poll on the ready queue for the first ready process */ + LIST_ASSERT_VALID(&proc_ready_list); + while (!(current_process = (struct Process *)list_remHead(&proc_ready_list))) + { + /* + * Make sure we physically reenable interrupts here, no matter what + * the current task status is. This is important because if we + * are idle-spinning, we must allow interrupts, otherwise no + * process will ever wake up. + * + * During idle-spinning, an interrupt can occur and it may + * modify \p proc_ready_list. To ensure that compiler reload this + * variable every while cycle we call CPU_MEMORY_BARRIER. + * The memory barrier ensure that all variables used in this context + * are reloaded. + * \todo If there was a way to write sig_wait() so that it does not + * disable interrupts while waiting, there would not be any + * reason to do this. + */ + IRQ_ENABLE; + CPU_IDLE; + MEMORY_BARRIER; + IRQ_DISABLE; + } + proc_switchTo(current_process, old_process); + /* This RET resumes the execution on the new process */ + LOG_INFO("resuming %p:%s\n", current_process, proc_currentName()); }