/*! initialize thread structures and create idle thread */ void kthreads_init () { extern kprog_t kprog; int prio, i, j; list_init ( &all_threads ); active_thread = NULL; ksched_init (); /* initially create 'idle thread' */ kernel_proc.proc = NULL; kernel_proc.smap = NULL; /* use kernel pool */ kernel_proc.m.start = NULL; kernel_proc.m.size = (size_t) 0xffffffff; (void) kthread_create ( idle_thread, NULL, 0, SCHED_FIFO, 0, NULL, 0, &kernel_proc ); /* user_proc initialization */ user_proc.prog = &kprog; user_proc.m.size = kprog.m->size; user_proc.m.start = (void *) kprog.prog; user_proc.proc = (void *) kprog.prog; strcpy ( user_proc.name, kprog.prog->name ); user_proc.heap = user_proc.m.start + (uint) user_proc.proc->heap; user_proc.stack = user_proc.m.start + (uint) user_proc.proc->stack; user_proc.heap_size = (uint) user_proc.stack - (uint) user_proc.heap; user_proc.stack_size = (uint) kprog.prog->end - (uint) user_proc.stack; user_proc.thread_stack_size = DEFAULT_THREAD_STACK_SIZE; user_proc.proc->p.heap_size = user_proc.heap_size; user_proc.proc->p.stack_size = user_proc.stack_size; user_proc.proc->p.thread_stack = user_proc.thread_stack_size; /* initialize bitmap for threads stack management */ /* in stack area: kproc->smap_size thread stacks */ user_proc.smap_size = user_proc.stack_size / user_proc.thread_stack_size; ASSERT ( user_proc.smap_size > 0 ); /* required number of uints for mask */ i = ( user_proc.smap_size + sizeof(uint)*8 - 1 ) / (sizeof(uint)*8); user_proc.smap = kmalloc ( i * sizeof (uint) ); memset ( user_proc.smap, 0, i * sizeof (uint) ); for ( j = user_proc.smap_size%(sizeof(uint)*8+1); j < sizeof(uint)*8; j++ ) user_proc.smap[i-1] |= 1<<j; prio = user_proc.proc->p.prio; if ( !prio ) prio = THREAD_DEF_PRIO; kthread_create ( user_proc.proc->p.init, NULL, 0, SCHED_FIFO, prio, NULL, 0, &user_proc ); kthreads_schedule (); }
/*! initialize thread structures and create idle thread */ void kthreads_init () { list_init ( &all_threads ); list_init ( &procs ); active_thread = NULL; ksched_init (); /* initially create 'idle thread' */ kernel_proc.prog = NULL; kernel_proc.stack_pool = NULL; /* use kernel pool */ kernel_proc.m.start = NULL; kernel_proc.m.size = (size_t) 0xffffffff; (void) kthread_create ( idle_thread, NULL, 0, SCHED_FIFO, 0, NULL, NULL, 0, &kernel_proc ); kthreads_schedule (); }
/*! initialize thread structures and create idle thread */ void kthreads_init () { extern kprog_t prog; int prio; list_init ( &all_threads ); active_thread = NULL; ksched_init (); /* initially create 'idle thread' */ kernel_proc.prog = NULL; kernel_proc.stack_pool = NULL; /* use kernel pool */ kernel_proc.m.start = NULL; kernel_proc.m.size = (size_t) 0xffffffff; (void) kthread_create ( idle_thread, NULL, 0, SCHED_FIFO, 0, NULL, NULL, 0, &kernel_proc ); /* user_proc */ user_proc.prog = &prog; user_proc.m.size = prog.m->size; user_proc.m.start = user_proc.pi = prog.pi; /* initialize memory pool for threads stacks */ user_proc.stack_pool = ffs_init ( U2K_GET_ADR ( user_proc.pi->stack, &user_proc ), (size_t) prog.pi->end_adr - (size_t) prog.pi->stack + 1 ); prio = prog.pi->prio; if ( !prio ) prio = THREAD_DEF_PRIO; kthread_create ( user_proc.pi->init, NULL, 0, SCHED_FIFO, prio, NULL, NULL, 0, &user_proc ); kthreads_schedule (); }
/*! initialize thread structures and create idle thread */ void kthreads_init () { int prio; list_init ( &all_threads ); active_thread = NULL; ksched_init (); (void) kthread_create(idle_thread,NULL,0,SCHED_FIFO,0,NULL,NULL,0); /* initialize memory pool for threads */ pi.heap = kmalloc ( PROG_HEAP_SIZE ); pi.heap_size = PROG_HEAP_SIZE; prio = pi.prio; if ( !prio ) prio = THREAD_DEF_PRIO; (void) kthread_create(pi.init,NULL,0,SCHED_FIFO,prio,NULL,NULL,0); kthreads_schedule (); }