kstat_t krhino_init(void) { g_sys_stat = RHINO_STOPPED; #if (RHINO_CONFIG_USER_HOOK > 0) krhino_init_hook(); #endif runqueue_init(&g_ready_queue); tick_list_init(); #if (RHINO_CONFIG_SYSTEM_STATS > 0) kobj_list_init(); #endif #if (RHINO_CONFIG_MM_TLF > 0) k_mm_init(); #endif #if (RHINO_CONFIG_KOBJ_DYN_ALLOC > 0) klist_init(&g_res_list); krhino_sem_create(&g_res_sem, "res_sem", 0); dyn_mem_proc_task_start(); #endif #if (RHINO_CONFIG_CPU_NUM > 1) for (uint8_t i = 0; i < RHINO_CONFIG_CPU_NUM; i++) { krhino_task_cpu_create(&g_idle_task[i], "idle_task", NULL, RHINO_IDLE_PRI, 0, &g_idle_task_stack[i][0], RHINO_CONFIG_IDLE_TASK_STACK_SIZE, idle_task, i, 1u); } #else krhino_task_create(&g_idle_task[0], "idle_task", NULL, RHINO_IDLE_PRI, 0, &g_idle_task_stack[0][0], RHINO_CONFIG_IDLE_TASK_STACK_SIZE, idle_task, 1u); #endif #if (RHINO_CONFIG_WORKQUEUE > 0) workqueue_init(); #endif #if (RHINO_CONFIG_TIMER > 0) ktimer_init(); #endif #if (RHINO_CONFIG_CPU_USAGE_STATS > 0) cpu_usage_stats_start(); #endif rhino_stack_check_init(); return RHINO_SUCCESS; }
// set the int 0 timer to trigger a bit more than every ~53ms void setup_timer() { // 1.193182 MHz input clock // divide by 1193 (0x04a9) to get around 1000Hz (~1000.15256 Hz) kdebug("setting int0 timer "); pic_mask_interrupt(INT_TIMER); outb(0x43, 0x34); // 00110100b - chan 0, freq. divider, set lo/hi byte outb(0x40, 0xa9); // Low byte of divider to chan 0 reload value outb(0x40, 0x04); // High byte of divider to chan 0 reload value kdebug("initialising ktimers"); /* Say we call it every 1000 useconds, when we really do every 999.847 useconds) */ ktimer_init(1000); add_handler(INTR_BASE + INT_TIMER, &early_timer_isr); pic_unmask_interrupt(INT_TIMER); }
void ktimer_event_init() { ktable_init(&ktimer_event_table); ktimer_init(); softirq_register(KTE_SOFTIRQ, ktimer_event_handler); }